bind-marshal-0.1: src/Bind/Marshal/StdLib/Ser.hs
-- Copyright : (C) 2009 Corey O'Connor
-- License : BSD-style (see the file LICENSE)
{-# LANGUAGE MagicHash #-}
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
{-# INLINE serialize #-}
serialize = serialize_storable
instance CanSerialize Word8 where
{-# INLINE serialize #-}
serialize = serialize_storable
instance CanSerialize Word16 where
{-# INLINE serialize #-}
serialize = serialize_storable
instance CanSerialize Word32 where
{-# INLINE serialize #-}
serialize = serialize_storable
{-# INLINE ser_word16_be #-}
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)
{-# INLINE shiftr_w32 #-}
shiftr_w32 :: Word32 -> Int -> Word32
shiftr_w32 (W32# w) (I# i) = W32# (w `uncheckedShiftRL#` i)
{-# INLINE ser_word32_be #-}
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