module Foundation.Class.Storable
( Storable(..)
, StorableFixed(..)
, Ptr, plusPtr, castPtr
, peekOff, pokeOff
) where
import GHC.Types (Double, Float)
import Foreign.Ptr (castPtr)
import qualified Foreign.Ptr
import Foundation.Internal.Base
import Foundation.Internal.Types
import Foundation.Internal.Proxy
import Foundation.Primitive.Types
import Foundation.Numerical
toProxy :: proxy ty -> Proxy ty
toProxy _ = Proxy
class Storable a where
peek :: Ptr a -> IO a
poke :: Ptr a -> a -> IO ()
class Storable a => StorableFixed a where
size :: proxy a -> Size Word8
alignment :: proxy a -> Size Word8
plusPtr :: StorableFixed a => Ptr a -> Size a -> Ptr a
plusPtr ptr (Size num) = ptr `Foreign.Ptr.plusPtr` (num * (size ptr `align` alignment ptr))
where
align (Size sz) (Size a) = sz + (sz `mod` a)
peekOff :: StorableFixed a => Ptr a -> Offset a -> IO a
peekOff ptr off = peek (ptr `plusPtr` offsetAsSize off)
pokeOff :: StorableFixed a => Ptr a -> Offset a -> a -> IO ()
pokeOff ptr off = poke (ptr `plusPtr` offsetAsSize off)
instance Storable Char where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Double where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Float where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Int8 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Int16 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Int32 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Int64 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Word8 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Word16 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Word32 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance Storable Word64 where
peek (Ptr addr) = primAddrRead addr (Offset 0)
poke (Ptr addr) = primAddrWrite addr (Offset 0)
instance StorableFixed Char where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Double where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Float where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Int8 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Int16 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Int32 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Int64 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Word8 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Word16 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Word32 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy
instance StorableFixed Word64 where
size = primSizeInBytes . toProxy
alignment = primSizeInBytes . toProxy