diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 273d50910..232299827 100644 --- a/include/flatbuffers/flatbuffers.h +++ b/include/flatbuffers/flatbuffers.h @@ -2327,6 +2327,11 @@ template T *GetMutableRoot(void *buf) { EndianScalar(*reinterpret_cast(buf))); } +template T *GetMutableSizePrefixedRoot(void *buf) { + return GetMutableRoot(reinterpret_cast(buf) + + sizeof(uoffset_t)); +} + template const T *GetRoot(const void *buf) { return GetMutableRoot(const_cast(buf)); } diff --git a/samples/monster_generated.h b/samples/monster_generated.h index a2a8308bd..fec6f1b05 100644 --- a/samples/monster_generated.h +++ b/samples/monster_generated.h @@ -834,6 +834,10 @@ inline Monster *GetMutableMonster(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline MyGame::Sample::Monster *GetMutableSizePrefixedMonster(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline bool VerifyMonsterBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(nullptr); diff --git a/src/idl_gen_cpp.cpp b/src/idl_gen_cpp.cpp index 1ee9b74d2..fa5a78818 100644 --- a/src/idl_gen_cpp.cpp +++ b/src/idl_gen_cpp.cpp @@ -505,6 +505,17 @@ class CppGenerator : public BaseGenerator { code_ += " return flatbuffers::GetMutableRoot<{{STRUCT_NAME}}>(buf);"; code_ += "}"; code_ += ""; + + code_ += "inline \\"; + code_ += + "{{CPP_NAME}} " + "*{{NULLABLE_EXT}}GetMutableSizePrefixed{{STRUCT_NAME}}(void " + "*buf) {"; + code_ += + " return " + "flatbuffers::GetMutableSizePrefixedRoot<{{CPP_NAME}}>(buf);"; + code_ += "}"; + code_ += ""; } if (parser_.file_identifier_.length()) { diff --git a/tests/arrays_test_generated.h b/tests/arrays_test_generated.h index 1606b99b4..5c22b860c 100644 --- a/tests/arrays_test_generated.h +++ b/tests/arrays_test_generated.h @@ -457,6 +457,10 @@ inline ArrayTable *GetMutableArrayTable(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline MyGame::Example::ArrayTable *GetMutableSizePrefixedArrayTable(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *ArrayTableIdentifier() { return "ARRT"; } diff --git a/tests/cpp17/generated_cpp17/monster_test_generated.h b/tests/cpp17/generated_cpp17/monster_test_generated.h index 57c82b043..d63a2e7cb 100644 --- a/tests/cpp17/generated_cpp17/monster_test_generated.h +++ b/tests/cpp17/generated_cpp17/monster_test_generated.h @@ -3677,6 +3677,10 @@ inline Monster *GetMutableMonster(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline MyGame::Example::Monster *GetMutableSizePrefixedMonster(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *MonsterIdentifier() { return "MONS"; } diff --git a/tests/cpp17/generated_cpp17/optional_scalars_generated.h b/tests/cpp17/generated_cpp17/optional_scalars_generated.h index 641e5e267..6e71bc4a5 100644 --- a/tests/cpp17/generated_cpp17/optional_scalars_generated.h +++ b/tests/cpp17/generated_cpp17/optional_scalars_generated.h @@ -933,6 +933,10 @@ inline ScalarStuff *GetMutableScalarStuff(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline optional_scalars::ScalarStuff *GetMutableSizePrefixedScalarStuff(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *ScalarStuffIdentifier() { return "NULL"; } diff --git a/tests/cpp17/generated_cpp17/union_vector_generated.h b/tests/cpp17/generated_cpp17/union_vector_generated.h index b73ecc71b..497087e71 100644 --- a/tests/cpp17/generated_cpp17/union_vector_generated.h +++ b/tests/cpp17/generated_cpp17/union_vector_generated.h @@ -798,6 +798,10 @@ inline Movie *GetMutableMovie(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline Movie *GetMutableSizePrefixedMovie(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *MovieIdentifier() { return "MOVI"; } diff --git a/tests/monster_extra_generated.h b/tests/monster_extra_generated.h index bf7c86e34..ec1aa7027 100644 --- a/tests/monster_extra_generated.h +++ b/tests/monster_extra_generated.h @@ -349,6 +349,10 @@ inline MonsterExtra *GetMutableMonsterExtra(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline MyGame::MonsterExtra *GetMutableSizePrefixedMonsterExtra(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *MonsterExtraIdentifier() { return "MONE"; } diff --git a/tests/monster_test_generated.h b/tests/monster_test_generated.h index 575bff25d..5a3e85b69 100644 --- a/tests/monster_test_generated.h +++ b/tests/monster_test_generated.h @@ -3648,6 +3648,10 @@ inline Monster *GetMutableMonster(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline MyGame::Example::Monster *GetMutableSizePrefixedMonster(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *MonsterIdentifier() { return "MONS"; } diff --git a/tests/native_type_test_generated.h b/tests/native_type_test_generated.h index a4fbf9874..8678718f7 100644 --- a/tests/native_type_test_generated.h +++ b/tests/native_type_test_generated.h @@ -288,6 +288,10 @@ inline ApplicationData *GetMutableApplicationData(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline Geometry::ApplicationData *GetMutableSizePrefixedApplicationData(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline bool VerifyApplicationDataBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(nullptr); diff --git a/tests/optional_scalars_generated.h b/tests/optional_scalars_generated.h index e2fec8239..e893d7e4d 100644 --- a/tests/optional_scalars_generated.h +++ b/tests/optional_scalars_generated.h @@ -893,6 +893,10 @@ inline ScalarStuff *GetMutableScalarStuff(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline optional_scalars::ScalarStuff *GetMutableSizePrefixedScalarStuff(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *ScalarStuffIdentifier() { return "NULL"; } diff --git a/tests/union_vector/union_vector_generated.h b/tests/union_vector/union_vector_generated.h index 1cac36bfe..852989056 100644 --- a/tests/union_vector/union_vector_generated.h +++ b/tests/union_vector/union_vector_generated.h @@ -829,6 +829,10 @@ inline Movie *GetMutableMovie(void *buf) { return flatbuffers::GetMutableRoot(buf); } +inline Movie *GetMutableSizePrefixedMovie(void *buf) { + return flatbuffers::GetMutableSizePrefixedRoot(buf); +} + inline const char *MovieIdentifier() { return "MOVI"; }