Add a Flatbuffers containing object, and more variants
We now have DetachedBuffers which represent flatbuffers, the new
Flatbuffer object, and Table objects. It should be easy to merge and
copy these various objects now. (And print).
Change-Id: Ie8fcff1e97f0ae5a7ef8a3becb1be467010460dc
diff --git a/aos/flatbuffer_merge.cc b/aos/flatbuffer_merge.cc
index 3f72bb9..c8cc742 100644
--- a/aos/flatbuffer_merge.cc
+++ b/aos/flatbuffer_merge.cc
@@ -15,20 +15,14 @@
OffsetAndFieldOffset(flatbuffers::voffset_t new_field_offset,
flatbuffers::Offset<flatbuffers::String> new_element)
: field_offset(new_field_offset), element(new_element) {}
+ OffsetAndFieldOffset(flatbuffers::voffset_t new_field_offset,
+ flatbuffers::Offset<flatbuffers::Table> new_element)
+ : field_offset(new_field_offset), element(new_element.o) {}
flatbuffers::voffset_t field_offset;
flatbuffers::Offset<flatbuffers::String> element;
};
-// Merges 2 flat buffers with the provided type table into the builder. Returns
-// the offset to the flatbuffers.
-// One or both of t1 and t2 must be non-null. If one is null, this method
-// coppies instead of merging.
-flatbuffers::uoffset_t MergeFlatBuffers(const flatbuffers::TypeTable *typetable,
- const flatbuffers::Table *t1,
- const flatbuffers::Table *t2,
- flatbuffers::FlatBufferBuilder *fbb);
-
// Merges a single element to a builder for the provided field.
// One or both of t1 and t2 must be non-null. If one is null, this method
// copies instead of merging.
@@ -291,11 +285,10 @@
for (auto i = vec2->rbegin(); i != vec2->rend(); ++i) {
const flatbuffers::Table *t = *i;
- flatbuffers::uoffset_t end =
+ flatbuffers::Offset<flatbuffers::Table> end =
MergeFlatBuffers(sub_typetable, t, nullptr, fbb);
- object_elements.emplace_back(
- flatbuffers::Offset<flatbuffers::Table>(end));
+ object_elements.emplace_back(end);
}
}
if (t1_has) {
@@ -305,11 +298,10 @@
for (auto i = vec1->rbegin(); i != vec1->rend(); ++i) {
const flatbuffers::Table *t = *i;
- flatbuffers::uoffset_t end =
+ flatbuffers::Offset<flatbuffers::Table> end =
MergeFlatBuffers(sub_typetable, t, nullptr, fbb);
- object_elements.emplace_back(
- flatbuffers::Offset<flatbuffers::Table>(end));
+ object_elements.emplace_back(end);
}
}
@@ -329,10 +321,11 @@
}
}
-flatbuffers::uoffset_t MergeFlatBuffers(const flatbuffers::TypeTable *typetable,
- const flatbuffers::Table *t1,
- const flatbuffers::Table *t2,
- flatbuffers::FlatBufferBuilder *fbb) {
+} // namespace
+
+flatbuffers::Offset<flatbuffers::Table> MergeFlatBuffers(
+ const flatbuffers::TypeTable *typetable, const flatbuffers::Table *t1,
+ const flatbuffers::Table *t2, flatbuffers::FlatBufferBuilder *fbb) {
::std::vector<OffsetAndFieldOffset> elements;
// We need to do this in 2 passes
@@ -503,15 +496,9 @@
return fbb->EndTable(start);
}
-} // namespace
-
-::std::vector<uint8_t> MergeFlatBuffers(const flatbuffers::TypeTable *typetable,
- const uint8_t *data1,
- const uint8_t *data2) {
- // Build up a builder.
- flatbuffers::FlatBufferBuilder fbb;
- fbb.ForceDefaults(1);
-
+flatbuffers::Offset<flatbuffers::Table> MergeFlatBuffers(
+ const flatbuffers::TypeTable *typetable, const uint8_t *data1,
+ const uint8_t *data2, flatbuffers::FlatBufferBuilder *fbb) {
// Grab the 2 tables.
const flatbuffers::Table *t1 =
data1 != nullptr ? flatbuffers::GetRoot<flatbuffers::Table>(data1)
@@ -522,14 +509,21 @@
// And then do the actual build. This doesn't contain finish so we can nest
// them nicely.
- flatbuffers::uoffset_t end = MergeFlatBuffers(typetable, t1, t2, &fbb);
+ return flatbuffers::Offset<flatbuffers::Table>(
+ MergeFlatBuffers(typetable, t1, t2, fbb));
+}
+
+flatbuffers::DetachedBuffer MergeFlatBuffers(
+ const flatbuffers::TypeTable *typetable, const uint8_t *data1,
+ const uint8_t *data2) {
+ // Build up a builder.
+ flatbuffers::FlatBufferBuilder fbb;
+ fbb.ForceDefaults(1);
// Finish up the buffer and return it.
- fbb.Finish(flatbuffers::Offset<flatbuffers::Table>(end));
+ fbb.Finish(MergeFlatBuffers(typetable, data1, data2, &fbb));
- const uint8_t *buf = fbb.GetBufferPointer();
- const int size = fbb.GetSize();
- return ::std::vector<uint8_t>(buf, buf + size);
+ return fbb.Release();
}
} // namespace aos