cborg 0.2.8.0 → 0.2.9.0
raw patch · 7 files changed
+104/−19 lines, 7 filesdep ~aesondep ~basedep ~bytestringPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: aeson, base, bytestring, containers, deepseq, ghc-prim, primitive, tasty, text
API changes (from Hackage documentation)
- Codec.CBOR.ByteArray: instance GHC.IsList.IsList Codec.CBOR.ByteArray.ByteArray
- Codec.CBOR.ByteArray.Sliced: instance GHC.IsList.IsList Codec.CBOR.ByteArray.Sliced.SlicedByteArray
+ Codec.CBOR.ByteArray: instance GHC.Exts.IsList Codec.CBOR.ByteArray.ByteArray
+ Codec.CBOR.ByteArray.Sliced: instance GHC.Exts.IsList Codec.CBOR.ByteArray.Sliced.SlicedByteArray
Files
- ChangeLog.md +6/−0
- cborg.cabal +9/−7
- src/Codec/CBOR/ByteArray/Internal.hs +3/−2
- src/Codec/CBOR/ByteArray/Sliced.hs +10/−7
- src/Codec/CBOR/Magic.hs +5/−1
- tests/Tests/Properties.hs +70/−2
- tests/Tests/Reference/Implementation.hs +1/−0
ChangeLog.md view
@@ -1,5 +1,11 @@ # Revision history for cborg +## 0.2.9.0++* Fix build with `base >= 4.17` on platforms without unaligned memory operations.+* Fix `Eq`, `Ord`, `Show` and `IsList` instances for `SlicedByteArray` when offset is present+* Fix `toBuilder` and `encodeByteArray` for `SlicedByteArray` when offset is present+ ## 0.2.8.0 -- 2022-09-24 * Support GHC 9.4
cborg.cabal view
@@ -1,5 +1,5 @@ name: cborg-version: 0.2.8.0+version: 0.2.9.0 synopsis: Concise Binary Object Representation (CBOR) license: BSD3 license-file: LICENSE.txt@@ -19,7 +19,8 @@ GHC == 8.10.7, GHC == 9.0.1, GHC == 9.2.2,- GHC == 9.4.2+ GHC == 9.4.2,+ GHC == 9.6.1 extra-source-files: ChangeLog.md@@ -89,13 +90,13 @@ build-depends: array >= 0.4 && < 0.6,- base >= 4.11 && < 4.18,+ base >= 4.11 && < 4.19, bytestring >= 0.10.4 && < 0.12, containers >= 0.5 && < 0.7, deepseq >= 1.0 && < 1.5,- ghc-prim >= 0.3.1.0 && < 0.10,+ ghc-prim >= 0.3.1.0 && < 0.11, half >= 0.2.2.3 && < 0.4,- primitive >= 0.5 && < 0.8,+ primitive >= 0.5 && < 0.9, text >= 1.1 && < 1.3 || >= 2.0 && <2.1 if flag(optimize-gmp)@@ -147,10 +148,11 @@ build-depends: array >= 0.4 && < 0.6,- base >= 4.11 && < 4.18,+ base >= 4.11 && < 4.19, base-orphans, bytestring >= 0.10.4 && < 0.12, text >= 1.1 && < 2.1,+ primitive >= 0.5 && < 0.9, cborg, aeson >= 0.7 && < 2.2, base64-bytestring >= 1.0 && < 1.3,@@ -163,7 +165,7 @@ tasty >= 0.11 && < 1.5, tasty-hunit >= 0.9 && < 0.11, tasty-quickcheck >= 0.8 && < 0.11,- vector >= 0.10 && < 0.13+ vector >= 0.10 && < 0.14 if !impl(ghc >= 8.0) build-depends: fail >= 4.9.0.0 && < 4.10
src/Codec/CBOR/ByteArray/Internal.hs view
@@ -41,9 +41,10 @@ -> a foldrByteArray f z off0 len ba = go off0 where+ len' = len + off0 go !off- | off == len = z- | otherwise =+ | off >= len' = z+ | otherwise = let x = Prim.indexByteArray ba off in f x (go (off+1))
src/Codec/CBOR/ByteArray/Sliced.hs view
@@ -84,7 +84,7 @@ Prim.unsafeFreezeByteArray ba' toBuilder :: SlicedByteArray -> BSB.Builder-toBuilder = \(SBA ba off len) -> BSB.builder (go ba off len)+toBuilder = \(SBA ba off len) -> BSB.builder (go ba off (len + off)) where go ba !ip !ipe !k (BSB.BufferRange op ope) | inpRemaining <= outRemaining = do@@ -133,9 +133,10 @@ | otherwise = let (!) :: Prim.ByteArray -> Int -> Word8 (!) = Prim.indexByteArray+ -- len1 and len2 are known to be equal at this point+ len1' = len1 + off1 go i1 i2- | i1 == len1 && i2 == len2 = True- | i1 == len1 || i2 == len2 = False+ | i1 == len1' = True | (arr1 ! i1) == (arr2 ! i2) = go (i1+1) (i2+1) | otherwise = False in go off1 off2@@ -150,10 +151,12 @@ | otherwise = let (!) :: Prim.ByteArray -> Int -> Word8 (!) = Prim.indexByteArray+ len1' = len1 + off1+ len2' = len2 + off2 go i1 i2- | i1 == len1 && i2 == len2 = EQ- | i1 == len1 || i2 == len2 = len1 `compare` len2- | EQ <- o = go (i1+1) (i2+1)- | otherwise = o+ | i1 == len1' && i2 == len2' = EQ+ | i1 == len1' || i2 == len2' = len1 `compare` len2+ | EQ <- o = go (i1+1) (i2+1)+ | otherwise = o where o = (arr1 ! i1) `compare` (arr2 ! i2) in go off1 off2
src/Codec/CBOR/Magic.hs view
@@ -257,11 +257,15 @@ #endif #if WORD_SIZE_IN_BITS == 64+#if MIN_VERSION_base(4,17,0)+-- case taken from Codec.CBOR.Decoding+ w64 w# = W64# (wordToWord64# (toWord w#))+#else w64 w# = W64# (toWord w#)+#endif #else w64 w# = W64# (wordToWord64# (toWord w#)) #endif- #endif --------------------------------------------------------------------------------
tests/Tests/Properties.hs view
@@ -38,6 +38,7 @@ import Prelude hiding (decodeFloat, encodeFloat) +import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS import Data.Word import Data.Int@@ -47,6 +48,9 @@ import Data.Proxy import Data.Kind (Type) +import GHC.Exts+import Codec.CBOR.ByteArray+import qualified Codec.CBOR.ByteArray.Sliced as Sliced import Codec.CBOR.Term import Codec.CBOR.Read import Codec.CBOR.Write@@ -56,10 +60,10 @@ import Test.Tasty (TestTree, testGroup, localOption) import Test.Tasty.QuickCheck (testProperty, QuickCheckMaxSize(..)) import Test.QuickCheck-import System.Random (Random)+import Test.QuickCheck.Gen (Gen (MkGen)) import qualified Tests.Reference.Implementation as Ref-import Tests.Reference.Implementation (UInt(..))+import Tests.Reference.Implementation (UInt(..), lengthUInt) import Tests.Reference.Generators import Tests.Term ( fromRefTerm, toRefTerm, eqTerm, canonicaliseTerm )@@ -70,6 +74,15 @@ #endif +#if MIN_VERSION_bytestring(0,11,1)+import qualified Data.ByteString.Short as SBS+#else+import qualified Data.ByteString.Short.Internal as SBS+#endif++import qualified Data.Primitive.ByteArray as Prim (ByteArray (..))+import System.Random.Stateful hiding (genByteString, genShortByteString)+ -- | The CBOR implementation and its reference implementation satisfy all the -- properties implied in the following commuting diagram. --@@ -984,7 +997,53 @@ encodeRef = Ref.encodeTerm decodeRef _ = Ref.decodeTerm +--------------------------------------------------------------------------------+-- Token class instances for ByteArray tokens.+-- +newtype TokByteArray = TokByteArray { unTokByteArray :: [Word8] }+ deriving (Eq, Show)++instance Arbitrary TokByteArray where+ arbitrary = TokByteArray <$> arbitrary++instance Token TokByteArray where+ type Imp TokByteArray = Sliced.SlicedByteArray++ eqImp _ = (==)++ fromRef = Sliced.fromByteString . BS.pack . unTokByteArray+ toRef _ = TokByteArray . toList++ canonicaliseImp _ = id+ canonicaliseRef = id++ encodeImp _ = encodeByteArray+ decodeImp _ = toSliced <$> decodeByteArray++ encodeRef (TokByteArray bs) = Ref.encodeToken (Ref.MT2_ByteString (lengthUInt bs) bs)+ decodeRef _ = do Ref.MT2_ByteString _n bs <- Ref.decodeToken+ -- TODO? check _n == bs+ return (TokByteArray bs)++instance Arbitrary Sliced.SlicedByteArray where+ -- Taken from cardano-ledger-binary testlib.+ arbitrary = do+ NonNegative off <- arbitrary+ Positive count <- arbitrary+ NonNegative slack <- arbitrary+ let len = off + count + slack+ ba <- genByteArray len+ pure $ Sliced.SBA ba off count++ where+ genShortByteString :: Int -> Gen SBS.ShortByteString+ genShortByteString n = MkGen (\r _n -> runStateGen_ r (uniformShortByteString n))++ genByteArray :: Int -> Gen Prim.ByteArray+ genByteArray n = do+ SBS.SBS ba <- genShortByteString n+ pure (Prim.ByteArray ba) -------------------------------------------------------------------------------- -- TestTree API @@ -1011,6 +1070,7 @@ , testProperty "Tag64" (prop_fromRefToRef (Proxy :: Proxy TokTag64)) , testProperty "Simple" (prop_fromRefToRef (Proxy :: Proxy Ref.Simple)) , testProperty "Term" (prop_fromRefToRef (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_fromRefToRef (Proxy :: Proxy TokByteArray)) ] , testGroup "from . id . to = canon_imp"@@ -1033,6 +1093,7 @@ , testProperty "Tag64" (prop_toRefFromRef (Proxy :: Proxy TokTag64)) , testProperty "Simple" (prop_toRefFromRef (Proxy :: Proxy Ref.Simple)) , testProperty "Term" (prop_toRefFromRef (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_toRefFromRef (Proxy :: Proxy TokByteArray)) ] , testGroup "dec_ref . enc_ref = id"@@ -1055,6 +1116,7 @@ , testProperty "Tag64" (prop_encodeRefdecodeRef (Proxy :: Proxy TokTag64)) , testProperty "Simple" (prop_encodeRefdecodeRef (Proxy :: Proxy Ref.Simple)) , testProperty "Term" (prop_encodeRefdecodeRef (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_encodeRefdecodeRef (Proxy :: Proxy TokByteArray)) ] , testGroup "dec_imp . enc_imp = canon_imp"@@ -1077,6 +1139,7 @@ , testProperty "Tag64" (prop_encodeImpdecodeImp (Proxy :: Proxy TokTag64)) , testProperty "Simple" (prop_encodeImpdecodeImp (Proxy :: Proxy Ref.Simple)) , testProperty "Term" (prop_encodeImpdecodeImp (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_encodeImpdecodeImp (Proxy :: Proxy TokByteArray)) ] , testGroup "dec_imp . enc_imp = canon_imp (all 2-splits)"@@ -1100,6 +1163,7 @@ , testProperty "Simple" (prop_encodeImpdecodeImp_splits2 (Proxy :: Proxy Ref.Simple)) , localOption (QuickCheckMaxSize 100) $ testProperty "Term" (prop_encodeImpdecodeImp_splits2 (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_encodeImpdecodeImp_splits2 (Proxy :: Proxy TokByteArray)) ] , testGroup "dec_imp . enc_imp = canon_imp (all 3-splits)"@@ -1123,6 +1187,7 @@ , testProperty "Simple" (prop_encodeImpdecodeImp_splits3 (Proxy :: Proxy Ref.Simple)) , localOption (QuickCheckMaxSize 25) $ testProperty "Term" (prop_encodeImpdecodeImp_splits3 (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_encodeImpdecodeImp_splits3 (Proxy :: Proxy TokByteArray)) ] , testGroup "enc_imp . from = enc_ref . canon_ref"@@ -1145,6 +1210,7 @@ , testProperty "Tag64" (prop_encodeRefencodeImp1 (Proxy :: Proxy TokTag64)) , testProperty "Simple" (prop_encodeRefencodeImp1 (Proxy :: Proxy Ref.Simple)) , testProperty "Term" (prop_encodeRefencodeImp1 (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_encodeRefencodeImp1 (Proxy :: Proxy TokByteArray)) ] , testGroup "enc_ref . to = enc_imp"@@ -1167,6 +1233,7 @@ , testProperty "Tag64" (prop_encodeRefencodeImp2 (Proxy :: Proxy TokTag64)) , testProperty "Simple" (prop_encodeRefencodeImp2 (Proxy :: Proxy Ref.Simple)) , testProperty "Term" (prop_encodeRefencodeImp2 (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_encodeRefencodeImp2 (Proxy :: Proxy TokByteArray)) ] , testGroup "dec_imp . enc_ref = from . dec_ref . enc_ref"@@ -1189,5 +1256,6 @@ , testProperty "Tag64" (prop_decodeRefdecodeImp (Proxy :: Proxy TokTag64)) , testProperty "Simple" (prop_decodeRefdecodeImp (Proxy :: Proxy Ref.Simple)) , testProperty "Term" (prop_decodeRefdecodeImp (Proxy :: Proxy Ref.Term))+ , testProperty "ByteArray" (prop_decodeRefdecodeImp (Proxy :: Proxy TokByteArray)) ] ]
tests/Tests/Reference/Implementation.hs view
@@ -27,6 +27,7 @@ fromUInt, toUInt, canonicaliseUInt,+ lengthUInt, Simple(..), fromSimple,