Skip to content

Commit be0423b

Browse files
Added support for literals
1 parent adb818c commit be0423b

3 files changed

Lines changed: 27 additions & 8 deletions

File tree

include/rfl/cereal/Reader.hpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "../Result.hpp"
1313
#include "../always_false.hpp"
14+
#include "../internal/is_literal.hpp"
1415
#include "../parsing/schemaful/IsSchemafulReader.hpp"
1516

1617
namespace rfl::cereal {
@@ -53,9 +54,15 @@ struct Reader {
5354
template <class T>
5455
rfl::Result<T> to_basic_type(const InputVarType& _var) const noexcept {
5556
try {
56-
T value;
57-
(*_var.archive_)(value);
58-
return value;
57+
if constexpr (internal::is_literal_v<T>) {
58+
std::string str;
59+
(*_var.archive_)(str);
60+
return std::remove_cvref_t<T>::from_string(str);
61+
} else {
62+
T value;
63+
(*_var.archive_)(value);
64+
return value;
65+
}
5966
} catch (std::exception& e) {
6067
return error(std::string("Cereal read error: ") + e.what());
6168
}

include/rfl/cereal/Writer.hpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "../always_false.hpp"
1313
#include "../common.hpp"
14+
#include "../internal/is_literal.hpp"
1415
#include "../parsing/schemaful/IsSchemafulWriter.hpp"
1516

1617
namespace rfl::cereal {
@@ -166,29 +167,30 @@ class Writer {
166167

167168
template <class T>
168169
OutputVarType add_value_to_array(const T& _var, OutputArrayType*) const {
169-
(*archive_)(_var);
170+
add_value(_var);
170171
return OutputVarType{};
171172
}
172173

173174
template <class T>
174175
OutputVarType add_value_to_map(const std::string_view& _name, const T& _var,
175176
OutputMapType* _parent) const {
176177
add_string_view(_name);
178+
add_value(_var);
177179
return OutputVarType{};
178180
}
179181

180182
template <class T>
181183
OutputVarType add_value_to_object(const std::string_view& _name,
182184
const T& _var, OutputObjectType*) const {
183-
(*archive_)(_var);
185+
add_value(_var);
184186
return OutputVarType{};
185187
}
186188

187189
template <class T>
188190
OutputVarType add_value_to_union(const size_t _index, const T& _var,
189191
OutputUnionType* _parent) const {
190192
(*archive_)(_index);
191-
(*archive_)(_var);
193+
add_value(_var);
192194
return OutputVarType{};
193195
}
194196

@@ -225,6 +227,16 @@ class Writer {
225227
(*archive_)(::cereal::binary_data(_str.data(), _str.size()));
226228
}
227229

230+
template <class T>
231+
void add_value(const T& _var) const noexcept {
232+
using Type = std::remove_cvref_t<T>;
233+
if constexpr (internal::is_literal_v<Type>) {
234+
add_value(_var.str());
235+
} else {
236+
(*archive_)(_var);
237+
}
238+
}
239+
228240
private:
229241
CerealArchive* archive_;
230242
};

tests/cereal/test_add_struct_name.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct Person {
1818
};
1919

2020
TEST(cereal, test_add_struct_name) {
21-
/*const auto bart = Person{.first_name = "Bart",
21+
const auto bart = Person{.first_name = "Bart",
2222
.birthday = "1987-04-19",
2323
.age = 10,
2424
.email = "bart@simpson.com"};
@@ -40,6 +40,6 @@ TEST(cereal, test_add_struct_name) {
4040
.email = "homer@simpson.com",
4141
.children = std::vector<Person>({bart, lisa, maggie})};
4242

43-
write_and_read<rfl::AddStructName<"type">>(homer);*/
43+
write_and_read<rfl::AddStructName<"type">>(homer);
4444
}
4545
} // namespace test_add_struct_name

0 commit comments

Comments
 (0)