-- 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