| 3037 | } |
| 3038 | |
| 3039 | CheckedError Parser::ParseFlexBufferValue(flexbuffers::Builder *builder) { |
| 3040 | ParseDepthGuard depth_guard(this); |
| 3041 | ECHECK(depth_guard.Check()); |
| 3042 | |
| 3043 | switch (token_) { |
| 3044 | case '{': { |
| 3045 | auto start = builder->StartMap(); |
| 3046 | size_t fieldn_outer = 0; |
| 3047 | auto err = |
| 3048 | ParseTableDelimiters(fieldn_outer, nullptr, |
| 3049 | [&](const std::string &name, size_t &fieldn, |
| 3050 | const StructDef *) -> CheckedError { |
| 3051 | builder->Key(name); |
| 3052 | ECHECK(ParseFlexBufferValue(builder)); |
| 3053 | fieldn++; |
| 3054 | return NoError(); |
| 3055 | }); |
| 3056 | ECHECK(err); |
| 3057 | builder->EndMap(start); |
| 3058 | if (builder->HasDuplicateKeys()) |
| 3059 | return Error("FlexBuffers map has duplicate keys"); |
| 3060 | break; |
| 3061 | } |
| 3062 | case '[': { |
| 3063 | auto start = builder->StartVector(); |
| 3064 | uoffset_t count = 0; |
| 3065 | ECHECK(ParseVectorDelimiters(count, [&](uoffset_t &) -> CheckedError { |
| 3066 | return ParseFlexBufferValue(builder); |
| 3067 | })); |
| 3068 | builder->EndVector(start, false, false); |
| 3069 | break; |
| 3070 | } |
| 3071 | case kTokenStringConstant: |
| 3072 | builder->String(attribute_); |
| 3073 | EXPECT(kTokenStringConstant); |
| 3074 | break; |
| 3075 | case kTokenIntegerConstant: |
| 3076 | builder->Int(StringToInt(attribute_.c_str())); |
| 3077 | EXPECT(kTokenIntegerConstant); |
| 3078 | break; |
| 3079 | case kTokenFloatConstant: { |
| 3080 | double d; |
| 3081 | StringToNumber(attribute_.c_str(), &d); |
| 3082 | builder->Double(d); |
| 3083 | EXPECT(kTokenFloatConstant); |
| 3084 | break; |
| 3085 | } |
| 3086 | case '-': |
| 3087 | case '+': { |
| 3088 | // `[-+]?(nan|inf|infinity)`, see ParseSingleValue(). |
| 3089 | const auto sign = static_cast<char>(token_); |
| 3090 | NEXT(); |
| 3091 | if (token_ != kTokenIdentifier) |
| 3092 | return Error("floating-point constant expected"); |
| 3093 | attribute_.insert(0, 1, sign); |
| 3094 | ECHECK(ParseFlexBufferNumericConstant(builder)); |
| 3095 | NEXT(); |
| 3096 | break; |
nothing calls this directly
no test coverage detected