This commit is contained in:
Mars 2024-06-08 15:53:06 -04:00
parent bd402f57f5
commit 3ea546fe08
Signed by: pupbrained
GPG key ID: 874E22DF2F9DFCB5
166 changed files with 18360 additions and 18199 deletions

View file

@ -12,34 +12,40 @@ namespace rfl {
/// Because of that, we require all of the fields and then set them to
/// nullptr, if necessary.
template <class ProcessorsType, class... FieldTypes>
requires AreReaderAndWriter<msgpack::Reader,
msgpack::Writer,
NamedTuple<FieldTypes...>>
struct Parser<msgpack::Reader,
msgpack::Writer,
NamedTuple<FieldTypes...>,
ProcessorsType>
: public NamedTupleParser<msgpack::Reader,
msgpack::Writer,
/*_ignore_empty_containers=*/false,
/*_all_required=*/true,
ProcessorsType,
FieldTypes...> {};
requires AreReaderAndWriter<
msgpack::Reader,
msgpack::Writer,
NamedTuple<FieldTypes...>>
struct Parser<
msgpack::Reader,
msgpack::Writer,
NamedTuple<FieldTypes...>,
ProcessorsType>
: public NamedTupleParser<
msgpack::Reader,
msgpack::Writer,
/*_ignore_empty_containers=*/false,
/*_all_required=*/true,
ProcessorsType,
FieldTypes...> {};
template <class ProcessorsType, class... Ts>
requires AreReaderAndWriter<msgpack::Reader,
msgpack::Writer,
std::tuple<Ts...>>
struct Parser<msgpack::Reader,
msgpack::Writer,
std::tuple<Ts...>,
ProcessorsType>
: public TupleParser<msgpack::Reader,
msgpack::Writer,
/*_ignore_empty_containers=*/false,
/*_all_required=*/true,
ProcessorsType,
Ts...> {};
requires AreReaderAndWriter<
msgpack::Reader,
msgpack::Writer,
std::tuple<Ts...>>
struct Parser<
msgpack::Reader,
msgpack::Writer,
std::tuple<Ts...>,
ProcessorsType>
: public TupleParser<
msgpack::Reader,
msgpack::Writer,
/*_ignore_empty_containers=*/false,
/*_all_required=*/true,
ProcessorsType,
Ts...> {};
} // namespace parsing
} // namespace rfl

View file

