/* -----------------------------------------------------------------------------
- * $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
*
#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) ; \
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 }
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 ; \
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 { \