Foreign/C/Types.hs

    {-# LANGUAGE CPP, PackageImports #-}
    #if __GLASGOW_HASKELL__ >= 701
    {-# LANGUAGE Safe #-}
    #endif

    module Foreign.C.Types
            ( -- * Representations of C types
              -- $ctypes

              -- ** Integral types
              -- | These types are are represented as @newtype@s of
              -- types in "Data.Int" and "Data.Word", and are instances of
              -- 'Prelude.Eq', 'Prelude.Ord', 'Prelude.Num', 'Prelude.Read',
              -- 'Prelude.Show', 'Prelude.Enum', 'Storable',
              -- 'Prelude.Bounded', 'Prelude.Real', 'Prelude.Integral' and
              -- 'Bits'.
              CChar,  CSChar,  CUChar
            , CShort, CUShort, CInt,   CUInt
            , CLong,  CULong
            , CPtrdiff, CSize, CWchar, CSigAtomic
            , CLLong, CULLong
            , CIntPtr, CUIntPtr
            , CIntMax, CUIntMax

              -- ** Numeric types
              -- | These types are are represented as @newtype@s of basic
              -- foreign types, and are instances of
              -- 'Prelude.Eq', 'Prelude.Ord', 'Prelude.Num', 'Prelude.Read',
              -- 'Prelude.Show', 'Prelude.Enum' and 'Storable'.
            , CClock,   CTime

              -- ** Floating types
              -- | These types are are represented as @newtype@s of
              -- 'Prelude.Float' and 'Prelude.Double', and are instances of
              -- 'Prelude.Eq', 'Prelude.Ord', 'Prelude.Num', 'Prelude.Read',
              -- 'Prelude.Show', 'Prelude.Enum', 'Storable',
              -- 'Prelude.Real', 'Prelude.Fractional', 'Prelude.Floating',
              -- 'Prelude.RealFrac' and 'Prelude.RealFloat'.
            , CFloat,  CDouble
    -- GHC doesn't support CLDouble yet
    #ifdef HASKELL_REPORT
            , CLDouble
    #endif
              -- ** Other types

              -- Instances of: Eq and Storable
            , CFile,        CFpos,     CJmpBuf

      ) where
    import "base" Foreign.C.Types

    {- $ctypes

    These types are needed to accurately represent C function prototypes,
    in order to access C library interfaces in Haskell.  The Haskell system
    is not required to represent those types exactly as C does, but the
    following guarantees are provided concerning a Haskell type @CT@
    representing a C type @t@:

    * If a C function prototype has @t@ as an argument or result type, the
      use of @CT@ in the corresponding position in a foreign declaration
      permits the Haskell program to access the full range of values encoded
      by the C type; and conversely, any Haskell value for @CT@ has a valid
      representation in C.

    * @'sizeOf' ('Prelude.undefined' :: CT)@ will yield the same value as
      @sizeof (t)@ in C.

    * @'alignment' ('Prelude.undefined' :: CT)@ matches the alignment
      constraint enforced by the C implementation for @t@.

    * The members 'peek' and 'poke' of the 'Storable' class map all values
      of @CT@ to the corresponding value of @t@ and vice versa.

    * When an instance of 'Prelude.Bounded' is defined for @CT@, the values
      of 'Prelude.minBound' and 'Prelude.maxBound' coincide with @t_MIN@
      and @t_MAX@ in C.

    * When an instance of 'Prelude.Eq' or 'Prelude.Ord' is defined for @CT@,
      the predicates defined by the type class implement the same relation
      as the corresponding predicate in C on @t@.

    * When an instance of 'Prelude.Num', 'Prelude.Read', 'Prelude.Integral',
      'Prelude.Fractional', 'Prelude.Floating', 'Prelude.RealFrac', or
      'Prelude.RealFloat' is defined for @CT@, the arithmetic operations
      defined by the type class implement the same function as the
      corresponding arithmetic operations (if available) in C on @t@.

    * When an instance of 'Bits' is defined for @CT@, the bitwise operation
      defined by the type class implement the same function as the
      corresponding bitwise operation in C on @t@.

    -}