1 /**
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef LIBPANDABASE_SERIALIZER_STRUCT_TO_TUPLE_H
17 #define LIBPANDABASE_SERIALIZER_STRUCT_TO_TUPLE_H
18
19 #include <tuple>
20
21 namespace panda::serializer::internal {
22
23 template <size_t N>
24 struct StructToTupleImpl;
25
26 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
27 #define SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(N, ...) \
28 template <> \
29 struct StructToTupleImpl<N> { \
30 template <typename Struct> \
31 auto operator()(Struct &&str) const \
32 { \
33 auto [__VA_ARGS__] = std::forward<Struct>(str); \
34 return std::make_tuple(__VA_ARGS__); \
35 } \
36 }
37
38 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(1, e0);
39 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(2, e0, e1);
40 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(3, e0, e1, e2);
41 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(4, e0, e1, e2, e3);
42 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(5, e0, e1, e2, e3, e4);
43 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(6, e0, e1, e2, e3, e4, e5);
44 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(7, e0, e1, e2, e3, e4, e5, e6);
45 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(8, e0, e1, e2, e3, e4, e5, e6, e7);
46 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(9, e0, e1, e2, e3, e4, e5, e6, e7, e8);
47 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(10, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9);
48 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(11, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
49 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(12, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11);
50 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(13, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12);
51 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(14, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13);
52 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(15, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14);
53 SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL(16, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15);
54
55 #undef SERIALIZE_INTERNAL_STRUCT_TO_TUPLE_IMPL
56
57 template <std::size_t N, class Struct>
StructToTuple(Struct && str)58 auto StructToTuple(Struct &&str)
59 {
60 return StructToTupleImpl<N> {}(std::forward<Struct>(str));
61 }
62
63 } // namespace panda::serializer::internal
64
65 #endif // LIBPANDABASE_SERIALIZER_STRUCT_TO_TUPLE_H
66