Skip to content

Commit 7138fab

Browse files
committed
[ORC-RT] Add SPS serialization for std::tuple.
This will be used in upcoming changes to macho_platform.
1 parent 6e8f7d5 commit 7138fab

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

compiler-rt/lib/orc/simple_packed_serialization.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,44 @@ template <> class SPSSerializationTraits<SPSSequence<char>, span<const char>> {
385385
}
386386
};
387387

388+
/// SPSTuple serialization for std::tuple.
389+
template <typename... SPSTagTs, typename... Ts>
390+
class SPSSerializationTraits<SPSTuple<SPSTagTs...>, std::tuple<Ts...>> {
391+
private:
392+
using TupleArgList = typename SPSTuple<SPSTagTs...>::AsArgList;
393+
using ArgIndices = std::make_index_sequence<sizeof...(Ts)>;
394+
395+
template <std::size_t... I>
396+
static size_t size(const std::tuple<Ts...> &T, std::index_sequence<I...>) {
397+
return TupleArgList::size(std::get<I>(T)...);
398+
}
399+
400+
template <std::size_t... I>
401+
static bool serialize(SPSOutputBuffer &OB, const std::tuple<Ts...> &T,
402+
std::index_sequence<I...>) {
403+
return TupleArgList::serialize(OB, std::get<I>(T)...);
404+
}
405+
406+
template <std::size_t... I>
407+
static bool deserialize(SPSInputBuffer &IB, std::tuple<Ts...> &T,
408+
std::index_sequence<I...>) {
409+
return TupleArgList::deserialize(IB, std::get<I>(T)...);
410+
}
411+
412+
public:
413+
static size_t size(const std::tuple<Ts...> &T) {
414+
return size(T, ArgIndices{});
415+
}
416+
417+
static bool serialize(SPSOutputBuffer &OB, const std::tuple<Ts...> &T) {
418+
return serialize(OB, T, ArgIndices{});
419+
}
420+
421+
static bool deserialize(SPSInputBuffer &IB, std::tuple<Ts...> &T) {
422+
return deserialize(IB, T, ArgIndices{});
423+
}
424+
};
425+
388426
/// SPSTuple serialization for std::pair.
389427
template <typename SPSTagT1, typename SPSTagT2, typename T1, typename T2>
390428
class SPSSerializationTraits<SPSTuple<SPSTagT1, SPSTagT2>, std::pair<T1, T2>> {

compiler-rt/lib/orc/tests/unit/simple_packed_serialization_test.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ TEST(SimplePackedSerializationTest, SpanSerialization) {
154154
EXPECT_EQ(InS.data(), Buffer.get() + sizeof(uint64_t));
155155
}
156156

157+
TEST(SimplePackedSerializationTest, StdTupleSerialization) {
158+
std::tuple<int32_t, std::string, bool> P(42, "foo", true);
159+
blobSerializationRoundTrip<SPSTuple<int32_t, SPSString, bool>>(P);
160+
}
161+
157162
TEST(SimplePackedSerializationTest, StdPairSerialization) {
158163
std::pair<int32_t, std::string> P(42, "foo");
159164
blobSerializationRoundTrip<SPSTuple<int32_t, SPSString>,

0 commit comments

Comments
 (0)