X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=include%2FCTypes.h;h=3ca9f1c6adf1a49183a7b67ffd6e1ff056b2509b;hb=7dbb606d7b57cdad87a0ffbdb6ea4a274ebca7c0;hp=25b9ad8c5a715fa7f275c6472069226bcfdb1b7f;hpb=af4cc4743c0c26d43bed44cfbd72e2d18673c613;p=ghc-base.git diff --git a/include/CTypes.h b/include/CTypes.h index 25b9ad8..3ca9f1c 100644 --- a/include/CTypes.h +++ b/include/CTypes.h @@ -1,39 +1,42 @@ -/* ----------------------------------------------------------------------------- - * $Id: CTypes.h,v 1.5 2002/09/04 16:05:29 simonmar Exp $ - * - * Dirty CPP hackery for CTypes/CTypesISO - * - * (c) The FFI task force, 2000 - * -------------------------------------------------------------------------- */ +{- -------------------------------------------------------------------------- +// Dirty CPP hackery for CTypes/CTypesISO +// +// (c) The FFI task force, 2000 +// -------------------------------------------------------------------------- +-} -#include "MachDeps.h" +#ifndef CTYPES__H +#define CTYPES__H -/* As long as there is no automatic derivation of classes for newtypes we resort - to extremely dirty cpp-hackery. :-P Some care has to be taken when the - macros below are modified, otherwise the layout rule will bite you. */ +#include "Typeable.h" -/* A hacked version for GHC follows the Haskell 98 version... */ +{- +// As long as there is no automatic derivation of classes for newtypes we resort +// to extremely dirty cpp-hackery. :-P Some care has to be taken when the +// macros below are modified, otherwise the layout rule will bite you. +-} + +-- // A hacked version for GHC follows the Haskell 98 version... #ifndef __GLASGOW_HASKELL__ -#define NUMERIC_TYPE(T,C,S,B) \ +#define ARITHMETIC_TYPE(T,C,S,B) \ newtype T = T B deriving (Eq, Ord) ; \ INSTANCE_NUM(T) ; \ -INSTANCE_READ(T) ; \ -INSTANCE_SHOW(T) ; \ +INSTANCE_REAL(T) ; \ +INSTANCE_READ(T,B) ; \ +INSTANCE_SHOW(T,B) ; \ INSTANCE_ENUM(T) ; \ -INSTANCE_STORABLE(T) : \ +INSTANCE_STORABLE(T) ; \ INSTANCE_TYPEABLE0(T,C,S) ; #define INTEGRAL_TYPE(T,C,S,B) \ -NUMERIC_TYPE(T,C,S,B) ; \ +ARITHMETIC_TYPE(T,C,S,B) ; \ INSTANCE_BOUNDED(T) ; \ -INSTANCE_REAL(T) ; \ INSTANCE_INTEGRAL(T) ; \ INSTANCE_BITS(T) #define FLOATING_TYPE(T,C,S,B) \ -NUMERIC_TYPE(T,C,S,B) ; \ -INSTANCE_REAL(T) ; \ +ARITHMETIC_TYPE(T,C,S,B) ; \ INSTANCE_FRACTIONAL(T) ; \ INSTANCE_FLOATING(T) ; \ INSTANCE_REALFRAC(T) ; \ @@ -43,11 +46,11 @@ INSTANCE_REALFLOAT(T) #define fakeMap map #endif -#define INSTANCE_READ(T) \ +#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 } @@ -111,7 +114,7 @@ instance Bits T where { \ instance Fractional T where { \ (T x) / (T y) = T (x / y) ; \ recip (T x) = T (recip x) ; \ - fromRational r = T (fromRational r) } + fromRational r = T (fromRational r) } #define INSTANCE_FLOATING(T) \ instance Floating T where { \ @@ -168,41 +171,41 @@ instance Storable T where { \ #else /* __GLASGOW_HASKELL__ */ -/* GHC can derive any class for a newtype, so we make use of that - * here... - */ +-- // GHC can derive any class for a newtype, so we make use of that here... -#define NUMERIC_CLASSES Eq,Ord,Num,Enum,Storable -#define INTEGRAL_CLASSES Bounded,Real,Integral,Bits -#define FLOATING_CLASSES Real,Fractional,Floating,RealFrac,RealFloat +#define ARITHMETIC_CLASSES Eq,Ord,Num,Enum,Storable,Real +#define INTEGRAL_CLASSES Bounded,Integral,Bits +#define FLOATING_CLASSES Fractional,Floating,RealFrac,RealFloat -#define NUMERIC_TYPE(T,C,S,B) \ -newtype T = T B deriving (NUMERIC_CLASSES); \ +#define ARITHMETIC_TYPE(T,C,S,B) \ +newtype T = T B deriving (ARITHMETIC_CLASSES); \ INSTANCE_READ(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); \ +newtype T = T B deriving (ARITHMETIC_CLASSES, INTEGRAL_CLASSES); \ INSTANCE_READ(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); \ +newtype T = T B deriving (ARITHMETIC_CLASSES, FLOATING_CLASSES); \ INSTANCE_READ(T,B); \ INSTANCE_SHOW(T,B); \ INSTANCE_TYPEABLE0(T,C,S) ; #define INSTANCE_READ(T,B) \ instance Read T where { \ - readsPrec = unsafeCoerce# (readsPrec :: Int -> ReadS B); \ - readList = unsafeCoerce# (readList :: ReadS [B]); } + readsPrec = unsafeCoerce# (readsPrec :: Int -> ReadS B); \ + readList = unsafeCoerce# (readList :: ReadS [B]); } #define INSTANCE_SHOW(T,B) \ instance Show T where { \ - showsPrec = unsafeCoerce# (showsPrec :: Int -> B -> ShowS); \ - show = unsafeCoerce# (show :: B -> String); \ - showList = unsafeCoerce# (showList :: [B] -> ShowS); } + showsPrec = unsafeCoerce# (showsPrec :: Int -> B -> ShowS); \ + show = unsafeCoerce# (show :: B -> String); \ + showList = unsafeCoerce# (showList :: [B] -> ShowS); } #endif /* __GLASGOW_HASKELL__ */ + +#endif