Reworked reflection.h to be more general.

e.g. support generic reading/writing from structs/vectors etc.

Change-Id: I2eb6e24db088a72da444d5c8df7e506e53d5bc2d
Tested: on Linux.
Bug: 22660837
parent 0e064e41
...@@ -25,6 +25,7 @@ set(FlatBuffers_Library_SRCS ...@@ -25,6 +25,7 @@ set(FlatBuffers_Library_SRCS
include/flatbuffers/reflection_generated.h include/flatbuffers/reflection_generated.h
src/idl_parser.cpp src/idl_parser.cpp
src/idl_gen_text.cpp src/idl_gen_text.cpp
src/reflection.cpp
) )
set(FlatBuffers_Compiler_SRCS set(FlatBuffers_Compiler_SRCS
...@@ -43,14 +44,9 @@ set(FlatHash_SRCS ...@@ -43,14 +44,9 @@ set(FlatHash_SRCS
) )
set(FlatBuffers_Tests_SRCS set(FlatBuffers_Tests_SRCS
include/flatbuffers/flatbuffers.h ${FlatBuffers_Library_SRCS}
include/flatbuffers/hash.h
include/flatbuffers/idl.h
include/flatbuffers/util.h
src/idl_parser.cpp
src/idl_gen_general.cpp
src/idl_gen_text.cpp
src/idl_gen_fbs.cpp src/idl_gen_fbs.cpp
src/idl_gen_general.cpp
tests/test.cpp tests/test.cpp
# file generate by running compiler on tests/monster_test.fbs # file generate by running compiler on tests/monster_test.fbs
${CMAKE_CURRENT_BINARY_DIR}/tests/monster_test_generated.h ${CMAKE_CURRENT_BINARY_DIR}/tests/monster_test_generated.h
......
...@@ -31,7 +31,9 @@ LOCAL_SRC_FILES := main.cpp \ ...@@ -31,7 +31,9 @@ LOCAL_SRC_FILES := main.cpp \
../../tests/test.cpp \ ../../tests/test.cpp \
../../src/idl_parser.cpp \ ../../src/idl_parser.cpp \
../../src/idl_gen_text.cpp \ ../../src/idl_gen_text.cpp \
../../src/idl_gen_fbs.cpp ../../src/idl_gen_fbs.cpp \
../../src/idl_gen_general.cpp \
../../src/reflection.cpp
LOCAL_LDLIBS := -llog -landroid LOCAL_LDLIBS := -llog -landroid
LOCAL_STATIC_LIBRARIES := android_native_app_glue flatbuffers LOCAL_STATIC_LIBRARIES := android_native_app_glue flatbuffers
LOCAL_ARM_MODE := arm LOCAL_ARM_MODE := arm
......
...@@ -353,6 +353,24 @@ private: ...@@ -353,6 +353,24 @@ private:
} }
}; };
// Represent a vector much like the template above, but in this case we
// don't know what the element types are (used with reflection.h).
class VectorOfAny {
public:
uoffset_t size() const { return EndianScalar(length_); }
const uint8_t *Data() const {
return reinterpret_cast<const uint8_t *>(&length_ + 1);
}
uint8_t *Data() {
return reinterpret_cast<uint8_t *>(&length_ + 1);
}
protected:
VectorOfAny();
uoffset_t length_;
};
// Convenient helper function to get the length of any vector, regardless // Convenient helper function to get the length of any vector, regardless
// of wether it is null or not (the field is not set). // of wether it is null or not (the field is not set).
template<typename T> static inline size_t VectorLength(const Vector<T> *v) { template<typename T> static inline size_t VectorLength(const Vector<T> *v) {
...@@ -995,6 +1013,9 @@ class Struct FLATBUFFERS_FINAL_CLASS { ...@@ -995,6 +1013,9 @@ class Struct FLATBUFFERS_FINAL_CLASS {
return reinterpret_cast<T>(&data_[o]); return reinterpret_cast<T>(&data_[o]);
} }
const uint8_t *GetAddressOf(uoffset_t o) const { return &data_[o]; }
uint8_t *GetAddressOf(uoffset_t o) { return &data_[o]; }
private: private:
uint8_t data_[1]; uint8_t data_[1];
}; };
...@@ -1027,7 +1048,6 @@ class Table { ...@@ -1027,7 +1048,6 @@ class Table {
? reinterpret_cast<P>(p + ReadScalar<uoffset_t>(p)) ? reinterpret_cast<P>(p + ReadScalar<uoffset_t>(p))
: nullptr; : nullptr;
} }
template<typename P> P GetPointer(voffset_t field) const { template<typename P> P GetPointer(voffset_t field) const {
return const_cast<Table *>(this)->GetPointer<P>(field); return const_cast<Table *>(this)->GetPointer<P>(field);
} }
...@@ -1052,6 +1072,14 @@ class Table { ...@@ -1052,6 +1072,14 @@ class Table {
return true; return true;
} }
uint8_t *GetAddressOf(voffset_t field) {
auto field_offset = GetOptionalFieldOffset(field);
return field_offset ? data_ + field_offset : nullptr;
}
const uint8_t *GetAddressOf(voffset_t field) const {
return const_cast<Table *>(this)->GetAddressOf(field);
}
uint8_t *GetVTable() { return data_ - ReadScalar<soffset_t>(data_); } uint8_t *GetVTable() { return data_ - ReadScalar<soffset_t>(data_); }
bool CheckField(voffset_t field) const { bool CheckField(voffset_t field) const {
......
This diff is collapsed.
This diff is collapsed.
...@@ -324,7 +324,7 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) { ...@@ -324,7 +324,7 @@ void ReflectionTest(uint8_t *flatbuf, size_t length) {
TEST_EQ(hp_int64, 80); TEST_EQ(hp_int64, 80);
auto hp_double = flatbuffers::GetAnyFieldF(root, hp_field); auto hp_double = flatbuffers::GetAnyFieldF(root, hp_field);
TEST_EQ(hp_double, 80.0); TEST_EQ(hp_double, 80.0);
auto hp_string = flatbuffers::GetAnyFieldS(root, hp_field, schema); auto hp_string = flatbuffers::GetAnyFieldS(root, hp_field, &schema);
TEST_EQ_STR(hp_string.c_str(), "80"); TEST_EQ_STR(hp_string.c_str(), "80");
// We can also modify it. // We can also modify it.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment