Small improvements to the C++ API.

Change-Id: Ib30ffbbd140a8b82fe664129fa4e8c55836267f8
Tested: on Linux.
parent 576022c6
...@@ -273,6 +273,8 @@ public: ...@@ -273,6 +273,8 @@ public:
return IndirectHelper<T>::Read(Data(), i); return IndirectHelper<T>::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 // 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. This function makes it convenient to retrieve value with enum
// type E. // type E.
...@@ -293,7 +295,7 @@ public: ...@@ -293,7 +295,7 @@ public:
// Change elements if you have a non-const pointer to this object. // Change elements if you have a non-const pointer to this object.
void Mutate(uoffset_t i, T val) { void Mutate(uoffset_t i, T val) {
assert(i < size()); assert(i < size());
WriteScalar(Data() + i * sizeof(T), val); WriteScalar(data() + i, val);
} }
// The raw data in little endian format. Use with care. // The raw data in little endian format. Use with care.
...@@ -305,6 +307,10 @@ public: ...@@ -305,6 +307,10 @@ public:
return reinterpret_cast<uint8_t *>(&length_ + 1); return reinterpret_cast<uint8_t *>(&length_ + 1);
} }
// Similarly, but typed, much like std::vector::data
const T *data() const { return reinterpret_cast<const T *>(Data()); }
T *data() { return reinterpret_cast<T *>(Data()); }
template<typename K> return_type LookupByKey(K key) const { template<typename K> return_type LookupByKey(K key) const {
void *search_result = std::bsearch(&key, Data(), size(), void *search_result = std::bsearch(&key, Data(), size(),
IndirectHelper<T>::element_stride, KeyCompare<K>); IndirectHelper<T>::element_stride, KeyCompare<K>);
...@@ -345,6 +351,7 @@ template<typename T> static inline size_t VectorLength(const Vector<T> *v) { ...@@ -345,6 +351,7 @@ template<typename T> static inline size_t VectorLength(const Vector<T> *v) {
struct String : public Vector<char> { struct String : public Vector<char> {
const char *c_str() const { return reinterpret_cast<const char *>(Data()); } const char *c_str() const { return reinterpret_cast<const char *>(Data()); }
std::string str() const { return c_str(); }
bool operator <(const String &o) const { bool operator <(const String &o) const {
return strcmp(c_str(), o.c_str()) < 0; return strcmp(c_str(), o.c_str()) < 0;
...@@ -509,6 +516,10 @@ class FlatBufferBuilder FLATBUFFERS_FINAL_CLASS { ...@@ -509,6 +516,10 @@ class FlatBufferBuilder FLATBUFFERS_FINAL_CLASS {
// Get the released pointer to the serialized buffer. // Get the released pointer to the serialized buffer.
// Don't attempt to use this FlatBufferBuilder afterwards! // 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(); } unique_ptr_t ReleaseBufferPointer() { return buf_.release(); }
void ForceDefaults(bool fd) { force_defaults_ = fd; } void ForceDefaults(bool fd) { force_defaults_ = fd; }
......
...@@ -313,7 +313,7 @@ class ResizeContext { ...@@ -313,7 +313,7 @@ class ResizeContext {
auto enumdef = schema_.enums()->Get(fielddef->type()->index()); auto enumdef = schema_.enums()->Get(fielddef->type()->index());
// TODO: this is clumsy and slow, but no other way to find it? // TODO: this is clumsy and slow, but no other way to find it?
auto type_field = fielddefs->LookupByKey( auto type_field = fielddefs->LookupByKey(
(fielddef->name()->c_str() + std::string("_type")).c_str()); (fielddef->name()->str() + "_type").c_str());
assert(type_field); assert(type_field);
auto union_type = GetFieldI<uint8_t>(table, type_field); auto union_type = GetFieldI<uint8_t>(table, type_field);
auto enumval = enumdef->values()->LookupByKey(union_type); auto enumval = enumdef->values()->LookupByKey(union_type);
......
...@@ -49,7 +49,7 @@ int main(int /*argc*/, const char * /*argv*/[]) { ...@@ -49,7 +49,7 @@ int main(int /*argc*/, const char * /*argv*/[]) {
assert(monster->hp() == 80); assert(monster->hp() == 80);
assert(monster->mana() == 150); // default assert(monster->mana() == 150); // default
assert(!strcmp(monster->name()->c_str(), "MyMonster")); assert(monster->name()->str() == "MyMonster");
auto pos = monster->pos(); auto pos = monster->pos();
assert(pos); assert(pos);
......
...@@ -80,7 +80,7 @@ template<typename T> void PrintVector(const Vector<T> &v, Type type, ...@@ -80,7 +80,7 @@ template<typename T> void PrintVector(const Vector<T> &v, Type type,
Print(v.GetStructFromOffset(i * type.struct_def->bytesize), type, Print(v.GetStructFromOffset(i * type.struct_def->bytesize), type,
indent + Indent(opts), nullptr, opts, _text); indent + Indent(opts), nullptr, opts, _text);
else else
Print(v.Get(i), type, indent + Indent(opts), nullptr, Print(v[i], type, indent + Indent(opts), nullptr,
opts, _text); opts, _text);
} }
text += NewLine(opts); text += NewLine(opts);
...@@ -92,7 +92,7 @@ static void EscapeString(const String &s, std::string *_text) { ...@@ -92,7 +92,7 @@ static void EscapeString(const String &s, std::string *_text) {
std::string &text = *_text; std::string &text = *_text;
text += "\""; text += "\"";
for (uoffset_t i = 0; i < s.size(); i++) { for (uoffset_t i = 0; i < s.size(); i++) {
char c = s.Get(i); char c = s[i];
switch (c) { switch (c) {
case '\n': text += "\\n"; break; case '\n': text += "\\n"; break;
case '\t': text += "\\t"; break; case '\t': text += "\\t"; break;
......
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