shimmer-0.1.2: SMR/Core/Codec/Word.hs
{-# LANGUAGE CPP, ForeignFunctionInterface #-}
module SMR.Core.Codec.Word
( fromBE64, fromLE64
, fromBE32, fromLE32
, fromBE16, fromLE16
, toBE64, toLE64
, toBE32, toLE32
, toBE16, toLE16)
where
import Data.Word as Word
#include "MachDeps.h"
data Endian
= Big | Little
deriving Eq
-- | Get the endianness from the GHC header file.
-- We do this via a filty #include so that the information
-- is statically visible to the GHC simplifier.
systemEndian :: Endian
#ifdef WORDS_BIGENDIAN
systemEndian = Big
#else
systemEndian = Little
#endif
-- | Convert from a big endian 64 bit value to the cpu endianness.
fromBE64 :: Word64 -> Word64
fromBE64 = if systemEndian == Big then id else Word.byteSwap64
{-# INLINE fromBE64 #-}
-- | Convert from a little endian 64 bit value to the cpu endianness.
fromLE64 :: Word64 -> Word64
fromLE64 = if systemEndian == Little then id else Word.byteSwap64
{-# INLINE fromLE64 #-}
-- | Convert from a big endian 32 bit value to the cpu endianness.
fromBE32 :: Word32 -> Word32
fromBE32 = if systemEndian == Big then id else Word.byteSwap32
{-# INLINE fromBE32 #-}
-- | Convert from a little endian 32 bit value to the cpu endianness.
fromLE32 :: Word32 -> Word32
fromLE32 = if systemEndian == Little then id else Word.byteSwap32
{-# INLINE fromLE32 #-}
-- | Convert from a big endian 16 bit value to the cpu endianness.
fromBE16 :: Word16 -> Word16
fromBE16 = if systemEndian == Big then id else Word.byteSwap16
{-# INLINE fromBE16 #-}
-- | Convert from a little endian 16 bit value to the cpu endianness.
fromLE16 :: Word16 -> Word16
fromLE16 = if systemEndian == Little then id else Word.byteSwap16
{-# INLINE fromLE16 #-}
-- | Convert a 64 bit value in cpu endianess to big endian
toBE64 :: Word64 -> Word64
toBE64 = fromBE64
{-# INLINE toBE64 #-}
-- | Convert a 64 bit value in cpu endianess to little endian
toLE64 :: Word64 -> Word64
toLE64 = fromLE64
{-# INLINE toLE64 #-}
-- | Convert a 32 bit value in cpu endianess to big endian
toBE32 :: Word32 -> Word32
toBE32 = fromBE32
{-# INLINE toBE32 #-}
-- | Convert a 32 bit value in cpu endianess to little endian
toLE32 :: Word32 -> Word32
toLE32 = fromLE32
{-# INLINE toLE32 #-}
-- | Convert a 16 bit value in cpu endianness to big endian
toBE16 :: Word16 -> Word16
toBE16 = fromBE16
{-# INLINE toBE16 #-}
-- | Convert a 16 bit value in cpu endianness to little endian
toLE16 :: Word16 -> Word16
toLE16 = fromLE16
{-# INLINE toLE16 #-}