diff --git a/orc-rt/include/orc-rt/SimplePackedSerialization.h b/orc-rt/include/orc-rt/SimplePackedSerialization.h index 7ac1cf2367dca..f60ccad666ab1 100644 --- a/orc-rt/include/orc-rt/SimplePackedSerialization.h +++ b/orc-rt/include/orc-rt/SimplePackedSerialization.h @@ -172,6 +172,28 @@ class SPSSerializationTraits< } }; +class SPSSize; + +/// SPSSize is serializable to/from size_t. Wire size is 64-bits. +template <> class SPSSerializationTraits { +public: + static size_t size(const size_t &Value) { + return SPSArgList::size(static_cast(Value)); + } + static bool serialize(SPSOutputBuffer &OB, const size_t &Value) { + return SPSArgList::serialize(OB, static_cast(Value)); + } + static bool deserialize(SPSInputBuffer &IB, size_t &Value) { + uint64_t Tmp; + if (!SPSArgList::deserialize(IB, Tmp)) + return false; + if (Tmp > std::numeric_limits::max()) + return false; + Value = Tmp; + return true; + } +}; + /// Any empty placeholder suitable as a substitute for void when deserializing class SPSEmpty {}; diff --git a/orc-rt/unittests/SimplePackedSerializationTest.cpp b/orc-rt/unittests/SimplePackedSerializationTest.cpp index 8b4a8d2f64d56..c3df499da510f 100644 --- a/orc-rt/unittests/SimplePackedSerializationTest.cpp +++ b/orc-rt/unittests/SimplePackedSerializationTest.cpp @@ -103,6 +103,11 @@ TEST(SimplePackedSerializationTest, UInt64Serialization) { testFixedIntegralTypeSerialization(); } +TEST(SimplePackedSerializationTest, SizeTSerialization) { + size_t V = 42; + blobSerializationRoundTrip(V); +} + TEST(SimplePackedSerializationTest, SequenceSerialization) { std::vector V({1, 2, -47, 139}); blobSerializationRoundTrip, std::vector>(V);