module Data.Pack.Endianness
( le16Host
, le32Host
, le64Host
, be16Host
, be32Host
, be64Host
) where
import Data.Bits
import Data.Word
#if MIN_VERSION_base(4,7,0)
swap16 :: Word16 -> Word16
swap16 = byteSwap16
swap32 :: Word32 -> Word32
swap32 = byteSwap32
swap64 :: Word64 -> Word64
swap64 = byteSwap64
#else
#if BITS_IS_OLD
shr :: Bits a => a -> Int -> a
shr = shiftR
shl :: Bits a => a -> Int -> a
shl = shiftL
#else
shr :: Bits a => a -> Int -> a
shr = unsafeShiftR
shl :: Bits a => a -> Int -> a
shl = unsafeShiftL
#endif
swap64 :: Word64 -> Word64
swap64 w =
(w `shr` 56) .|. (w `shl` 56)
.|. ((w `shr` 40) .&. 0xff00) .|. ((w .&. 0xff00) `shl` 40)
.|. ((w `shr` 24) .&. 0xff0000) .|. ((w .&. 0xff0000) `shl` 24)
.|. ((w `shr` 8) .&. 0xff000000) .|. ((w .&. 0xff000000) `shl` 8)
swap32 :: Word32 -> Word32
swap32 w =
(w `shr` 24) .|. (w `shl` 24)
.|. ((w `shr` 8) .&. 0xff00) .|. ((w .&. 0xff00) `shl` 8)
swap16 :: Word16 -> Word16
swap16 w = (w `shr` 8) .|. (w `shl` 8)
#endif
#ifdef CPU_BIG_ENDIAN
#define FromBE(bits) id
#define FromLE(bits) swap/**/bits
#else
#define FromBE(bits) swap/**/bits
#define FromLE(bits) id
#endif
be16Host :: Word16 -> Word16
be16Host = FromBE(16)
be32Host :: Word32 -> Word32
be32Host = FromBE(32)
be64Host :: Word64 -> Word64
be64Host = FromBE(64)
le16Host :: Word16 -> Word16
le16Host = FromLE(16)
le32Host :: Word32 -> Word32
le32Host = FromLE(32)
le64Host :: Word64 -> Word64
le64Host = FromLE(64)