X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Data%2FBits.hs;h=c9230c59bffc61acf927ea9da6721c4f87c4a27e;hb=af95709acf78729340ee65ec7f54c98980eb465a;hp=46f009aeb9c39f204c4538b3f25c871287dfa78f;hpb=73c4a36a4f5140f4444feacfdafb466c6f940b26;p=ghc-base.git diff --git a/Data/Bits.hs b/Data/Bits.hs index 46f009a..c9230c5 100644 --- a/Data/Bits.hs +++ b/Data/Bits.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC -XNoImplicitPrelude #-} ----------------------------------------------------------------------------- -- | @@ -48,7 +49,6 @@ module Data.Bits ( #ifdef __GLASGOW_HASKELL__ import GHC.Num -import GHC.Real import GHC.Base #endif @@ -127,7 +127,7 @@ class Num a => Bits a where | 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@ @@ -152,6 +152,11 @@ class Num a => Bits a where 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) @@ -165,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 + {-# INLINE shiftL #-} x `shiftL` i = x `shift` i {-| Shift the first argument right by the specified number of bits @@ -177,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 + {-# INLINE shiftR #-} x `shiftR` i = x `shift` (-i) {-| Rotate the argument left by the specified number of bits @@ -186,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 + {-# INLINE rotateL #-} x `rotateL` i = x `rotate` i {-| Rotate the argument right by the specified number of bits @@ -195,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 + {-# INLINE rotateR #-} x `rotateR` i = x `rotate` (-i) instance Bits Int where @@ -223,9 +232,6 @@ instance Bits Int where !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__ @@ -274,6 +280,8 @@ instance Bits Integer where (.|.) = 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 @@ -290,10 +298,9 @@ instance Bits Integer where -- assuming infinite 2's-complement arithmetic complement a = -1 - a -#endif - shift x i | i >= 0 = x * 2^i | otherwise = x `div` 2^(-i) +#endif rotate x i = shift x i -- since an Integer never wraps around