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 +94/−0
- Data/Vector/Storable/Serialize.hs +41/−0
- LICENSE +30/−0
- Setup.hs +2/−0
- cereal-vector.cabal +25/−0
+ 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.*