diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h index 273d5091..23229982 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 a2a8308b..fec6f1b0 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 1ee9b74d..fa5a7881 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 1606b99b..5c22b860 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 57c82b04..d63a2e7c 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 641e5e26..6e71bc4a 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 b73ecc71..497087e7 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 bf7c86e3..ec1aa702 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 575bff25..5a3e85b6 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 a4fbf987..8678718f 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 e2fec823..e893d7e4 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 1cac36bf..85298905 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"; }