blob: 16372ed22bd86f8dacee8533a28c1bddc7da41e6 [file] [log] [blame]
Austin Schuh09d7ffa2019-10-03 23:43:34 -07001#ifndef AOS_FLATBUFFER_MERGE_H_
2#define AOS_FLATBUFFER_MERGE_H_
3
4#include <cstddef>
5#include <string>
6
Austin Schuhe93d8642019-10-13 15:27:07 -07007#include "aos/flatbuffers.h"
Austin Schuh09d7ffa2019-10-03 23:43:34 -07008#include "flatbuffers/flatbuffers.h"
9
10namespace aos {
11
Austin Schuhe93d8642019-10-13 15:27:07 -070012flatbuffers::DetachedBuffer MergeFlatBuffers(
13 const flatbuffers::TypeTable *typetable, const uint8_t *data1,
14 const uint8_t *data2);
15
16// Merges 2 flat buffers with the provided type table into the builder. Returns
17// the offset to the flatbuffers.
18// One or both of t1 and t2 must be non-null. If one is null, this method
19// coppies instead of merging.
20flatbuffers::Offset<flatbuffers::Table> MergeFlatBuffers(
21 const flatbuffers::TypeTable *typetable, const flatbuffers::Table *t1,
22 const flatbuffers::Table *t2, flatbuffers::FlatBufferBuilder *fbb);
Austin Schuh09d7ffa2019-10-03 23:43:34 -070023
24template <class T>
Austin Schuhe93d8642019-10-13 15:27:07 -070025inline flatbuffers::Offset<T> MergeFlatBuffers(
26 const flatbuffers::Table *t1,
27 const flatbuffers::Table *t2, flatbuffers::FlatBufferBuilder *fbb) {
28 return MergeFlatBuffers(T::MiniReflectTypeTable(), t1, t2, fbb).o;
29}
30
31template <class T>
32inline flatbuffers::DetachedBuffer MergeFlatBuffers(const uint8_t *data1,
33 const uint8_t *data2) {
Austin Schuh09d7ffa2019-10-03 23:43:34 -070034 return MergeFlatBuffers(T::MiniReflectTypeTable(), data1, data2);
35}
36
Austin Schuhe93d8642019-10-13 15:27:07 -070037template <class T>
38inline flatbuffers::DetachedBuffer MergeFlatBuffers(
39 const flatbuffers::DetachedBuffer &data1,
40 const flatbuffers::DetachedBuffer &data2) {
41 return MergeFlatBuffers(T::MiniReflectTypeTable(), data1.data(),
42 data2.data());
43}
44
45template <class T>
46inline aos::Flatbuffer<T> MergeFlatBuffers(const aos::Flatbuffer<T> &fb1,
47 const aos::Flatbuffer<T> &fb2) {
48 return aos::Flatbuffer<T>(
49 MergeFlatBuffers(T::MiniReflectTypeTable(), fb1.data(), fb2.data()));
50}
51
52template <class T>
53inline aos::Flatbuffer<T> MergeFlatBuffers(const T *fb1, const T *fb2) {
54 return aos::Flatbuffer<T>(MergeFlatBuffers(
55 T::MiniReflectTypeTable(), reinterpret_cast<const uint8_t *>(fb1),
56 reinterpret_cast<const uint8_t *>(fb2)));
57}
58
59template <class T>
60inline flatbuffers::Offset<T> CopyFlatBuffer(
61 const T *t1, flatbuffers::FlatBufferBuilder *fbb) {
62 return MergeFlatBuffers<T>(reinterpret_cast<const flatbuffers::Table *>(t1),
63 nullptr, fbb);
64}
65
66template <class T>
67inline Flatbuffer<T> CopyFlatBuffer(const T *t) {
68 flatbuffers::FlatBufferBuilder fbb;
69 fbb.ForceDefaults(1);
70 fbb.Finish(CopyFlatBuffer<T>(t, &fbb));
71 return Flatbuffer<T>(fbb.Release());
72}
73
Austin Schuh09d7ffa2019-10-03 23:43:34 -070074} // namespace aos
75
76#endif // AOS_FLATBUFFER_MERGE_H_