Repository : ssh://g...@git.haskell.org/bytestring On branch : ghc-head Link : http://git.haskell.org/packages/bytestring.git/commitdiff/3bb3b5738b2d9001f7e123f844c61a3d690662c1
>--------------------------------------------------------------- commit 3bb3b5738b2d9001f7e123f844c61a3d690662c1 Author: Duncan Coutts <dun...@community.haskell.org> Date: Tue Sep 17 12:29:37 2013 +0100 Add a builder primitive for ShortByteString >--------------------------------------------------------------- 3bb3b5738b2d9001f7e123f844c61a3d690662c1 Data/ByteString/Builder.hs | 1 + Data/ByteString/Builder/Internal.hs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/Data/ByteString/Builder.hs b/Data/ByteString/Builder.hs index d491c2a..6ee44d0 100644 --- a/Data/ByteString/Builder.hs +++ b/Data/ByteString/Builder.hs @@ -197,6 +197,7 @@ module Data.ByteString.Builder -- ** Binary encodings , byteString , lazyByteString + , shortByteString , int8 , word8 diff --git a/Data/ByteString/Builder/Internal.hs b/Data/ByteString/Builder/Internal.hs index b07355b..55bd550 100644 --- a/Data/ByteString/Builder/Internal.hs +++ b/Data/ByteString/Builder/Internal.hs @@ -83,6 +83,8 @@ module Data.ByteString.Builder.Internal ( , lazyByteStringInsert , lazyByteStringThreshold + , shortByteString + , lazyByteStringC , maximalCopySize @@ -123,6 +125,7 @@ import Data.Monoid import qualified Data.ByteString as S import qualified Data.ByteString.Internal as S import qualified Data.ByteString.Lazy.Internal as L +import qualified Data.ByteString.Short.Internal as Sh #if __GLASGOW_HASKELL__ >= 611 import GHC.IO.Buffer (Buffer(..), newByteBuffer) @@ -637,6 +640,35 @@ byteStringInsert = | otherwise = return $ insertChunks op (fromIntegral $ S.length bs) (L.Chunk bs) k +-- Short bytestrings +------------------------------------------------------------------------------ + +-- | Construct a 'Builder' that copies the 'SH.ShortByteString'. +-- +{-# INLINE shortByteString #-} +shortByteString :: Sh.ShortByteString -> Builder +shortByteString = \sbs -> builder $ shortByteStringCopyStep sbs + +-- | Copy the bytes from a 'SH.ShortByteString' into the output stream. +{-# INLINE shortByteStringCopyStep #-} +shortByteStringCopyStep :: Sh.ShortByteString -- ^ Input 'SH.ShortByteString'. + -> BuildStep a -> BuildStep a +shortByteStringCopyStep !sbs k = + go 0 (Sh.length sbs) + where + go !ip !ipe !(BufferRange op ope) + | inpRemaining <= outRemaining = do + Sh.copyToPtr sbs ip op inpRemaining + let !br' = BufferRange (op `plusPtr` inpRemaining) ope + k br' + | otherwise = do + Sh.copyToPtr sbs ip op outRemaining + let !ip' = ip + outRemaining + return $ bufferFull 1 ope (go ip' ipe) + where + outRemaining = ope `minusPtr` op + inpRemaining = ipe - ip + -- Lazy bytestrings ------------------------------------------------------------------------------ _______________________________________________ ghc-commits mailing list ghc-commits@haskell.org http://www.haskell.org/mailman/listinfo/ghc-commits