{- Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. This source code is licensed under the BSD-style license found in the LICENSE file in the root directory of this source tree. -} {-# LANGUAGE DefaultSignatures #-} module Foreign.CPP.Addressable ( Addressable(..) , Addressable1(..) ) where import Data.Complex (Complex) import Data.Ratio (Ratio) import Data.Functor.Const (Const) import Data.Functor.Identity (Identity) import Foreign hiding (sizeOf, alignment) import Foreign.C.Types import qualified Foreign.Storable as Storable import GHC.Fingerprint (Fingerprint) import System.Posix.Types class Addressable a where -- | Computes the storage requirements (in bytes) of the argument. -- The value of the argument is not used. sizeOf :: a -> Int default sizeOf :: Storable a => a -> Int sizeOf = Storable.sizeOf -- | Computes the alignment constraint of the argument. An alignment -- constraint @x@ is fulfilled by any address divisible by @x@. -- The value of the argument is not used. alignment :: a -> Int default alignment :: Storable a => a -> Int alignment = Storable.alignment class Addressable1 f where sizeOf1 :: f a -> Int alignment1 :: f a -> Int instance Addressable Bool instance Addressable Char instance Addressable Double instance Addressable Float instance Addressable Int instance Addressable Int8 instance Addressable Int16 instance Addressable Int32 instance Addressable Int64 instance Addressable Word instance Addressable Word8 instance Addressable Word16 instance Addressable Word32 instance Addressable Word64 instance Addressable () instance Addressable Fingerprint instance Addressable CUIntMax instance Addressable CIntMax instance Addressable CUIntPtr instance Addressable CIntPtr instance Addressable CSUSeconds instance Addressable CUSeconds instance Addressable CTime instance Addressable CClock instance Addressable CSigAtomic instance Addressable CWchar instance Addressable CSize instance Addressable CPtrdiff instance Addressable CDouble instance Addressable CFloat instance Addressable CULLong instance Addressable CLLong instance Addressable CULong instance Addressable CLong instance Addressable CUInt instance Addressable CInt instance Addressable CUShort instance Addressable CShort instance Addressable CUChar instance Addressable CSChar instance Addressable CChar instance Addressable CBool instance Addressable IntPtr instance Addressable WordPtr instance Addressable Fd instance Addressable CRLim instance Addressable CTcflag instance Addressable CSpeed instance Addressable CCc instance Addressable CUid instance Addressable CNlink instance Addressable CGid instance Addressable CSsize instance Addressable CPid instance Addressable COff instance Addressable CMode instance Addressable CIno instance Addressable CDev instance (Storable a, Integral a) => Addressable (Ratio a) instance Addressable (StablePtr a) instance Addressable (Ptr a) instance Addressable (FunPtr a) instance Storable a => Addressable (Complex a) instance Storable a => Addressable (Identity a) instance Storable a => Addressable (Const a b)