X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=include%2FCTypes.h;h=f74d9f0f13fd1cac8c1e34085290778384248ef5;hb=80b485a2eab908795d23cb09c5cc4339d539b2ea;hp=9827d9dbb09e18669d068ca2fc0746a91eb93b9a;hpb=260e7f2ed9a43c6ecf5a556d77817f39ed2893ab;p=ghc-base.git diff --git a/include/CTypes.h b/include/CTypes.h index 9827d9d..f74d9f0 100644 --- a/include/CTypes.h +++ b/include/CTypes.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: CTypes.h,v 1.2 2001/12/21 15:07:26 simonmar Exp $ + * $Id: CTypes.h,v 1.7 2003/07/24 12:05:42 panne Exp $ * * Dirty CPP hackery for CTypes/CTypesISO * @@ -18,10 +18,11 @@ #define NUMERIC_TYPE(T,C,S,B) \ newtype T = T B deriving (Eq, Ord) ; \ INSTANCE_NUM(T) ; \ -INSTANCE_READ(T) ; \ -INSTANCE_SHOW(T) ; \ +INSTANCE_READ(T,B) ; \ +INSTANCE_SHOW(T,B) ; \ INSTANCE_ENUM(T) ; \ -INSTANCE_TYPEABLE(T,C,S) ; +INSTANCE_STORABLE(T) ; \ +INSTANCE_TYPEABLE0(T,C,S) ; #define INTEGRAL_TYPE(T,C,S,B) \ NUMERIC_TYPE(T,C,S,B) ; \ @@ -38,11 +39,15 @@ INSTANCE_FLOATING(T) ; \ INSTANCE_REALFRAC(T) ; \ INSTANCE_REALFLOAT(T) -#define INSTANCE_READ(T) \ +#ifndef __GLASGOW_HASKELL__ +#define fakeMap map +#endif + +#define INSTANCE_READ(T,B) \ instance Read T where { \ readsPrec p s = fakeMap (\(x, t) -> (T x, t)) (readsPrec p s) } -#define INSTANCE_SHOW(T) \ +#define INSTANCE_SHOW(T,B) \ instance Show T where { \ showsPrec p (T x) = showsPrec p x } @@ -56,12 +61,6 @@ instance Num T where { \ signum (T i) = T (signum i) ; \ fromInteger x = T (fromInteger x) } -#define INSTANCE_TYPEABLE(T,C,S) \ -C :: TyCon ; \ -C = mkTyCon S ; \ -instance Typeable T where { \ - typeOf _ = mkAppTy C [] } - #define INSTANCE_BOUNDED(T) \ instance Bounded T where { \ minBound = T minBound ; \ @@ -160,30 +159,40 @@ instance RealFloat T where { \ isIEEE (T x) = isIEEE x ; \ (T x) `atan2` (T y) = T (x `atan2` y) } +#define INSTANCE_STORABLE(T) \ +instance Storable T where { \ + sizeOf (T x) = sizeOf x ; \ + alignment (T x) = alignment x ; \ + peekElemOff a i = liftM T (peekElemOff (castPtr a) i) ; \ + pokeElemOff a i (T x) = pokeElemOff (castPtr a) i x } + #else /* __GLASGOW_HASKELL__ */ /* GHC can derive any class for a newtype, so we make use of that * here... */ -#define NUMERIC_CLASSES Eq,Ord,Num,Enum +#define NUMERIC_CLASSES Eq,Ord,Num,Enum,Storable #define INTEGRAL_CLASSES Bounded,Real,Integral,Bits #define FLOATING_CLASSES Real,Fractional,Floating,RealFrac,RealFloat #define NUMERIC_TYPE(T,C,S,B) \ newtype T = T B deriving (NUMERIC_CLASSES); \ INSTANCE_READ(T,B); \ -INSTANCE_SHOW(T,B) +INSTANCE_SHOW(T,B); \ +INSTANCE_TYPEABLE0(T,C,S) ; #define INTEGRAL_TYPE(T,C,S,B) \ newtype T = T B deriving (NUMERIC_CLASSES, INTEGRAL_CLASSES); \ INSTANCE_READ(T,B); \ -INSTANCE_SHOW(T,B) +INSTANCE_SHOW(T,B); \ +INSTANCE_TYPEABLE0(T,C,S) ; #define FLOATING_TYPE(T,C,S,B) \ newtype T = T B deriving (NUMERIC_CLASSES, FLOATING_CLASSES); \ INSTANCE_READ(T,B); \ -INSTANCE_SHOW(T,B) +INSTANCE_SHOW(T,B); \ +INSTANCE_TYPEABLE0(T,C,S) ; #define INSTANCE_READ(T,B) \ instance Read T where { \