| 3931 | } |
| 3932 | |
| 3933 | std::string Parser::ConformTo(const Parser &base) { |
| 3934 | for (auto sit = structs_.vec.begin(); sit != structs_.vec.end(); ++sit) { |
| 3935 | auto &struct_def = **sit; |
| 3936 | auto qualified_name = |
| 3937 | struct_def.defined_namespace->GetFullyQualifiedName(struct_def.name); |
| 3938 | auto struct_def_base = base.LookupStruct(qualified_name); |
| 3939 | if (!struct_def_base) continue; |
| 3940 | for (auto fit = struct_def.fields.vec.begin(); |
| 3941 | fit != struct_def.fields.vec.end(); ++fit) { |
| 3942 | auto &field = **fit; |
| 3943 | auto field_base = struct_def_base->fields.Lookup(field.name); |
| 3944 | if (field_base) { |
| 3945 | if (field.value.offset != field_base->value.offset) |
| 3946 | return "offsets differ for field: " + field.name; |
| 3947 | if (field.value.constant != field_base->value.constant) |
| 3948 | return "defaults differ for field: " + field.name; |
| 3949 | if (!EqualByName(field.value.type, field_base->value.type)) |
| 3950 | return "types differ for field: " + field.name; |
| 3951 | } else { |
| 3952 | // Doesn't have to exist, deleting fields is fine. |
| 3953 | // But we should check if there is a field that has the same offset |
| 3954 | // but is incompatible (in the case of field renaming). |
| 3955 | for (auto fbit = struct_def_base->fields.vec.begin(); |
| 3956 | fbit != struct_def_base->fields.vec.end(); ++fbit) { |
| 3957 | field_base = *fbit; |
| 3958 | if (field.value.offset == field_base->value.offset) { |
| 3959 | if (!EqualByName(field.value.type, field_base->value.type)) |
| 3960 | return "field renamed to different type: " + field.name; |
| 3961 | break; |
| 3962 | } |
| 3963 | } |
| 3964 | } |
| 3965 | } |
| 3966 | } |
| 3967 | for (auto eit = enums_.vec.begin(); eit != enums_.vec.end(); ++eit) { |
| 3968 | auto &enum_def = **eit; |
| 3969 | auto qualified_name = |
| 3970 | enum_def.defined_namespace->GetFullyQualifiedName(enum_def.name); |
| 3971 | auto enum_def_base = base.enums_.Lookup(qualified_name); |
| 3972 | if (!enum_def_base) continue; |
| 3973 | for (auto evit = enum_def.Vals().begin(); evit != enum_def.Vals().end(); |
| 3974 | ++evit) { |
| 3975 | auto &enum_val = **evit; |
| 3976 | auto enum_val_base = enum_def_base->Lookup(enum_val.name); |
| 3977 | if (enum_val_base) { |
| 3978 | if (enum_val != *enum_val_base) |
| 3979 | return "values differ for enum: " + enum_val.name; |
| 3980 | } |
| 3981 | } |
| 3982 | } |
| 3983 | return ""; |
| 3984 | } |
| 3985 | |
| 3986 | } // namespace flatbuffers |
no test coverage detected