on master help sign in
warp/test/readInt.hs : Update tests to add readDecimal_ from bytestring-lexing.
fefaec8Erik de Castro Lopo
warp/test/readInt.hs+21−23
@@ -19,10 +19,7 @@ import qualified Data.ByteString.Char8 as B
19import qualified Data.Char as C
19import qualified Data.Char as C
20import qualified Numeric as N
20import qualified Numeric as N
21import qualified Test.QuickCheck as QC
21import qualified Test.QuickCheck as QC
22−
23−-- ReadInt is a module internal to Warp.
24−import qualified ReadInt as RI
22+import qualified Data.ByteString.Lex.Integral as LI
25−
26
23
27import GHC.Prim
24import GHC.Prim
28import GHC.Types
25import GHC.Types
@@ -55,21 +52,17 @@ readIntRaw =
55 B.foldl' (\i c -> i * 10 + C.digitToInt c) 0
52 B.foldl' (\i c -> i * 10 + C.digitToInt c) 0
56
53
57
54
58−-- The best solution.
55+-- The first good solution.
59−readIntTC :: Integral a => ByteString -> a
56+readInt64 :: ByteString -> Int64
60−readIntTC bs = fromIntegral
57+readInt64 bs =
58+ B.foldl' (\i c -> i * 10 + fromIntegral (C.digitToInt c)) (0::Int64)
61− $ B.foldl' (\i c -> i * 10 + C.digitToInt c) 0 $ B.takeWhile C.isDigit bs
59+ $ B.takeWhile C.isDigit bs
62−
63
60
64−-- Three specialisations of readIntTC.
65readInt :: ByteString -> Int
61readInt :: ByteString -> Int
66−readInt = readIntTC
62+readInt bs = fromIntegral $ readInt64 bs
67−
68−readInt64 :: ByteString -> Int64
69−readInt64 = readIntTC
70
63
71readInteger :: ByteString -> Integer
64readInteger :: ByteString -> Integer
72−readInteger = readIntTC
65+readInteger bs = fromIntegral $ readInt64 bs
73
66
74
67
75-- MagicHash version suggested by Vincent Hanquez.
68-- MagicHash version suggested by Vincent Hanquez.
@@ -90,7 +83,7 @@ readIntegerMH = readIntMH
90data Table = Table !Addr#
83data Table = Table !Addr#
91
84
92mhDigitToInt :: Char -> Int
85mhDigitToInt :: Char -> Int
93−mhDigitToInt (C# i) = I# (word2Int# $ indexWord8OffAddr# addr (ord# i))
86+mhDigitToInt (C# i) = I# (word2Int# (indexWord8OffAddr# addr (ord# i)))
94 where
87 where
95 !(Table addr) = table
88 !(Table addr) = table
96 table :: Table
89 table :: Table
@@ -113,9 +106,11 @@ mhDigitToInt (C# i) = I# (word2Int# $ indexWord8OffAddr# addr (ord# i))
113 \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
106 \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
114
107
115
108
116−-- This is the one Warp actually uses.
109+readIntBSL :: ByteString -> Int
117−readIntWarp :: ByteString -> Integer
110+readIntBSL = LI.readDecimal_
118−readIntWarp s = fromIntegral $ RI.readInt64 s
111+
112+readInt64BSL :: ByteString -> Int64
113+readInt64BSL = LI.readDecimal_
119
114
120
115
121-- A QuickCheck property. Test that for a number >= 0, converting it to
116-- A QuickCheck property. Test that for a number >= 0, converting it to
@@ -124,7 +119,7 @@ readIntWarp s = fromIntegral $ RI.readInt64 s
124-- The functions under test only work on Natural numbers (the Conent-Length
119-- The functions under test only work on Natural numbers (the Conent-Length
125-- field in a HTTP header is always >= 0) so we check the absolute value of
120-- field in a HTTP header is always >= 0) so we check the absolute value of
126-- the value that QuickCheck generates for us.
121-- the value that QuickCheck generates for us.
127−prop_read_show_idempotent :: Integral a => (ByteString -> a) -> a -> Bool
122+prop_read_show_idempotent :: (Integral a, Show a) => (ByteString -> a) -> a -> Bool
128prop_read_show_idempotent freader x =
123prop_read_show_idempotent freader x =
129 let px = abs x
124 let px = abs x
130 in px == freader (B.pack $ show px)
125 in px == freader (B.pack $ show px)
@@ -137,8 +132,8 @@ runQuickCheckTests = do
137 QC.quickCheck (prop_read_show_idempotent readInteger)
132 QC.quickCheck (prop_read_show_idempotent readInteger)
138 QC.quickCheck (prop_read_show_idempotent readInt64MH)
133 QC.quickCheck (prop_read_show_idempotent readInt64MH)
139 QC.quickCheck (prop_read_show_idempotent readIntegerMH)
134 QC.quickCheck (prop_read_show_idempotent readIntegerMH)
140− QC.quickCheck (prop_read_show_idempotent readIntWarp)
135+ QC.quickCheck (prop_read_show_idempotent readIntBSL)
141−
136+ QC.quickCheck (prop_read_show_idempotent readInt64BSL)
142
137
143runCriterionTests :: ByteString -> IO ()
138runCriterionTests :: ByteString -> IO ()
144runCriterionTests number =
139runCriterionTests number =
@@ -152,7 +147,10 @@ runCriterionTests number =
152 , bench "readInteger" $ nf readInteger number
147 , bench "readInteger" $ nf readInteger number
153 , bench "readInt64MH" $ nf readInt64MH number
148 , bench "readInt64MH" $ nf readInt64MH number
154 , bench "readIntegerMH" $ nf readIntegerMH number
149 , bench "readIntegerMH" $ nf readIntegerMH number
155− , bench "readIntWarp" $ nf readIntWarp number
150+
151+ -- Current best.
152+ , bench "readIntBSL" $ nf readIntBSL number
153+ , bench "readInt64BSL" $ nf readInt64BSL number
156 ]
154 ]
157
155
158main :: IO ()
156main :: IO ()