on 153d2b3 help sign in
Data/Binary/Bits/Internal.hs−21
since splitsnapshots
unifiedsplit
@@ -12,13 +12,10 @@
12
12
13module Data.Binary.Bits.Internal
13module Data.Binary.Bits.Internal
14 ( make_mask
14 ( make_mask
15− , make_mask#
16 , mask
15 , mask
17− , mask#
18 , bit_offset
16 , bit_offset
19 , byte_offset
17 , byte_offset
20 , reverseBits
18 , reverseBits
21− , reverseBits#
22 , FastBits(..)
19 , FastBits(..)
23 )
20 )
24where
21where
@@ -41,18 +38,11 @@ make_mask n = (1 `shiftL` fromIntegral n) - 1
41{-# SPECIALIZE make_mask :: Int -> Word32 #-}
38{-# SPECIALIZE make_mask :: Int -> Word32 #-}
42{-# SPECIALIZE make_mask :: Int -> Word64 #-}
39{-# SPECIALIZE make_mask :: Int -> Word64 #-}
43
40
44−make_mask# :: Int# -> Word#
45−make_mask# n = (1## `shiftL#` n) `minusWord#` 1##
46−
47-- | Keep only the n least-significant bits of the given value
41-- | Keep only the n least-significant bits of the given value
48mask :: (Bits a, Num a) => Int -> a -> a
42mask :: (Bits a, Num a) => Int -> a -> a
49mask n v = v .&. make_mask n
43mask n v = v .&. make_mask n
50{-# INLINE mask #-}
44{-# INLINE mask #-}
51
45
52−-- | Keep only the n least-significant bits of the given value
53−mask# :: Int# -> Word# -> Word#
54−mask# n v = v `and#` make_mask# n
55−
56-- | Compute bit offset (equivalent to x `mod` 8 but faster)
46-- | Compute bit offset (equivalent to x `mod` 8 but faster)
57bit_offset :: Int -> Int
47bit_offset :: Int -> Int
58bit_offset n = make_mask 3 .&. n
48bit_offset n = make_mask 3 .&. n
@@ -75,17 +65,6 @@ reverseBits n value = rec value n 0
75 rec 0 i r = r `fastShiftL` i
65 rec 0 i r = r `fastShiftL` i
76 rec v i r = rec (v `fastShiftR` 1) (i-1) ((r `fastShiftL` 1) .|. (v .&. 0x1))
66 rec v i r = rec (v `fastShiftR` 1) (i-1) ((r `fastShiftL` 1) .|. (v .&. 0x1))
77
67
78−reverseBits# :: Int# -> Word# -> Word#
79−reverseBits# n value = rec value n 0##
80− where
81− -- rec v i r, where
82− -- v is orginal value shifted
83− -- i is the remaining number of bits
84− -- r is current value
85− rec 0## 0# r = r
86− rec 0## i r = r `shiftL#` i
87− rec v i r = rec (v `shiftRL#` 1#) (i -# 1#) ((r `shiftL#` 1#) `or#` (v `and#` 0x1##))
88−
89
68
90---------------------------------------------------------------------
69---------------------------------------------------------------------
91-- Unchecked shifts, from the "binary" package
70-- Unchecked shifts, from the "binary" package
Data/Binary/Bits/Put.hs+2−60
@@ -1,5 +1,3 @@
1−{-# LANGUAGE MagicHash #-}
2−
3-----------------------------------------------------------------------------
1-----------------------------------------------------------------------------
4-- |
2-- |
5-- Module : Data.Binary.Bits.Put
3-- Module : Data.Binary.Bits.Put
@@ -22,10 +20,8 @@ module Data.Binary.Bits.Put
22 -- * Data types
20 -- * Data types
23 -- ** Bool
21 -- ** Bool
24 , putBool
22 , putBool
25− , putBool#
26
23
27 -- ** Words
24 -- ** Words
28− , putWord#
29 , putWord8
25 , putWord8
30 , putWord16
26 , putWord16
31 , putWord32
27 , putWord32
@@ -50,11 +46,11 @@ import Data.Binary.Bits.Alignment
50import Data.ByteString as BS
46import Data.ByteString as BS
51import Data.ByteString.Unsafe as BS
47import Data.ByteString.Unsafe as BS
52
48
49+import Control.Applicative
53import Control.Monad (when)
50import Control.Monad (when)
54import Data.Bits
51import Data.Bits
52+import Data.Monoid
55import Data.Word
53import Data.Word
56−import GHC.Base (Word#, shiftRL#, Int (..), Int#, (-#), (<#), isTrue#, (+#), shiftL#, wordToWord8#, orWord8#)
57−import GHC.Word (Word8(..))
58
54
59data BitPut a = BitPut { run :: (S -> PairS a) }
55data BitPut a = BitPut { run :: (S -> PairS a) }
60
56
@@ -66,18 +62,11 @@ data S = S !Builder !Word8 !Int !BitOrder
66putBool :: Bool -> BitPut ()
62putBool :: Bool -> BitPut ()
67putBool b = putWord8 1 (if b then 0xff else 0x00)
63putBool b = putWord8 1 (if b then 0xff else 0x00)
68
64
69−-- | Put a 1 bit 'Bool'.
70−putBool# :: Word# -> BitPut ()
71−putBool# b = putWord# 1# b
72−
73
65
74-- | Generic putWord
66-- | Generic putWord
75putWord :: (Num a, FastBits a, Integral a) => Int -> a -> BitPut ()
67putWord :: (Num a, FastBits a, Integral a) => Int -> a -> BitPut ()
76putWord n w = BitPut $ \s -> PairS () (putWordS n w s)
68putWord n w = BitPut $ \s -> PairS () (putWordS n w s)
77
69
78−putWord# :: Int# -> Word# -> BitPut ()
79−putWord# n w = BitPut $ \s -> PairS () (putWordS# n w s)
80−
81putWordS :: (Num a, FastBits a, Integral a) => Int -> a -> S -> S
70putWordS :: (Num a, FastBits a, Integral a) => Int -> a -> S -> S
82putWordS n w s@(S builder b o bo) = s'
71putWordS n w s@(S builder b o bo) = s'
83 where
72 where
@@ -121,53 +110,6 @@ putWordS n w s@(S builder b o bo) = s'
121 | o2 == 8 = S (b2 `mappend` B.singleton w2) 0 0 bo2
110 | o2 == 8 = S (b2 `mappend` B.singleton w2) 0 0 bo2
122 | otherwise = s2
111 | otherwise = s2
123
112
124−putWordS# :: Int# -> Word# -> S -> S
125−putWordS# n w s@(S builder (W8# b) (I# o) bo) = s'
126− where
127− min# :: Int# -> Int# -> Int#
128− min# x y | isTrue# (x <# y) = x
129− min# _ y = y
130−
131− -- number of bits that will be stored in the current byte
132− cn = min# (8# -# o) n
133−
134− -- new state
135− s' = case n of
136− 0# -> s
137− _ -> putWordS# (n -# cn) w' (flush (S builder (W8# b') (I# (o +# cn)) bo))
138−
139− -- new current byte
140− b' = wordToWord8# (shl (selectBits w)) `orWord8#` b
141−
142− -- Word containing the remaining (n-cn) bits to store in its LSB
143− w' = case bo of
144− BB -> w
145− BL -> w `shiftRL#` cn
146− LL -> w `shiftRL#` cn
147− LB -> w
148−
149− -- Select bits to store in the current byte.
150− -- Put them in the correct order and return them in the least-significant
151− -- bits of the returned value
152− selectBits :: Word# -> Word#
153− selectBits x = case bo of
154− BB -> mask# cn (x `shiftRL#` (n -# cn))
155− LB -> reverseBits# cn (mask# cn (x `shiftRL#` (n -# cn)))
156− LL -> mask# cn x
157− BL -> reverseBits# cn (mask# cn x)
158−
159− -- shift left at the correct position
160− shl :: Word# -> Word#
161− shl x = case bo of
162− BB -> x `shiftL#` (8# -# o -# cn)
163− BL -> x `shiftL#` (8# -# o -# cn)
164− LL -> x `shiftL#` o
165− LB -> x `shiftL#` o
166−
167− flush s2@(S b2 w2 o2 bo2)
168− | o2 == 8 = S (b2 `mappend` B.singleton w2) 0 0 bo2
169− | otherwise = s2
170−
171
113
172-- | Put the @n@ lower bits of a 'Word8'.
114-- | Put the @n@ lower bits of a 'Word8'.
173putWord8 :: Int -> Word8 -> BitPut ()
115putWord8 :: Int -> Word8 -> BitPut ()