{-# LANGUAGE MagicHash #-}
module HsBindgen.Runtime.HasCField (
HasCField(..)
, offset
, fromPtr
, peek
, poke
, readRaw
, writeRaw
) where
import Data.Kind
import Data.Proxy
import Foreign.Ptr
import Foreign.Storable hiding (peek, poke)
import Foreign.Storable qualified
import GHC.Exts (Proxy#, proxy#)
import GHC.TypeLits
import HsBindgen.Runtime.Marshal (ReadRaw, WriteRaw)
import HsBindgen.Runtime.Marshal qualified
class HasCField (a :: Type) (field :: Symbol) where
type CFieldType (a :: Type) (field :: Symbol) :: Type
offset# :: Proxy# a -> Proxy# field -> Int
{-# INLINE offset #-}
offset ::
forall a field. HasCField a field
=> Proxy a
-> Proxy field
-> Int
offset :: forall a (field :: Symbol).
HasCField a field =>
Proxy a -> Proxy field -> Int
offset = \Proxy a
_ Proxy field
_ -> Proxy# a -> Proxy# field -> Int
forall a (field :: Symbol).
HasCField a field =>
Proxy# a -> Proxy# field -> Int
offset# (forall a. Proxy# a
forall {k} (a :: k). Proxy# a
proxy# @a) (forall {k} (a :: k). Proxy# a
forall (a :: Symbol). Proxy# a
proxy# @field)
{-# INLINE fromPtr #-}
fromPtr ::
forall a field. HasCField a field
=> Proxy field
-> Ptr a
-> Ptr (CFieldType a field)
fromPtr :: forall a (field :: Symbol).
HasCField a field =>
Proxy field -> Ptr a -> Ptr (CFieldType a field)
fromPtr Proxy field
_ Ptr a
ptr = Ptr a
ptr Ptr a -> Int -> Ptr (CFieldType a field)
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Proxy# a -> Proxy# field -> Int
forall a (field :: Symbol).
HasCField a field =>
Proxy# a -> Proxy# field -> Int
offset# (forall a. Proxy# a
forall {k} (a :: k). Proxy# a
proxy# @a) (forall {k} (a :: k). Proxy# a
forall (a :: Symbol). Proxy# a
proxy# @field)
{-# INLINE peek #-}
peek ::
(HasCField a field, Storable (CFieldType a field))
=> Proxy field
-> Ptr a
-> IO (CFieldType a field)
peek :: forall a (field :: Symbol).
(HasCField a field, Storable (CFieldType a field)) =>
Proxy field -> Ptr a -> IO (CFieldType a field)
peek Proxy field
field Ptr a
ptr = Ptr (CFieldType a field) -> IO (CFieldType a field)
forall a. Storable a => Ptr a -> IO a
Foreign.Storable.peek (Proxy field -> Ptr a -> Ptr (CFieldType a field)
forall a (field :: Symbol).
HasCField a field =>
Proxy field -> Ptr a -> Ptr (CFieldType a field)
fromPtr Proxy field
field Ptr a
ptr)
{-# INLINE poke #-}
poke ::
(HasCField a field, Storable (CFieldType a field))
=> Proxy field
-> Ptr a
-> CFieldType a field
-> IO ()
poke :: forall a (field :: Symbol).
(HasCField a field, Storable (CFieldType a field)) =>
Proxy field -> Ptr a -> CFieldType a field -> IO ()
poke Proxy field
field Ptr a
ptr CFieldType a field
val = Ptr (CFieldType a field) -> CFieldType a field -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
Foreign.Storable.poke (Proxy field -> Ptr a -> Ptr (CFieldType a field)
forall a (field :: Symbol).
HasCField a field =>
Proxy field -> Ptr a -> Ptr (CFieldType a field)
fromPtr Proxy field
field Ptr a
ptr) CFieldType a field
val
{-# INLINE readRaw #-}
readRaw ::
(HasCField a field, ReadRaw (CFieldType a field))
=> Proxy field
-> Ptr a
-> IO (CFieldType a field)
readRaw :: forall a (field :: Symbol).
(HasCField a field, ReadRaw (CFieldType a field)) =>
Proxy field -> Ptr a -> IO (CFieldType a field)
readRaw Proxy field
field Ptr a
ptr = Ptr (CFieldType a field) -> IO (CFieldType a field)
forall a. ReadRaw a => Ptr a -> IO a
HsBindgen.Runtime.Marshal.readRaw (Proxy field -> Ptr a -> Ptr (CFieldType a field)
forall a (field :: Symbol).
HasCField a field =>
Proxy field -> Ptr a -> Ptr (CFieldType a field)
fromPtr Proxy field
field Ptr a
ptr)
{-# INLINE writeRaw #-}
writeRaw ::
(HasCField a field, WriteRaw (CFieldType a field))
=> Proxy field
-> Ptr a
-> CFieldType a field
-> IO ()
writeRaw :: forall a (field :: Symbol).
(HasCField a field, WriteRaw (CFieldType a field)) =>
Proxy field -> Ptr a -> CFieldType a field -> IO ()
writeRaw Proxy field
field Ptr a
ptr = Ptr (CFieldType a field) -> CFieldType a field -> IO ()
forall a. WriteRaw a => Ptr a -> a -> IO ()
HsBindgen.Runtime.Marshal.writeRaw (Proxy field -> Ptr a -> Ptr (CFieldType a field)
forall a (field :: Symbol).
HasCField a field =>
Proxy field -> Ptr a -> Ptr (CFieldType a field)
fromPtr Proxy field
field Ptr a
ptr)