Skip to content

Commit 870fc84

Browse files
committed
[ORC-RT] Add SPS serialization for span<const char> / SPSSequence<char>.
1 parent 64990f1 commit 870fc84

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

compiler-rt/lib/orc/simple_packed_serialization.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,27 @@ class SPSSerializationTraits<SPSSequence<SPSElementTagT>, SequenceT,
354354
}
355355
};
356356

357+
/// Trivial serialization / deserialization for span<char>
358+
template <> class SPSSerializationTraits<SPSSequence<char>, span<const char>> {
359+
public:
360+
static size_t size(const span<const char> &S) {
361+
return SPSArgList<uint64_t>::size(static_cast<uint64_t>(S.size())) +
362+
S.size();
363+
}
364+
static bool serialize(SPSOutputBuffer &OB, const span<const char> &S) {
365+
if (!SPSArgList<uint64_t>::serialize(OB, static_cast<uint64_t>(S.size())))
366+
return false;
367+
return OB.write(S.data(), S.size());
368+
}
369+
static bool deserialize(SPSInputBuffer &IB, span<const char> &S) {
370+
uint64_t Size;
371+
if (!SPSArgList<uint64_t>::deserialize(IB, Size))
372+
return false;
373+
S = span<const char>(IB.data(), Size);
374+
return IB.skip(Size);
375+
}
376+
};
377+
357378
/// SPSTuple serialization for std::pair.
358379
template <typename SPSTagT1, typename SPSTagT2, typename T1, typename T2>
359380
class SPSSerializationTraits<SPSTuple<SPSTagT1, SPSTagT2>, std::pair<T1, T2>> {

compiler-rt/lib/orc/unittests/simple_packed_serialization_test.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,30 @@ TEST(SimplePackedSerializationTest, StringViewCharSequenceSerialization) {
130130
blobSerializationRoundTrip<SPSString, string_view>(string_view(HW));
131131
}
132132

133+
TEST(SimplePackedSerializationTest, SpanSerialization) {
134+
const char Data[] = {3, 2, 1, 0, 1, 2, 3}; // Span should handle nulls.
135+
span<const char> OutS(Data, sizeof(Data));
136+
137+
size_t Size = SPSArgList<SPSSequence<char>>::size(OutS);
138+
auto Buffer = std::make_unique<char[]>(Size);
139+
SPSOutputBuffer OB(Buffer.get(), Size);
140+
141+
EXPECT_TRUE(SPSArgList<SPSSequence<char>>::serialize(OB, OutS));
142+
143+
SPSInputBuffer IB(Buffer.get(), Size);
144+
145+
span<const char> InS;
146+
147+
EXPECT_TRUE(SPSArgList<SPSSequence<char>>::deserialize(IB, InS));
148+
149+
// Check that the serialized and deserialized values match.
150+
EXPECT_EQ(InS.size(), OutS.size());
151+
EXPECT_EQ(memcmp(OutS.data(), InS.data(), InS.size()), 0);
152+
153+
// Check that the span points directly to the input buffer.
154+
EXPECT_EQ(InS.data(), Buffer.get() + sizeof(uint64_t));
155+
}
156+
133157
TEST(SimplePackedSerializationTest, StdPairSerialization) {
134158
std::pair<int32_t, std::string> P(42, "foo");
135159
blobSerializationRoundTrip<SPSTuple<int32_t, SPSString>,

0 commit comments

Comments
 (0)