ptr-poker-0.1.2: library/PtrPoker/Size.hs
{-# LANGUAGE CPP #-}
{-|
Functions that compute the required allocation size by value.
-}
module PtrPoker.Size
where
import PtrPoker.Prelude
import qualified Data.Text.Internal as Text
import qualified Data.Text.Array as TextArray
import qualified PtrPoker.Ffi as Ffi
{-|
Efficiently count the amount of bytes required to encode Word64
as a decimal number in ASCII.
Implemented as a balanced tree of \"ifs\"
centered around the middle of the range.
This is much faster than anything based on logarithms.
-}
{-# INLINE word64AsciiDec #-}
word64AsciiDec :: Word64 -> Int
word64AsciiDec x =
if x > 9999999999
then if x > 99999999999999
then if x > 9999999999999999
then if x > 99999999999999999
then if x > 999999999999999999
then if x > 9999999999999999999
then 20
else 19
else 18
else 17
else if x > 999999999999999
then 16
else 15
else if x > 999999999999
then if x > 9999999999999
then 14
else 13
else if x > 99999999999
then 12
else 11
else if x > 99999
then if x > 9999999
then if x > 99999999
then if x > 999999999
then 10
else 9
else 8
else if x > 999999
then 7
else 6
else if x > 99
then if x > 999
then if x > 9999
then 5
else 4
else 3
else if x > 9
then 2
else 1
{-|
Efficiently count the amount of bytes required to encode Int64
as a signed decimal number in ASCII.
Implemented as a balanced tree of \"ifs\"
centered around the middle of the range.
This is much faster than anything based on logarithms.
-}
{-# INLINE int64AsciiDec #-}
int64AsciiDec :: Int64 -> Int
int64AsciiDec x =
if x < 0
then if x < -9999999999
then if x < -99999999999999
then if x < -9999999999999999
then if x < -99999999999999999
then if x < -999999999999999999
then 20
else 19
else 18
else if x < -999999999999999
then 17
else 16
else if x < -999999999999
then if x < -9999999999999
then 15
else 14
else if x < -99999999999
then 13
else 12
else if x < -99999
then if x < -9999999
then if x < -99999999
then if x < -999999999
then 11
else 10
else 9
else if x < -999999
then 8
else 7
else if x < -99
then if x < -999
then if x < -9999
then 6
else 5
else 4
else if x < -9
then 3
else 2
else if x > 9999999999
then if x > 99999999999999
then if x > 9999999999999999
then if x > 99999999999999999
then if x > 999999999999999999
then 19
else 18
else 17
else if x > 999999999999999
then 16
else 15
else if x > 999999999999
then if x > 9999999999999
then 14
else 13
else if x > 99999999999
then 12
else 11
else if x > 99999
then if x > 9999999
then if x > 99999999
then if x > 999999999
then 10
else 9
else 8
else if x > 999999
then 7
else 6
else if x > 99
then if x > 999
then if x > 9999
then 5
else 4
else 3
else if x > 9
then 2
else 1
{-|
Efficiently count the amount of bytes required to encode Text
in UTF8.
-}
{-# INLINE textUtf8 #-}
textUtf8 :: Text -> Int
#if MIN_VERSION_text(2,0,0)
textUtf8 (Text.Text (TextArray.ByteArray arr) off len) =
#else
textUtf8 (Text.Text (TextArray.aBA -> arr) off len) =
#endif
Ffi.countTextAllocationSize
arr (fromIntegral off) (fromIntegral len)
& unsafeDupablePerformIO
& fromIntegral