packages feed

cereal-vector (empty) → 0.1.0.0

raw patch · 5 files changed

+192/−0 lines, 5 filesdep +basedep +bytestringdep +cerealsetup-changed

Dependencies added: base, bytestring, cereal, vector

Files

+ Data/Vector/Serialize.hs view
@@ -0,0 +1,94 @@+{-# LANGUAGE CPP #-}+-- #define TEST+#ifdef TEST+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TemplateHaskell #-}+#endif+{-# OPTIONS_GHC -Wall -fno-warn-orphans #-}++-- | 'Data.Serialize' functions for 'Data.Vector.Generic.Vector'+-- vectors. Orphan instances are provided for 'Data.Vector' and+-- 'Data.Vector.Primitive' vectors.+--+-- Instances are /not/ provided for 'Data.Vector.Unbox' vectors, as+-- they must be declared on an individual basis for each type the+-- vectors may contain. The 'genericGet' and 'genericPut' functions+-- should still work for these vectors without declaring instances.+-- +-- The serialized format is an 'Int64' representing the+-- length of the 'Vector', followed by the serialized contents of each+-- element.+-- +-- Note that the instances specialized for 'Data.Vector.Storable' are+-- much more performant for storable vectors.+#ifndef TEST+module Data.Vector.Serialize (genericGetVector, genericPutVector) where+#endif++import Control.Monad++import Data.Int (Int64)+import Data.Serialize (Get, Putter, Serialize(..))+import qualified Data.Vector as V+import qualified Data.Vector.Primitive as VP+import qualified Data.Vector.Generic as VG++#ifdef TEST+import Data.Serialize (decode, encode)+import Data.Vector.Storable.Serialize ()+import qualified Data.Vector.Storable as VS+import qualified Data.Vector.Unboxed as VU+import Test.QuickCheck.All+#endif++-- | Read a 'Data.Vector.Generic.Vector'.+genericGetVector :: (Serialize a, VG.Vector v a) => Get (v a)+genericGetVector = do +  len64 <- get :: Get Int64+  when (len64 > fromIntegral (maxBound :: Int)) $+    fail "Host can't deserialize a Vector longer than (maxBound :: Int)"+  VG.replicateM (fromIntegral len64) get++-- | Write a 'Data.Vector.Generic.Vector'.+genericPutVector :: (Serialize a, VG.Vector v a) => Putter (v a)+genericPutVector v = do+  put ((fromIntegral $ VG.length v) :: Int64)+  VG.mapM_ put v++instance (Serialize a) => Serialize (V.Vector a) where+  get = genericGetVector ; put = genericPutVector++instance (Serialize a, VP.Prim a) => Serialize (VP.Vector a) where+  get = genericGetVector ; put = genericPutVector++#ifdef TEST+prop_vec :: [Int] -> Bool+prop_vec xs = Right xsv == decode (encode xsv)+  where xsv = V.fromList xs++prop_vec_tuple :: [[Int]] -> [Either [Bool] Double] -> Bool+prop_vec_tuple xs ys = Right (xsv, ysv) == decode (encode (xsv, ysv))+  where (xsv, ysv) = (V.fromList xs, V.fromList ys)++prop_prim :: [Int] -> Bool+prop_prim xs = Right xsv == decode (encode xsv)+  where xsv = VP.fromList xs++instance Serialize (VU.Vector Int) where+  get = genericGetVector ; put = genericPutVector++prop_unbox :: [Int] -> Bool+prop_unbox xs = Right xsv == decode (encode xsv)+  where xsv = VU.fromList xs++prop_storable :: [Int] -> Bool+prop_storable xs = Right xsv == decode (encode xsv)+  where xsv = VS.fromList xs++prop_storable_tuple :: [Int64] -> [Double] -> Bool+prop_storable_tuple xs ys = Right (xsv, ysv) == decode (encode (xsv, ysv))+  where (xsv, ysv) = (VS.fromList xs, VS.fromList ys)++main :: IO ()+main = void $ $quickCheckAll+#endif
+ Data/Vector/Storable/Serialize.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE CPP, ScopedTypeVariables #-}+{-# OPTIONS_GHC -Wall -fno-warn-orphans #-}++-- | Efficient 'Data.Serialize' instance for 'Data.Vector.Storable'+-- vectors. The serialized format is an 'Int64' representing the+-- length of the 'Vector', followed by the raw bytes.+module Data.Vector.Storable.Serialize () where++import Control.Monad (when)++import qualified Data.ByteString.Internal as BS+import Data.Int (Int64)+import Data.Serialize (Get, getBytes, putByteString, Serialize(..))+import Data.Vector.Storable ( unsafeFromForeignPtr0+                            , unsafeToForeignPtr0+                            , Vector)+import Data.Vector.Storable.Internal (updPtr)++import Foreign.ForeignPtr (castForeignPtr)+import Foreign.Marshal.Array (advancePtr)+import Foreign.Storable (Storable, sizeOf)++instance forall a. Storable a => Serialize (Vector a) where+  get = do +    len64 <- (get :: Get Int64)+    when (len64 > fromIntegral (maxBound :: Int)) $+      fail "Host can't deserialize a Vector longer than (maxBound :: Int)"+    let len    = fromIntegral len64+        nbytes = len * sizeOf (undefined :: a)+    bs <- getBytes nbytes+    let (fp, off, _)    = BS.toForeignPtr bs+        fp' | off /= 0  = updPtr (`advancePtr` off) fp+            | otherwise = fp+    return $ unsafeFromForeignPtr0 (castForeignPtr fp') len++  put v = do+    let (fp, len) = unsafeToForeignPtr0 v+        nbytes    = (len * sizeOf (undefined :: a))+        bs        = BS.fromForeignPtr (castForeignPtr fp) 0 nbytes+    put ((fromIntegral len) :: Int64)+    putByteString bs
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2012, Adam C. Foltzer++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Adam C. Foltzer nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ cereal-vector.cabal view
@@ -0,0 +1,25 @@+name:                cereal-vector+version:             0.1.0.0+synopsis:            Serialize instances for Data.Vector types.+homepage:            https://github.com/acfoltzer/cereal-vector+bug-reports:         https://github.com/acfoltzer/cereal-vector/issues+license:             BSD3+license-file:        LICENSE+author:              Adam C. Foltzer+maintainer:          acfoltzer@gmail.com+category:            Data+build-type:          Simple+stability:           experimental+cabal-version:       >=1.8++source-repository head+  type:     git+  location: git://github.com/acfoltzer/cereal-vector.git++library+  exposed-modules:     Data.Vector.Serialize+                     , Data.Vector.Storable.Serialize+  build-depends:       base == 4.*+                     , vector == 0.9.*                     +                     , cereal == 0.3.*+                     , bytestring == 0.9.*