diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 25cbad7bf..e4a6a725f 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -273,6 +273,8 @@ public: return IndirectHelper::Read(Data(), i); } + return_type operator[](uoffset_t i) const { return Get(i); } + // If this is a Vector of enums, T will be its storage type, not the enum // type. This function makes it convenient to retrieve value with enum // type E. @@ -293,7 +295,7 @@ public: // Change elements if you have a non-const pointer to this object. void Mutate(uoffset_t i, T val) { assert(i < size()); - WriteScalar(Data() + i * sizeof(T), val); + WriteScalar(data() + i, val); } // The raw data in little endian format. Use with care. @@ -305,6 +307,10 @@ public: return reinterpret_cast(&length_ + 1); } + // Similarly, but typed, much like std::vector::data + const T *data() const { return reinterpret_cast(Data()); } + T *data() { return reinterpret_cast(Data()); } + template return_type LookupByKey(K key) const { void *search_result = std::bsearch(&key, Data(), size(), IndirectHelper::element_stride, KeyCompare); @@ -345,6 +351,7 @@ template static inline size_t VectorLength(const Vector *v) { struct String : public Vector { const char *c_str() const { return reinterpret_cast(Data()); } + std::string str() const { return c_str(); } bool operator <(const String &o) const { return strcmp(c_str(), o.c_str()) < 0; @@ -509,6 +516,10 @@ class FlatBufferBuilder FLATBUFFERS_FINAL_CLASS { // Get the released pointer to the serialized buffer. // Don't attempt to use this FlatBufferBuilder afterwards! + // The unique_ptr returned has a special allocator that knows how to + // deallocate this pointer (since it points to the middle of an allocation). + // Thus, do not mix this pointer with other unique_ptr's, or call release() / + // reset() on it. unique_ptr_t ReleaseBufferPointer() { return buf_.release(); } void ForceDefaults(bool fd) { force_defaults_ = fd; } diff --git a/include/flatbuffers/reflection.h b/include/flatbuffers/reflection.h index 475257a31..b97a43320 100644 --- a/include/flatbuffers/reflection.h +++ b/include/flatbuffers/reflection.h @@ -313,7 +313,7 @@ class ResizeContext { auto enumdef = schema_.enums()->Get(fielddef->type()->index()); // TODO: this is clumsy and slow, but no other way to find it? auto type_field = fielddefs->LookupByKey( - (fielddef->name()->c_str() + std::string("_type")).c_str()); + (fielddef->name()->str() + "_type").c_str()); assert(type_field); auto union_type = GetFieldI(table, type_field); auto enumval = enumdef->values()->LookupByKey(union_type); diff --git a/samples/sample_binary.cpp b/samples/sample_binary.cpp index 7c15b9d3c..3b6d0fbe4 100755 --- a/samples/sample_binary.cpp +++ b/samples/sample_binary.cpp @@ -49,7 +49,7 @@ int main(int /*argc*/, const char * /*argv*/[]) { assert(monster->hp() == 80); assert(monster->mana() == 150); // default - assert(!strcmp(monster->name()->c_str(), "MyMonster")); + assert(monster->name()->str() == "MyMonster"); auto pos = monster->pos(); assert(pos); diff --git a/src/idl_gen_text.cpp b/src/idl_gen_text.cpp index 138f7320a..e26d93ca5 100644 --- a/src/idl_gen_text.cpp +++ b/src/idl_gen_text.cpp @@ -80,7 +80,7 @@ template void PrintVector(const Vector &v, Type type, Print(v.GetStructFromOffset(i * type.struct_def->bytesize), type, indent + Indent(opts), nullptr, opts, _text); else - Print(v.Get(i), type, indent + Indent(opts), nullptr, + Print(v[i], type, indent + Indent(opts), nullptr, opts, _text); } text += NewLine(opts); @@ -92,7 +92,7 @@ static void EscapeString(const String &s, std::string *_text) { std::string &text = *_text; text += "\""; for (uoffset_t i = 0; i < s.size(); i++) { - char c = s.Get(i); + char c = s[i]; switch (c) { case '\n': text += "\\n"; break; case '\t': text += "\\t"; break;