capnp-0.2.0.0: lib/Data/Capnp/GenHelpers.hs
{- |
Module: Data.Capnp.GenHelpers
Description: Misc. helpers for generated code.
This module provides various helpers used by generated code; developers
are not expected to invoke them directly.
These helpers are used by the low-level api. "Data.Capnp.GenHelpers.Pure"
defines helpers used by high-level api.
-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Capnp.GenHelpers where
import Data.Bits
import Data.Word
import Data.Capnp.Bits
import qualified Data.Capnp.Classes as C
import qualified Data.Capnp.Message as M
import qualified Data.Capnp.Untyped as U
-- | @'getWordField' struct index offset def@ fetches a field from the
-- struct's data section. @index@ is the index of the 64-bit word in the data
-- section in which the field resides. @offset@ is the offset in bits from the
-- start of that word to the field. @def@ is the default value for this field.
getWordField :: (U.ReadCtx m msg, C.IsWord a) => U.Struct msg -> Int -> Int -> Word64 -> m a
getWordField struct idx offset def = fmap
( C.fromWord
. xor def
. (`shiftR` offset)
)
(U.getData idx struct)
-- | @'setWordField' struct value index offset def@ sets a field in the
-- struct's data section. The meaning of the parameters are as in
-- 'getWordField', with @value@ being the value to set. The width of the
-- value is inferred from its type.
setWordField ::
( U.RWCtx m s
, Bounded a, Integral a, C.IsWord a, Bits a
)
=> U.Struct (M.MutMsg s) -> a -> Int -> Int -> a -> m ()
setWordField struct value idx offset def = do
old <- U.getData idx struct
let new = replaceBits (value `xor` def) old offset
U.setData new idx struct