projects
/
ghc-base.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use explicit language extensions & remove extension fields from base.cabal
[ghc-base.git]
/
Data
/
Bits.hs
diff --git
a/Data/Bits.hs
b/Data/Bits.hs
index
9b31397
..
cbf7b37
100644
(file)
--- a/
Data/Bits.hs
+++ b/
Data/Bits.hs
@@
-1,4
+1,5
@@
-{-# OPTIONS_GHC -XNoImplicitPrelude #-}
+{-# LANGUAGE CPP, NoImplicitPrelude, BangPatterns, MagicHash #-}
+
-----------------------------------------------------------------------------
-- |
-- Module : Data.Bits
-----------------------------------------------------------------------------
-- |
-- Module : Data.Bits
@@
-126,7
+127,7
@@
class Num a => Bits a where
| i>0 = (x `shift` i) .|. (x `shift` (i-bitSize x))
-}
| i>0 = (x `shift` i) .|. (x `shift` (i-bitSize x))
-}
- -- | @bit i@ is a value with the @i@th bit set
+ -- | @bit i@ is a value with the @i@th bit set and all other bits clear
bit :: Int -> a
-- | @x \`setBit\` i@ is the same as @x .|. bit i@
bit :: Int -> a
-- | @x \`setBit\` i@ is the same as @x .|. bit i@
@@
-151,6
+152,11
@@
class Num a => Bits a where
value of the argument is ignored -}
isSigned :: a -> Bool
value of the argument is ignored -}
isSigned :: a -> Bool
+ {-# INLINE bit #-}
+ {-# INLINE setBit #-}
+ {-# INLINE clearBit #-}
+ {-# INLINE complementBit #-}
+ {-# INLINE testBit #-}
bit i = 1 `shiftL` i
x `setBit` i = x .|. bit i
x `clearBit` i = x .&. complement (bit i)
bit i = 1 `shiftL` i
x `setBit` i = x .|. bit i
x `clearBit` i = x .&. complement (bit i)
@@
-164,6
+170,7
@@
class Num a => Bits a where
'shift', depending on which is more convenient for the type in
question. -}
shiftL :: a -> Int -> a
'shift', depending on which is more convenient for the type in
question. -}
shiftL :: a -> Int -> a
+ {-# INLINE shiftL #-}
x `shiftL` i = x `shift` i
{-| Shift the first argument right by the specified number of bits
x `shiftL` i = x `shift` i
{-| Shift the first argument right by the specified number of bits
@@
-176,6
+183,7
@@
class Num a => Bits a where
'shift', depending on which is more convenient for the type in
question. -}
shiftR :: a -> Int -> a
'shift', depending on which is more convenient for the type in
question. -}
shiftR :: a -> Int -> a
+ {-# INLINE shiftR #-}
x `shiftR` i = x `shift` (-i)
{-| Rotate the argument left by the specified number of bits
x `shiftR` i = x `shift` (-i)
{-| Rotate the argument left by the specified number of bits
@@
-185,6
+193,7
@@
class Num a => Bits a where
'rotate', depending on which is more convenient for the type in
question. -}
rotateL :: a -> Int -> a
'rotate', depending on which is more convenient for the type in
question. -}
rotateL :: a -> Int -> a
+ {-# INLINE rotateL #-}
x `rotateL` i = x `rotate` i
{-| Rotate the argument right by the specified number of bits
x `rotateL` i = x `rotate` i
{-| Rotate the argument right by the specified number of bits
@@
-194,6
+203,7
@@
class Num a => Bits a where
'rotate', depending on which is more convenient for the type in
question. -}
rotateR :: a -> Int -> a
'rotate', depending on which is more convenient for the type in
question. -}
rotateR :: a -> Int -> a
+ {-# INLINE rotateR #-}
x `rotateR` i = x `rotate` (-i)
instance Bits Int where
x `rotateR` i = x `rotate` (-i)
instance Bits Int where
@@
-222,9
+232,6
@@
instance Bits Int where
!wsib = WORD_SIZE_IN_BITS# {- work around preprocessor problem (??) -}
bitSize _ = WORD_SIZE_IN_BITS
!wsib = WORD_SIZE_IN_BITS# {- work around preprocessor problem (??) -}
bitSize _ = WORD_SIZE_IN_BITS
- {-# INLINE shiftR #-}
- -- same as the default definition, but we want it inlined (#2376)
- x `shiftR` i = x `shift` (-i)
#else /* !__GLASGOW_HASKELL__ */
#ifdef __HUGS__
#else /* !__GLASGOW_HASKELL__ */
#ifdef __HUGS__
@@
-273,6
+280,8
@@
instance Bits Integer where
(.|.) = orInteger
xor = xorInteger
complement = complementInteger
(.|.) = orInteger
xor = xorInteger
complement = complementInteger
+ shift x i@(I# i#) | i >= 0 = shiftLInteger x i#
+ | otherwise = shiftRInteger x (negateInt# i#)
#else
-- reduce bitwise binary operations to special cases we can handle
#else
-- reduce bitwise binary operations to special cases we can handle
@@
-289,11
+298,10
@@
instance Bits Integer where
-- assuming infinite 2's-complement arithmetic
complement a = -1 - a
-- assuming infinite 2's-complement arithmetic
complement a = -1 - a
+ shift x i | i >= 0 = x * 2^i
+ | otherwise = x `div` 2^(-i)
#endif
#endif
- shift x i@(I# i#) | i >= 0 = shiftLInteger x i#
- | otherwise = shiftRInteger x (negateInt# i#)
-
rotate x i = shift x i -- since an Integer never wraps around
bitSize _ = error "Data.Bits.bitSize(Integer)"
rotate x i = shift x i -- since an Integer never wraps around
bitSize _ = error "Data.Bits.bitSize(Integer)"