@@ -1924,6 +1924,10 @@ class CppGenerator : public BaseGenerator {
19241924 } else {
19251925 return " 0" ;
19261926 }
1927+ } else if (IsVector (type) && field.value .constant == " []" ) {
1928+ return " 0" ;
1929+ } else if (IsString (type) && field.value .constant != " 0" ) {
1930+ return " 0" ;
19271931 } else if (IsStruct (type) && (field.value .constant == " 0" )) {
19281932 return " nullptr" ;
19291933 } else {
@@ -2427,12 +2431,40 @@ class CppGenerator : public BaseGenerator {
24272431 break ;
24282432 }
24292433 case BASE_TYPE_STRING: {
2430- code_ += " {{PRE}}verifier.VerifyString({{NAME}}())\\ " ;
2434+ if (field.value .constant != " 0" ) {
2435+ if (field.offset64 ) {
2436+ code_ +=
2437+ " {{PRE}}VerifyStringWithDefault<::flatbuffers::uoffset64_t>("
2438+ " verifier, "
2439+ " {{OFFSET}})\\ " ;
2440+ } else {
2441+ code_ += " {{PRE}}VerifyStringWithDefault(verifier, {{OFFSET}})\\ " ;
2442+ }
2443+ } else {
2444+ code_ += " {{PRE}}verifier.VerifyString({{NAME}}())\\ " ;
2445+ }
24312446 break ;
24322447 }
24332448 case BASE_TYPE_VECTOR64:
24342449 case BASE_TYPE_VECTOR: {
2435- code_ += " {{PRE}}verifier.VerifyVector({{NAME}}())\\ " ;
2450+ if (field.value .constant == " []" ) {
2451+ const auto & vec_type = field.value .type .VectorType ();
2452+ const std::string vtype_wire = GenTypeWire (
2453+ vec_type, " " , VectorElementUserFacing (vec_type), field.offset64 );
2454+ std::string verify_call;
2455+ if (field.offset64 ) {
2456+ verify_call = " {{PRE}}VerifyVector64WithDefault<" + vtype_wire;
2457+ } else {
2458+ verify_call = " {{PRE}}VerifyVectorWithDefault<" + vtype_wire;
2459+ }
2460+ if (field.value .type .base_type == BASE_TYPE_VECTOR64) {
2461+ verify_call += " , ::flatbuffers::uoffset64_t" ;
2462+ }
2463+ verify_call += " >(verifier, {{OFFSET}})\\ " ;
2464+ code_ += verify_call;
2465+ } else {
2466+ code_ += " {{PRE}}verifier.VerifyVector({{NAME}}())\\ " ;
2467+ }
24362468
24372469 switch (field.value .type .element ) {
24382470 case BASE_TYPE_STRING: {
@@ -2723,7 +2755,37 @@ class CppGenerator : public BaseGenerator {
27232755 code_.SetValue (" FIELD_VALUE" , GenUnderlyingCast (field, true , call));
27242756 code_.SetValue (" NULLABLE_EXT" , NullableExtension ());
27252757 code_ += " {{FIELD_TYPE}}{{FIELD_NAME}}() const {" ;
2726- code_ += " return {{FIELD_VALUE}};" ;
2758+ if (IsVector (type) && field.value .constant == " []" ) {
2759+ const auto & vec_type = type.VectorType ();
2760+ const std::string vtype_wire = GenTypeWire (
2761+ vec_type, " " , VectorElementUserFacing (vec_type), field.offset64 );
2762+ std::string get_call;
2763+ if (field.offset64 ) {
2764+ get_call = " return GetVectorPointer64OrEmpty<" + vtype_wire;
2765+ } else {
2766+ get_call = " return GetVectorPointerOrEmpty<" + vtype_wire;
2767+ }
2768+ if (type.base_type == BASE_TYPE_VECTOR64) {
2769+ get_call += " , ::flatbuffers::uoffset64_t" ;
2770+ }
2771+ get_call += " >(" + offset_str + " );" ;
2772+ code_ += get_call;
2773+ } else if (IsString (type) && field.value .constant != " 0" ) {
2774+ // TODO: Add logic to always convert the string to a valid C++ string
2775+ // literal by handling string escapes.
2776+ code_ += " auto* ptr = {{FIELD_VALUE}};" ;
2777+ code_ += " if (ptr) return ptr;" ;
2778+ code_ += " static const struct { uint32_t len; const char s[" +
2779+ NumToString (field.value .constant .length () + 1 ) +
2780+ " ]; } bfbs_string = { " +
2781+ NumToString (field.value .constant .length ()) + " , \" " +
2782+ field.value .constant + " \" };" ;
2783+ code_ +=
2784+ " return reinterpret_cast<const ::flatbuffers::String "
2785+ " *>(&bfbs_string);" ;
2786+ } else {
2787+ code_ += " return {{FIELD_VALUE}};" ;
2788+ }
27272789 code_ += " }" ;
27282790 } else {
27292791 auto wire_type = GenTypeBasic (type, false );
@@ -2910,22 +2972,43 @@ class CppGenerator : public BaseGenerator {
29102972 } else {
29112973 auto postptr = " *" + NullableExtension ();
29122974 auto wire_type = GenTypeGet (type, " " , " " , postptr.c_str (), true );
2913- const std::string accessor = [&]() {
2914- if (IsStruct (type)) {
2915- return " GetStruct<" ;
2916- }
2917- if (field.offset64 ) {
2918- return " GetPointer64<" ;
2919- }
2920- return " GetPointer<" ;
2921- }();
2922- auto underlying = accessor + wire_type + " >(" + offset_str + " )" ;
29232975 code_.SetValue (" FIELD_TYPE" , wire_type);
2924- code_.SetValue (" FIELD_VALUE" , GenUnderlyingCast (field, true , underlying));
29252976
2926- code_ += " {{FIELD_TYPE}}mutable_{{FIELD_NAME}}() {" ;
2927- code_ += " return {{FIELD_VALUE}};" ;
2928- code_ += " }" ;
2977+ if (IsVector (type) && field.value .constant == " []" ) {
2978+ const auto & vec_type = type.VectorType ();
2979+ const std::string vtype_wire = GenTypeWire (
2980+ vec_type, " " , VectorElementUserFacing (vec_type), field.offset64 );
2981+ code_ += " {{FIELD_TYPE}}mutable_{{FIELD_NAME}}() {" ;
2982+ std::string get_call;
2983+ if (field.offset64 ) {
2984+ get_call =
2985+ " return GetMutableVectorPointer64OrEmpty<" + vtype_wire;
2986+ } else {
2987+ get_call = " return GetMutableVectorPointerOrEmpty<" + vtype_wire;
2988+ }
2989+ if (type.base_type == BASE_TYPE_VECTOR64) {
2990+ get_call += " , ::flatbuffers::uoffset64_t" ;
2991+ }
2992+ get_call += " >(" + offset_str + " );" ;
2993+ code_ += get_call;
2994+ code_ += " }" ;
2995+ } else {
2996+ const std::string accessor = [&]() {
2997+ if (IsStruct (type)) {
2998+ return " GetStruct<" ;
2999+ }
3000+ if (field.offset64 ) {
3001+ return " GetPointer64<" ;
3002+ }
3003+ return " GetPointer<" ;
3004+ }();
3005+ auto underlying = accessor + wire_type + " >(" + offset_str + " )" ;
3006+ code_.SetValue (" FIELD_VALUE" ,
3007+ GenUnderlyingCast (field, true , underlying));
3008+ code_ += " {{FIELD_TYPE}}mutable_{{FIELD_NAME}}() {" ;
3009+ code_ += " return {{FIELD_VALUE}};" ;
3010+ code_ += " }" ;
3011+ }
29293012 }
29303013 }
29313014
@@ -3305,9 +3388,17 @@ class CppGenerator : public BaseGenerator {
33053388 } else {
33063389 code_.SetValue (" CREATE_STRING" , " CreateSharedString" );
33073390 }
3308- code_ +=
3309- " auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? "
3310- " _fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : 0;" ;
3391+ if (field->value .constant != " 0" ) {
3392+ code_ +=
3393+ " auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? "
3394+ " _fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : "
3395+ " _fbb.{{CREATE_STRING}}(\" " +
3396+ field->value .constant + " \" );" ;
3397+ } else {
3398+ code_ +=
3399+ " auto {{FIELD_NAME}}__ = {{FIELD_NAME}} ? "
3400+ " _fbb.{{CREATE_STRING}}({{FIELD_NAME}}) : 0;" ;
3401+ }
33113402 } else if (IsVector (field->value .type )) {
33123403 const std::string force_align_code =
33133404 GenVectorForceAlign (*field, Name (*field) + " ->size()" );
0 commit comments