Skip to content

Commit 2c64a68

Browse files
Refactored more classes
1 parent fe935c4 commit 2c64a68

4 files changed

Lines changed: 82 additions & 24 deletions

File tree

include/rfl/parsing/Parser_array.hpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,22 @@
1515
#include "call_destructors_on_array_where_necessary.hpp"
1616
#include "schema/Type.hpp"
1717

18-
namespace rfl {
19-
namespace parsing {
18+
namespace rfl::parsing {
19+
20+
template <class T>
21+
struct is_array : std::false_type {};
22+
23+
template <class T, size_t _size>
24+
struct is_array<std::array<T, _size>> : std::true_type {
25+
using element_type = T;
26+
static constexpr size_t size = _size;
27+
};
28+
29+
template <class T>
30+
constexpr bool is_array_v = is_array<std::remove_cvref_t<T>>::value;
31+
2032
template <class R, class W, class T, size_t _size, class ProcessorsType>
21-
requires AreReaderAndWriter<R, W, std::array<T, _size>>
22-
struct Parser<R, W, std::array<T, _size>, ProcessorsType> {
33+
struct ParserArray {
2334
public:
2435
using InputArrayType = typename R::InputArrayType;
2536
using InputVarType = typename R::InputVarType;
@@ -93,7 +104,6 @@ struct Parser<R, W, std::array<T, _size>, ProcessorsType> {
93104
}
94105
};
95106

96-
} // namespace parsing
97-
} // namespace rfl
107+
} // namespace rfl::parsing
98108

99109
#endif

include/rfl/parsing/Parser_default.hpp

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,15 @@
2626
#include "AreReaderAndWriter.hpp"
2727
#include "Parent.hpp"
2828
#include "ParserSharedPtr.hpp"
29+
#include "Parser_array.hpp"
30+
#include "Parser_base.hpp"
2931
#include "Parser_box.hpp"
3032
#include "Parser_optional.hpp"
3133
#include "Parser_ref.hpp"
3234
#include "Parser_reference_wrapper.hpp"
35+
#include "Parser_rfl_tuple.hpp"
36+
#include "Parser_tuple.hpp"
3337
#include "Parser_unique_ptr.hpp"
34-
#include "Parser_base.hpp"
3538
#include "call_destructors_where_necessary.hpp"
3639
#include "is_tagged_union_wrapper.hpp"
3740
#include "make_type_name.hpp"
@@ -64,7 +67,7 @@ struct Parser {
6467

6568
} else if constexpr (is_unique_ptr_v<T>) {
6669
return ParserUniquePtr<R, W, typename T::element_type,
67-
ProcessorsType>::read(_r, _var);
70+
ProcessorsType>::read(_r, _var);
6871

6972
} else if constexpr (is_optional_v<T>) {
7073
return ParserOptional<R, W, typename std::remove_cvref_t<T>::value_type,
@@ -84,6 +87,17 @@ struct Parser {
8487
return ParserReferenceWrapper<R, W, typename std::remove_cvref_t<T>::type,
8588
ProcessorsType>::read(_r, _var);
8689

90+
} else if constexpr (is_array_v<T>) {
91+
using IsArray = is_array<T>;
92+
return ParserArray<R, W, typename IsArray::element_type, IsArray::size,
93+
ProcessorsType>::read(_r, _var);
94+
95+
} else if constexpr (is_tuple_v<T>) {
96+
return ParserTuple<R, W, T, ProcessorsType>::read(_r, _var);
97+
98+
} else if constexpr (is_rfl_tuple_v<T>) {
99+
return ParserRflTuple<R, W, T, ProcessorsType>::read(_r, _var);
100+
87101
} else if constexpr (internal::has_read_reflector<T>) {
88102
const auto wrap_in_t = [](auto&& _named_tuple) -> Result<T> {
89103
try {
@@ -164,6 +178,17 @@ struct Parser {
164178
ParserReferenceWrapper<R, W, typename std::remove_cvref_t<T>::type,
165179
ProcessorsType>::write(_w, _var, _parent);
166180

181+
} else if constexpr (is_array_v<T>) {
182+
using IsArray = is_array<T>;
183+
ParserArray<R, W, typename IsArray::element_type, IsArray::size,
184+
ProcessorsType>::write(_w, _var, _parent);
185+
186+
} else if constexpr (is_tuple_v<T>) {
187+
ParserTuple<R, W, T, ProcessorsType>::write(_w, _var, _parent);
188+
189+
} else if constexpr (is_rfl_tuple_v<T>) {
190+
ParserRflTuple<R, W, T, ProcessorsType>::write(_w, _var, _parent);
191+
167192
} else if constexpr (internal::has_write_reflector<T>) {
168193
Parser<R, W, typename Reflector<T>::ReflType, ProcessorsType>::write(
169194
_w, Reflector<T>::from(_var), _parent);
@@ -228,6 +253,17 @@ struct Parser {
228253
return ParserReferenceWrapper<R, W, typename U::type,
229254
ProcessorsType>::to_schema(_definitions);
230255

256+
} else if constexpr (is_array_v<U>) {
257+
using IsArray = is_array<U>;
258+
return ParserArray<R, W, typename IsArray::element_type, IsArray::size,
259+
ProcessorsType>::to_schema(_definitions);
260+
261+
} else if constexpr (is_tuple_v<U>) {
262+
return ParserTuple<R, W, U, ProcessorsType>::to_schema(_definitions);
263+
264+
} else if constexpr (is_rfl_tuple_v<U>) {
265+
return ParserRflTuple<R, W, U, ProcessorsType>::to_schema(_definitions);
266+
231267
} else if constexpr (rfl::internal::is_description_v<U>) {
232268
return make_description<U>(_definitions);
233269

include/rfl/parsing/Parser_rfl_tuple.hpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,27 @@
66
#include "Parser_base.hpp"
77
#include "TupleParser.hpp"
88

9-
namespace rfl {
10-
namespace parsing {
9+
namespace rfl::parsing {
10+
11+
template <class T>
12+
struct is_rfl_tuple : std::false_type {};
13+
14+
template <class... Ts>
15+
struct is_rfl_tuple<rfl::Tuple<Ts...>> : std::true_type {};
16+
17+
template <class T>
18+
constexpr bool is_rfl_tuple_v = is_rfl_tuple<std::remove_cvref_t<T>>::value;
1119

1220
/**
1321
* @brief Parser specialization for rfl::Tuple.
1422
*/
15-
template <class R, class W, class... Ts, class ProcessorsType>
16-
requires AreReaderAndWriter<R, W, rfl::Tuple<Ts...>>
17-
struct Parser<R, W, rfl::Tuple<Ts...>, ProcessorsType>
23+
template <class R, class W, class T, class ProcessorsType>
24+
struct ParserRflTuple
1825
: public TupleParser<
1926
R, W, /*_ignore_empty_containers=*/false,
2027
/*_all_required=*/internal::no_optionals_v<ProcessorsType>,
21-
ProcessorsType, rfl::Tuple<Ts...>> {};
28+
ProcessorsType, T> {};
2229

23-
} // namespace parsing
24-
} // namespace rfl
30+
} // namespace rfl::parsing
2531

2632
#endif

include/rfl/parsing/Parser_tuple.hpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,27 @@
77
#include "Parser_base.hpp"
88
#include "TupleParser.hpp"
99

10-
namespace rfl {
11-
namespace parsing {
10+
namespace rfl::parsing {
11+
12+
template <class T>
13+
struct is_tuple : std::false_type {};
14+
15+
template <class... Ts>
16+
struct is_tuple<std::tuple<Ts...>> : std::true_type {};
17+
18+
template <class T>
19+
constexpr bool is_tuple_v = is_tuple<std::remove_cvref_t<T>>::value;
1220

1321
/**
1422
* @brief Parser specialization for std::tuple.
1523
*/
16-
template <class R, class W, class... Ts, class ProcessorsType>
17-
requires AreReaderAndWriter<R, W, std::tuple<Ts...>>
18-
struct Parser<R, W, std::tuple<Ts...>, ProcessorsType>
24+
template <class R, class W, class T, class ProcessorsType>
25+
struct ParserTuple
1926
: public TupleParser<
2027
R, W, /*_ignore_empty_containers=*/false,
2128
/*_all_required=*/internal::no_optionals_v<ProcessorsType>,
22-
ProcessorsType, std::tuple<Ts...>> {};
29+
ProcessorsType, T> {};
2330

24-
} // namespace parsing
25-
} // namespace rfl
31+
} // namespace rfl::parsing
2632

2733
#endif

0 commit comments

Comments
 (0)