module Data.Array.SysArray
( SysArray
, mkSysArray
, peekSysArrayElem
, pokeSysArrayElem
, sysArraySize
, sysArrayIsReadOnly
, ptrFromSysArray
) where
import Foreign
import Foreign.C()
data SysArray e = SysArray Word32 !(Ptr e) Bool
deriving (Eq,Show)
mkSysArray :: Word32 -> Ptr elt -> Bool -> SysArray elt
mkSysArray u p ro = SysArray u p ro
validSysArrayNdx :: (Storable e) => SysArray e -> Word32 -> Bool
validSysArrayNdx (SysArray u _ _) ndx = 0 <= ndx && ndx < u
ptrFromSysArray :: (Storable e) => SysArray e -> Ptr e
ptrFromSysArray (SysArray _ ptr _) = ptr
sysArraySize :: SysArray e -> Word32
sysArraySize (SysArray s _ _) = s
sysArrayIsReadOnly :: SysArray e -> Bool
sysArrayIsReadOnly (SysArray _ _ ro) = ro
pokeSysArrayElem :: (Storable e) => SysArray e -> Word32 -> e -> IO ()
pokeSysArrayElem sarr ndx v
| (not isRO && validSysArrayNdx sarr ndx) =
pokeElemOff ptr (fromIntegral ndx) v
| otherwise =
fail ("pokeSysArrayElem: illegal op/index " ++ show (ndx,isRO,(0::Integer,sysArraySize sarr)))
where isRO = sysArrayIsReadOnly sarr
ptr = ptrFromSysArray sarr
peekSysArrayElem :: (Storable e) => SysArray e -> Word32 -> IO e
peekSysArrayElem sarr ndx
| validSysArrayNdx sarr ndx = peekElemOff (ptrFromSysArray sarr) (fromIntegral ndx)
| otherwise = fail ("peekSysArrayElem: index out of bounds " ++ show (ndx,(0::Integer,sysArraySize sarr)))