blob: 418ea5ed300f58941150ed5d999315d423d7fee4 [file] [log] [blame]
#ifndef AOS_FLATBUFFER_MERGE_H_
#define AOS_FLATBUFFER_MERGE_H_
#include <cstddef>
#include <string>
#include "aos/flatbuffers.h"
#include "flatbuffers/flatbuffers.h"
namespace aos {
flatbuffers::DetachedBuffer MergeFlatBuffers(
const flatbuffers::TypeTable *typetable, const uint8_t *data1,
const uint8_t *data2);
// 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::Offset<flatbuffers::Table> MergeFlatBuffers(
const flatbuffers::TypeTable *typetable, const flatbuffers::Table *t1,
const flatbuffers::Table *t2, flatbuffers::FlatBufferBuilder *fbb);
template <class T>
inline flatbuffers::Offset<T> MergeFlatBuffers(
const flatbuffers::Table *t1,
const flatbuffers::Table *t2, flatbuffers::FlatBufferBuilder *fbb) {
return MergeFlatBuffers(T::MiniReflectTypeTable(), t1, t2, fbb).o;
}
template <class T>
inline flatbuffers::DetachedBuffer MergeFlatBuffers(const uint8_t *data1,
const uint8_t *data2) {
return MergeFlatBuffers(T::MiniReflectTypeTable(), data1, data2);
}
template <class T>
inline flatbuffers::DetachedBuffer MergeFlatBuffers(
const flatbuffers::DetachedBuffer &data1,
const flatbuffers::DetachedBuffer &data2) {
return MergeFlatBuffers(T::MiniReflectTypeTable(), data1.data(),
data2.data());
}
template <class T>
inline aos::FlatbufferDetachedBuffer<T> MergeFlatBuffers(
const aos::Flatbuffer<T> &fb1, const aos::Flatbuffer<T> &fb2) {
const uint8_t *data1 = fb1.data();
const uint8_t *data2 = fb2.data();
return aos::FlatbufferDetachedBuffer<T>(
MergeFlatBuffers(T::MiniReflectTypeTable(), data1, data2));
}
template <class T>
inline aos::FlatbufferDetachedBuffer<T> MergeFlatBuffers(const T *fb1,
const T *fb2) {
flatbuffers::FlatBufferBuilder fbb;
fbb.ForceDefaults(true);
fbb.Finish(MergeFlatBuffers<T>(
reinterpret_cast<const flatbuffers::Table *>(fb1),
reinterpret_cast<const flatbuffers::Table *>(fb2), &fbb));
return aos::FlatbufferDetachedBuffer<T>(fbb.Release());
}
template <class T>
inline flatbuffers::Offset<T> CopyFlatBuffer(
const T *t1, flatbuffers::FlatBufferBuilder *fbb) {
return MergeFlatBuffers<T>(reinterpret_cast<const flatbuffers::Table *>(t1),
nullptr, fbb);
}
template <class T>
inline FlatbufferDetachedBuffer<T> CopyFlatBuffer(const T *t) {
flatbuffers::FlatBufferBuilder fbb;
fbb.ForceDefaults(true);
fbb.Finish(CopyFlatBuffer<T>(t, &fbb));
return FlatbufferDetachedBuffer<T>(fbb.Release());
}
// Compares 2 flatbuffers. Returns true if they match, false otherwise.
bool CompareFlatBuffer(const flatbuffers::TypeTable *typetable,
const flatbuffers::Table *t1,
const flatbuffers::Table *t2);
template <class T>
inline bool CompareFlatBuffer(const T *t1, const T *t2) {
return CompareFlatBuffer(T::MiniReflectTypeTable(),
reinterpret_cast<const flatbuffers::Table *>(t1),
reinterpret_cast<const flatbuffers::Table *>(t2));
}
} // namespace aos
#endif // AOS_FLATBUFFER_MERGE_H_