module Bind.Marshal.StdLib.Ser where
import Bind.Marshal.Prelude
import Bind.Marshal.SerAction.Base
import Bind.Marshal.SerAction.Static
import Bind.Marshal.SerAction.Storable
import Bind.Marshal.StdLib.Types
import Data.Bits ( (.&.), shiftR )
import GHC.Prim
import GHC.Types
import GHC.Word
instance CanSerialize Int32 where
serialize = serialize_storable
instance CanSerialize Word8 where
serialize = serialize_storable
instance CanSerialize Word16 where
serialize = serialize_storable
instance CanSerialize Word32 where
serialize = serialize_storable
ser_word16_be :: Word16 -> StaticSerAction D2 ()
ser_word16_be !w = do
case (w .&. 0xFF00) `shiftR` 8 of
!w_high -> ser ( toEnum $! fromEnum w_high :: Word8)
case w .&. 0x00FF of
!w_low -> ser ( toEnum $! fromEnum w_low :: Word8)
shiftr_w32 :: Word32 -> Int -> Word32
shiftr_w32 (W32# w) (I# i) = W32# (w `uncheckedShiftRL#` i)
ser_word32_be :: Word32 -> StaticSerAction D4 ()
ser_word32_be !w = do
case fromIntegral $! shiftr_w32 w 24 of
!(w_0 :: Word8) -> ser w_0
case fromIntegral $! shiftr_w32 w 16 of
!(w_1 :: Word8) -> ser w_1
case fromIntegral $! shiftr_w32 w 8 of
!(w_2 :: Word8) -> ser w_2
case fromIntegral w of
!(w_3 :: Word8) -> ser w_3