File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1111
1212#include " ../Result.hpp"
1313#include " ../always_false.hpp"
14+ #include " ../internal/is_literal.hpp"
1415#include " ../parsing/schemaful/IsSchemafulReader.hpp"
1516
1617namespace 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 }
Original file line number Diff line number Diff line change 1111
1212#include " ../always_false.hpp"
1313#include " ../common.hpp"
14+ #include " ../internal/is_literal.hpp"
1415#include " ../parsing/schemaful/IsSchemafulWriter.hpp"
1516
1617namespace 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};
Original file line number Diff line number Diff line change @@ -18,7 +18,7 @@ struct Person {
1818};
1919
2020TEST (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
You can’t perform that action at this time.
0 commit comments