• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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