@ -33,13 +33,15 @@ namespace rfl {
(requires(InputVarType var) { T::from_msgpack_obj(var); });
rfl::Result<InputVarType> get_field(
const std::string& _name,
const InputObjectType& _obj) const noexcept {
const std::string& _name,
const InputObjectType& _obj
) const noexcept {
for (uint32_t i = 0; i < _obj.size; ++i) {
const auto& key = _obj.ptr[i].key;
if (key.type != MSGPACK_OBJECT_STR) {
return Error("Key in element " + std::to_string(i) +
" was not a string.");
return Error(
"Key in element " + std::to_string(i) + " was not a string."
);
}
const auto current_name =
std::string_view(key.via.str.ptr, key.via.str.size);
@ -79,22 +81,23 @@ namespace rfl {
return rfl::Error(
"Could not cast to numeric value. The type must be integral, "
"float "
"or double.");
"or double."
);
} else {
static_assert(rfl::always_false_v<T>, "Unsupported type.");
}
}
rfl::Result<InputArrayType> to_array(
const InputVarType& _var) const noexcept {
rfl::Result<InputArrayType> to_array(const InputVarType& _var
) const noexcept {
if (_var.type != MSGPACK_OBJECT_ARRAY) {
return Error("Could not cast to an array.");
}
return _var.via.array;
}
rfl::Result<InputObjectType> to_object(
const InputVarType& _var) const noexcept {
rfl::Result<InputObjectType> to_object(const InputVarType& _var
) const noexcept {
if (_var.type != MSGPACK_OBJECT_MAP) {
return Error("Could not cast to a map.");
}
@ -103,8 +106,9 @@ namespace rfl {
template <class ArrayReader>
std::optional<Error> read_array(
const ArrayReader& _array_reader,
const InputArrayType& _arr) const noexcept {
const ArrayReader& _array_reader,
const InputArrayType& _arr
) const noexcept {
for (uint32_t i = 0; i < _arr.size; ++i) {
const auto err = _array_reader.read(_arr.ptr[i]);
if (err) { return err; }
@ -114,14 +118,16 @@ namespace rfl {
template <class ObjectReader>
std::optional<Error> read_object(
const ObjectReader& _object_reader,
const InputObjectType& _obj) const noexcept {
const ObjectReader& _object_reader,
const InputObjectType& _obj
) const noexcept {
for (uint32_t i = 0; i < _obj.size; ++i) {
const auto& key = _obj.ptr[i].key;
const auto& val = _obj.ptr[i].val;
if (key.type != MSGPACK_OBJECT_STR) {
return Error("Key in element " + std::to_string(i) +
" was not a string.");
return Error(
"Key in element " + std::to_string(i) + " was not a string."
);
}
const auto name = std::string_view(key.via.str.ptr, key.via.str.size);
_object_reader.read(name, val);
@ -130,8 +136,8 @@ namespace rfl {
}
template <class T>
rfl::Result<T> use_custom_constructor(
const InputVarType& _var) const noexcept {
rfl::Result<T> use_custom_constructor(const InputVarType& _var
) const noexcept {
try {
return T::from_msgpack_obj(_var);
} catch (std::exception& e) { return rfl::Error(e.what()); }

View file

@ -54,46 +54,51 @@ namespace rfl::msgpack {
}
OutputArrayType add_array_to_array(
const size_t _size,
OutputArrayType* _parent) const noexcept {
const size_t _size,
OutputArrayType* _parent
) const noexcept {
return new_array(_size);
}
OutputArrayType add_array_to_object(
const std::string_view& _name,
const size_t _size,
OutputObjectType* _parent) const noexcept {
const size_t _size,
OutputObjectType* _parent
) const noexcept {
msgpack_pack_str(pk_, _name.size());
msgpack_pack_str_body(pk_, _name.data(), _name.size());
return new_array(_size);
}
OutputObjectType add_object_to_array(
const size_t _size,
OutputArrayType* _parent) const noexcept {
const size_t _size,
OutputArrayType* _parent
) const noexcept {
return new_object(_size);
}
OutputObjectType add_object_to_object(
const std::string_view& _name,
const size_t _size,
OutputObjectType* _parent) const noexcept {
const size_t _size,
OutputObjectType* _parent
) const noexcept {
msgpack_pack_str(pk_, _name.size());
msgpack_pack_str_body(pk_, _name.data(), _name.size());
return new_object(_size);
}
template <class T>
OutputVarType add_value_to_array(const T& _var,
OutputArrayType* _parent) const noexcept {
OutputVarType add_value_to_array(const T& _var, OutputArrayType* _parent)
const noexcept {
return new_value(_var);
}
template <class T>
OutputVarType add_value_to_object(
const std::string_view& _name,
const T& _var,
OutputObjectType* _parent) const noexcept {
const T& _var,
OutputObjectType* _parent
) const noexcept {
msgpack_pack_str(pk_, _name.size());
msgpack_pack_str_body(pk_, _name.data(), _name.size());
return new_value(_var);
@ -104,8 +109,10 @@ namespace rfl::msgpack {
return OutputVarType {};
}
OutputVarType add_null_to_object(const std::string_view& _name,
OutputObjectType* _parent) const noexcept {
OutputVarType add_null_to_object(
const std::string_view& _name,
OutputObjectType* _parent
) const noexcept {
msgpack_pack_str(pk_, _name.size());
msgpack_pack_str_body(pk_, _name.data(), _name.size());
msgpack_pack_nil(pk_);

View file

@ -25,8 +25,8 @@ namespace rfl {
/// Parses an object from MSGPACK using reflection.
template <class T, class... Ps>
Result<internal::wrap_in_rfl_array_t<T>> read(const char* _bytes,
const size_t _size) {
Result<internal::wrap_in_rfl_array_t<T>>
read(const char* _bytes, const size_t _size) {
msgpack_zone mempool;
msgpack_zone_init(&mempool, 2048);
msgpack_object deserialized;
@ -46,7 +46,7 @@ namespace rfl {
template <class T, class... Ps>
auto read(std::istream& _stream) {
std::istreambuf_iterator<char> begin(_stream), end;
auto bytes = std::vector<char>(begin, end);
auto bytes = std::vector<char>(begin, end);
return read<T, Ps...>(bytes.data(), bytes.size());
}