lsm-tree-1.0.0.0: src-core/Database/LSMTree/Internal/Primitive.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
{-# OPTIONS_HADDOCK not-home #-}
-- | Primitive operations lifted into boxed types
module Database.LSMTree.Internal.Primitive (
-- * Byte swaps
byteSwapInt16
, byteSwapInt32
, byteSwapInt64
, byteSwapInt
, byteSwapWord16
, byteSwapWord32
, byteSwapWord64
, byteSwapWord
-- * Indexing byte arrays
, indexInt8Array
, indexWord8ArrayAsInt16
, indexWord8ArrayAsInt32
, indexWord8ArrayAsInt64
, indexWord8ArrayAsInt
, indexWord8Array
, indexWord8ArrayAsWord16
, indexWord8ArrayAsWord32
, indexWord8ArrayAsWord64
, indexWord8ArrayAsWord
) where
import Data.Primitive.ByteArray (ByteArray (..))
import GHC.Exts
import GHC.Int
import GHC.Word
{-------------------------------------------------------------------------------
Conversions
-------------------------------------------------------------------------------}
{-# INLINE wordToInt16# #-}
wordToInt16# :: Word# -> Int16#
wordToInt16# w# = intToInt16# (word2Int# w#)
{-# INLINE int16ToWord# #-}
int16ToWord# :: Int16# -> Word#
int16ToWord# i# = int2Word# (int16ToInt# i#)
{-# INLINE wordToInt32# #-}
wordToInt32# :: Word# -> Int32#
wordToInt32# w# = intToInt32# (word2Int# w#)
{-# INLINE int32ToWord# #-}
int32ToWord# :: Int32# -> Word#
int32ToWord# i# = int2Word# (int32ToInt# i#)
#if MIN_VERSION_base(4,17,0)
{-# INLINE wordToInt64# #-}
wordToInt64# :: Word# -> Int64#
wordToInt64# w# = intToInt64# (word2Int# w#)
{-# INLINE int64ToWord# #-}
int64ToWord# :: Int64# -> Word#
int64ToWord# i# = int2Word# (int64ToInt# i#)
#endif
{-------------------------------------------------------------------------------
Conversions: shims
-------------------------------------------------------------------------------}
{-# INLINE wordToInt64Shim# #-}
{-# INLINE int64ToWordShim# #-}
#if MIN_VERSION_base(4,17,0)
wordToInt64Shim# :: Word# -> Int64#
wordToInt64Shim# = wordToInt64#
int64ToWordShim# :: Int64# -> Word#
int64ToWordShim# = int64ToWord#
#else
wordToInt64Shim# :: Word# -> Int#
wordToInt64Shim# = word2Int#
int64ToWordShim# :: Int# -> Word#
int64ToWordShim# = int2Word#
#endif
{-------------------------------------------------------------------------------
Byte swaps
-------------------------------------------------------------------------------}
{-# INLINE byteSwapInt16 #-}
byteSwapInt16 :: Int16 -> Int16
byteSwapInt16 (I16# i#) = I16# (wordToInt16# (byteSwap16# (int16ToWord# i#)))
{-# INLINE byteSwapInt32 #-}
byteSwapInt32 :: Int32 -> Int32
byteSwapInt32 (I32# i#) = I32# (wordToInt32# (byteSwap32# (int32ToWord# i#)))
{-# INLINE byteSwapInt64 #-}
byteSwapInt64 :: Int64 -> Int64
byteSwapInt64 (I64# i#) = I64# (wordToInt64Shim# (byteSwap# (int64ToWordShim# i#)))
{-# INLINE byteSwapInt #-}
byteSwapInt :: Int -> Int
byteSwapInt (I# i#) = I# (word2Int# (byteSwap# (int2Word# i#)))
{-# INLINE byteSwapWord16 #-}
byteSwapWord16 :: Word16 -> Word16
byteSwapWord16 = byteSwap16
{-# INLINE byteSwapWord32 #-}
byteSwapWord32 :: Word32 -> Word32
byteSwapWord32 = byteSwap32
{-# INLINE byteSwapWord64 #-}
byteSwapWord64 :: Word64 -> Word64
byteSwapWord64 = byteSwap64
{-# INLINE byteSwapWord #-}
byteSwapWord :: Word -> Word
byteSwapWord (W# w#) = W# (byteSwap# w#)
{-------------------------------------------------------------------------------
Indexing byte arrays
-------------------------------------------------------------------------------}
{-# INLINE indexInt8Array #-}
indexInt8Array :: ByteArray -> Int -> Int8
indexInt8Array (ByteArray !ba#) (I# !off#) =
I8# (indexInt8Array# ba# off#)
{-# INLINE indexWord8ArrayAsInt16 #-}
indexWord8ArrayAsInt16 :: ByteArray -> Int -> Int16
indexWord8ArrayAsInt16 (ByteArray !ba#) (I# !off#) =
I16# (indexWord8ArrayAsInt16# ba# off#)
{-# INLINE indexWord8ArrayAsInt32 #-}
indexWord8ArrayAsInt32 :: ByteArray -> Int -> Int32
indexWord8ArrayAsInt32 (ByteArray !ba#) (I# !off#) =
I32# (indexWord8ArrayAsInt32# ba# off#)
{-# INLINE indexWord8ArrayAsInt64 #-}
indexWord8ArrayAsInt64 :: ByteArray -> Int -> Int64
indexWord8ArrayAsInt64 (ByteArray !ba#) (I# !off#) =
I64# (indexWord8ArrayAsInt64# ba# off#)
{-# INLINE indexWord8ArrayAsInt #-}
indexWord8ArrayAsInt :: ByteArray -> Int -> Int
indexWord8ArrayAsInt (ByteArray !ba#) (I# !off#) =
I# (indexWord8ArrayAsInt# ba# off#)
{-# INLINE indexWord8Array #-}
indexWord8Array :: ByteArray -> Int -> Word8
indexWord8Array (ByteArray !ba#) (I# !off#) =
W8# (indexWord8Array# ba# off#)
{-# INLINE indexWord8ArrayAsWord16 #-}
indexWord8ArrayAsWord16 :: ByteArray -> Int -> Word16
indexWord8ArrayAsWord16 (ByteArray !ba#) (I# !off#) =
W16# (indexWord8ArrayAsWord16# ba# off#)
{-# INLINE indexWord8ArrayAsWord32 #-}
indexWord8ArrayAsWord32 :: ByteArray -> Int -> Word32
indexWord8ArrayAsWord32 (ByteArray !ba#) (I# !off#) =
W32# (indexWord8ArrayAsWord32# ba# off#)
{-# INLINE indexWord8ArrayAsWord64 #-}
indexWord8ArrayAsWord64 :: ByteArray -> Int -> Word64
indexWord8ArrayAsWord64 (ByteArray !ba#) (I# !off#) =
W64# (indexWord8ArrayAsWord64# ba# off#)
{-# INLINE indexWord8ArrayAsWord #-}
indexWord8ArrayAsWord :: ByteArray -> Int -> Word
indexWord8ArrayAsWord (ByteArray !ba#) (I# !off#) =
W# (indexWord8ArrayAsWord# ba# off#)