{-# LANGUAGE MagicHash #-}
module HsBindgen.Runtime.HasCBitfield (
HasCBitfield(..)
, offset
, width
, toPtr
, peek
, poke
) where
import Data.Kind
import Data.Proxy
import Foreign.Ptr
import GHC.Exts (Proxy#, proxy#)
import GHC.TypeLits
import HsBindgen.Runtime.BitfieldPtr (BitfieldPtr (BitfieldPtr))
import HsBindgen.Runtime.BitfieldPtr qualified as BitfieldPtr
import HsBindgen.Runtime.Internal.Bitfield (Bitfield)
class HasCBitfield (a :: Type) (field :: Symbol) where
type CBitfieldType (a :: Type) (field :: Symbol) :: Type
bitfieldOffset# :: Proxy# a -> Proxy# field -> Int
bitfieldWidth# :: Proxy# a -> Proxy# field -> Int
{-# INLINE offset #-}
offset ::
forall a field. HasCBitfield a field
=> Proxy a
-> Proxy field
-> Int
offset :: forall a (field :: Symbol).
HasCBitfield a field =>
Proxy a -> Proxy field -> Int
offset = \Proxy a
_ Proxy field
_ -> Proxy# a -> Proxy# field -> Int
forall a (field :: Symbol).
HasCBitfield a field =>
Proxy# a -> Proxy# field -> Int
bitfieldOffset# (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 width #-}
width ::
forall a field. HasCBitfield a field
=> Proxy a
-> Proxy field
-> Int
width :: forall a (field :: Symbol).
HasCBitfield a field =>
Proxy a -> Proxy field -> Int
width = \Proxy a
_ Proxy field
_ -> Proxy# a -> Proxy# field -> Int
forall a (field :: Symbol).
HasCBitfield a field =>
Proxy# a -> Proxy# field -> Int
bitfieldWidth# (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 toPtr #-}
toPtr ::
forall a field. HasCBitfield a field
=> Proxy field
-> Ptr a
-> BitfieldPtr (CBitfieldType a field)
toPtr :: forall a (field :: Symbol).
HasCBitfield a field =>
Proxy field -> Ptr a -> BitfieldPtr (CBitfieldType a field)
toPtr Proxy field
_ Ptr a
ptr = Ptr (CBitfieldType a field)
-> Int -> Int -> BitfieldPtr (CBitfieldType a field)
forall a. Ptr a -> Int -> Int -> BitfieldPtr a
BitfieldPtr (Ptr a -> Ptr (CBitfieldType a field)
forall a b. Ptr a -> Ptr b
castPtr Ptr a
ptr) Int
o Int
w
where
o :: Int
o = Proxy# a -> Proxy# field -> Int
forall a (field :: Symbol).
HasCBitfield a field =>
Proxy# a -> Proxy# field -> Int
bitfieldOffset# (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)
w :: Int
w = Proxy# a -> Proxy# field -> Int
forall a (field :: Symbol).
HasCBitfield a field =>
Proxy# a -> Proxy# field -> Int
bitfieldWidth# (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 ::
forall a field. (
HasCBitfield a field
, Bitfield (CBitfieldType a field)
)
=> Proxy field
-> Ptr a
-> IO (CBitfieldType a field)
peek :: forall a (field :: Symbol).
(HasCBitfield a field, Bitfield (CBitfieldType a field)) =>
Proxy field -> Ptr a -> IO (CBitfieldType a field)
peek Proxy field
field Ptr a
ptr = BitfieldPtr (CBitfieldType a field) -> IO (CBitfieldType a field)
forall a. Bitfield a => BitfieldPtr a -> IO a
BitfieldPtr.peek (Proxy field -> Ptr a -> BitfieldPtr (CBitfieldType a field)
forall a (field :: Symbol).
HasCBitfield a field =>
Proxy field -> Ptr a -> BitfieldPtr (CBitfieldType a field)
toPtr Proxy field
field Ptr a
ptr)
{-# INLINE poke #-}
poke ::
forall a field. (
HasCBitfield a field
, Bitfield (CBitfieldType a field)
)
=> Proxy field
-> Ptr a
-> CBitfieldType a field
-> IO ()
poke :: forall a (field :: Symbol).
(HasCBitfield a field, Bitfield (CBitfieldType a field)) =>
Proxy field -> Ptr a -> CBitfieldType a field -> IO ()
poke Proxy field
field Ptr a
ptr CBitfieldType a field
val = BitfieldPtr (CBitfieldType a field)
-> CBitfieldType a field -> IO ()
forall a. Bitfield a => BitfieldPtr a -> a -> IO ()
BitfieldPtr.poke (Proxy field -> Ptr a -> BitfieldPtr (CBitfieldType a field)
forall a (field :: Symbol).
HasCBitfield a field =>
Proxy field -> Ptr a -> BitfieldPtr (CBitfieldType a field)
toPtr Proxy field
field Ptr a
ptr) CBitfieldType a field
val