From 277a8acdced9f7b2d26f2080481e80b1362644d7 Mon Sep 17 00:00:00 2001 From: "Dr. Patrick Urbanke" Date: Sun, 19 Jan 2025 20:54:37 +0100 Subject: [PATCH] Added calc_vtable_offset --- include/rfl/flatbuf/Reader.hpp | 10 ++++------ include/rfl/flatbuf/Writer.hpp | 6 +++--- include/rfl/flatbuf/calc_vtable_offset.hpp | 17 +++++++++++++++++ include/rfl/parsing/ViewReader.hpp | 3 +++ 4 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 include/rfl/flatbuf/calc_vtable_offset.hpp diff --git a/include/rfl/flatbuf/Reader.hpp b/include/rfl/flatbuf/Reader.hpp index 4ec1398d..9ba619b3 100644 --- a/include/rfl/flatbuf/Reader.hpp +++ b/include/rfl/flatbuf/Reader.hpp @@ -16,6 +16,7 @@ #include "../always_false.hpp" #include "../internal/is_literal.hpp" #include "../internal/ptr_cast.hpp" +#include "calc_vtable_offset.hpp" namespace rfl::flatbuf { @@ -124,13 +125,10 @@ class Reader { template std::optional read_object(const ObjectReader& _object_reader, const InputObjectType& _obj) const noexcept { - // TODO - // constexpr auto offset_array = - // offset_array; - for (size_t i = 0; i < 0 /*TODO offset_array.size()*/; ++i) { + constexpr size_t size = ObjectReader::size(); + for (size_t i = 0; i < size; ++i) { _object_reader.read( - i, - InputVarType{_obj.val_->GetAddressOf(0 /* TODO offset_array[i]*/)}); + i, InputVarType{_obj.val_->GetAddressOf(calc_vtable_offset(i))}); } } diff --git a/include/rfl/flatbuf/Writer.hpp b/include/rfl/flatbuf/Writer.hpp index 5f2ad043..791e0acd 100644 --- a/include/rfl/flatbuf/Writer.hpp +++ b/include/rfl/flatbuf/Writer.hpp @@ -23,6 +23,7 @@ #include "../always_false.hpp" #include "../internal/is_literal.hpp" #include "../internal/ptr_cast.hpp" +#include "calc_vtable_offset.hpp" namespace rfl::flatbuf { @@ -39,7 +40,6 @@ class Writer { }; struct FlatbufOutputObject { - flatbuffers::voffset_t* field_offsets_ = nullptr; flatbuffers::uoffset_t offset_ = 0; size_t ix_ = 0; }; @@ -179,7 +179,7 @@ class Writer { OutputObjectType* _parent) const noexcept { if constexpr (std::is_same, std::string>()) { const auto str = fbb_->CreateString(_var.c_str(), _var.size()); - fbb_->AddOffset(_parent->field_offsets_[_parent->ix_++], str); + fbb_->AddOffset(calc_vtable_offset(_parent->ix_++), str); // TODO // } else if constexpr (std::is_same, @@ -188,7 +188,7 @@ class Writer { } else if constexpr (std::is_floating_point>() || std::is_same, bool>() || std::is_integral>()) { - fbb_->AddElement(_parent->field_offsets_[_parent->ix_++], _var); + fbb_->AddElement(calc_vtable_offset(_parent->ix_++), _var); // TODO //} else if constexpr (internal::is_literal_v) { diff --git a/include/rfl/flatbuf/calc_vtable_offset.hpp b/include/rfl/flatbuf/calc_vtable_offset.hpp new file mode 100644 index 00000000..a8a6b704 --- /dev/null +++ b/include/rfl/flatbuf/calc_vtable_offset.hpp @@ -0,0 +1,17 @@ +#ifndef RFL_FLATBUF_CALCVTABLEOFFSET_HPP_ +#define RFL_FLATBUF_CALCVTABLEOFFSET_HPP_ + +#include + +namespace rfl::flatbuf { + +inline flatbuffers::voffset_t calc_vtable_offset(const size_t _i) { + return 2 * sizeof(flatbuffers::voffset_t) + + static_cast(_i) * + sizeof(flatbuffers::voffset_t); +} + +} // namespace rfl::flatbuf + +#endif + diff --git a/include/rfl/parsing/ViewReader.hpp b/include/rfl/parsing/ViewReader.hpp index a9d97c82..198b7048 100644 --- a/include/rfl/parsing/ViewReader.hpp +++ b/include/rfl/parsing/ViewReader.hpp @@ -44,6 +44,9 @@ class ViewReader { std::make_integer_sequence()); } + /// Returns the size of the underlying view. + static constexpr size_t size() { return size_; } + private: template static bool is_matching(const int _current_index) {