ptr-poker-0.1.3: src/library/PtrPoker/Size.hs
-- |
-- Functions that compute the required allocation size by value.
module PtrPoker.Size where
import qualified PtrPoker.Compat.Text as TextCompat
import PtrPoker.Prelude
-- |
-- 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
textUtf8 = TextCompat.utf8EncodingSize