@@ -148,18 +148,16 @@ class MessageDifferencer::MultipleFieldsMapKeyComparator
148
148
const FieldDescriptor* field = key_field_path[path_index];
149
149
std::vector<SpecificField> current_parent_fields (parent_fields);
150
150
if (path_index == static_cast <int64_t >(key_field_path.size () - 1 )) {
151
- if (field->is_repeated ()) {
152
- if (!message_differencer_->CompareRepeatedField (
153
- message1, message2, field, ¤t_parent_fields)) {
154
- return false ;
155
- }
151
+ if (field->is_map ()) {
152
+ return message_differencer_->CompareMapField (message1, message2, field,
153
+ ¤t_parent_fields);
154
+ } else if (field->is_repeated ()) {
155
+ return message_differencer_->CompareRepeatedField (
156
+ message1, message2, field, ¤t_parent_fields);
156
157
} else {
157
- if (!message_differencer_->CompareFieldValueUsingParentFields (
158
- message1, message2, field, -1 , -1 , ¤t_parent_fields)) {
159
- return false ;
160
- }
158
+ return message_differencer_->CompareFieldValueUsingParentFields (
159
+ message1, message2, field, -1 , -1 , ¤t_parent_fields);
161
160
}
162
- return true ;
163
161
} else {
164
162
const Reflection* reflection1 = message1.GetReflection ();
165
163
const Reflection* reflection2 = message2.GetReflection ();
@@ -830,24 +828,17 @@ bool MessageDifferencer::CompareWithFieldsInternal(
830
828
831
829
bool fieldDifferent = false ;
832
830
assert (field1 != NULL );
833
- if (field1->is_repeated ()) {
831
+ if (field1->is_map ()) {
832
+ fieldDifferent =
833
+ !CompareMapField (message1, message2, field1, parent_fields);
834
+ } else if (field1->is_repeated ()) {
834
835
fieldDifferent =
835
836
!CompareRepeatedField (message1, message2, field1, parent_fields);
836
- if (fieldDifferent) {
837
- if (reporter_ == NULL ) return false ;
838
- isDifferent = true ;
839
- }
840
837
} else {
841
838
fieldDifferent = !CompareFieldValueUsingParentFields (
842
839
message1, message2, field1, -1 , -1 , parent_fields);
843
840
844
- // If we have found differences, either report them or terminate if
845
- // no reporter is present.
846
- if (fieldDifferent && reporter_ == NULL ) {
847
- return false ;
848
- }
849
-
850
- if (reporter_ != NULL ) {
841
+ if (reporter_ != nullptr ) {
851
842
SpecificField specific_field;
852
843
specific_field.field = field1;
853
844
parent_fields->push_back (specific_field);
@@ -860,6 +851,10 @@ bool MessageDifferencer::CompareWithFieldsInternal(
860
851
parent_fields->pop_back ();
861
852
}
862
853
}
854
+ if (fieldDifferent) {
855
+ if (reporter_ == nullptr ) return false ;
856
+ isDifferent = true ;
857
+ }
863
858
// Increment the field indices.
864
859
++field_index1;
865
860
++field_index2;
@@ -1002,17 +997,19 @@ bool MessageDifferencer::CompareMapFieldByMapReflection(
1002
997
return true ;
1003
998
}
1004
999
1005
- bool MessageDifferencer::CompareRepeatedField (
1000
+ bool MessageDifferencer::CompareMapField (
1006
1001
const Message& message1, const Message& message2,
1007
1002
const FieldDescriptor* repeated_field,
1008
1003
std::vector<SpecificField>* parent_fields) {
1004
+ GOOGLE_DCHECK (repeated_field->is_map ());
1005
+
1009
1006
// the input FieldDescriptor is guaranteed to be repeated field.
1010
1007
const Reflection* reflection1 = message1.GetReflection ();
1011
1008
const Reflection* reflection2 = message2.GetReflection ();
1012
1009
1013
1010
// When both map fields are on map, do not sync to repeated field.
1014
1011
// TODO(jieluo): Add support for reporter
1015
- if (repeated_field-> is_map () && reporter_ == nullptr &&
1012
+ if (reporter_ == nullptr &&
1016
1013
// Users didn't set custom map field key comparator
1017
1014
map_field_key_comparator_.find (repeated_field) ==
1018
1015
map_field_key_comparator_.end () &&
@@ -1052,6 +1049,26 @@ bool MessageDifferencer::CompareRepeatedField(
1052
1049
}
1053
1050
}
1054
1051
1052
+ return CompareRepeatedRep (message1, message2, repeated_field, parent_fields);
1053
+ }
1054
+
1055
+ bool MessageDifferencer::CompareRepeatedField (
1056
+ const Message& message1, const Message& message2,
1057
+ const FieldDescriptor* repeated_field,
1058
+ std::vector<SpecificField>* parent_fields) {
1059
+ GOOGLE_DCHECK (!repeated_field->is_map ());
1060
+ return CompareRepeatedRep (message1, message2, repeated_field, parent_fields);
1061
+ }
1062
+
1063
+ bool MessageDifferencer::CompareRepeatedRep (
1064
+ const Message& message1, const Message& message2,
1065
+ const FieldDescriptor* repeated_field,
1066
+ std::vector<SpecificField>* parent_fields) {
1067
+ // the input FieldDescriptor is guaranteed to be repeated field.
1068
+ GOOGLE_DCHECK (repeated_field->is_repeated ());
1069
+ const Reflection* reflection1 = message1.GetReflection ();
1070
+ const Reflection* reflection2 = message2.GetReflection ();
1071
+
1055
1072
const int count1 = reflection1->FieldSize (message1, repeated_field);
1056
1073
const int count2 = reflection2->FieldSize (message2, repeated_field);
1057
1074
const bool treated_as_subset = IsTreatedAsSubset (repeated_field);
0 commit comments