43 #ifndef GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__
44 #define GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__
53 #include <google/protobuf/descriptor.h>
54 #include <google/protobuf/message.h>
55 #include <google/protobuf/unknown_field_set.h>
56 #include <google/protobuf/util/field_comparator.h>
59 #include <google/protobuf/port_def.inc>
74 class DefaultFieldComparator;
122 class PROTOBUF_EXPORT MessageDifferencer {
146 static bool Equivalent(
const Message& message1,
const Message& message2);
158 static bool ApproximatelyEquals(
const Message& message1,
173 static bool ApproximatelyEquivalent(
const Message& message1,
178 struct SpecificField {
183 int unknown_field_number = -1;
211 int unknown_field_index1 = -1;
212 int unknown_field_index2 = -1;
243 virtual void ReportAdded(
const Message& message1,
const Message& message2,
244 const std::vector<SpecificField>& field_path) = 0;
247 virtual void ReportDeleted(
249 const std::vector<SpecificField>& field_path) = 0;
252 virtual void ReportModified(
254 const std::vector<SpecificField>& field_path) = 0;
263 const std::vector<SpecificField>& ) {}
271 const std::vector<SpecificField>& ) {}
294 const std::vector<SpecificField>& ) {}
301 const std::vector<SpecificField>& ) {}
309 class PROTOBUF_EXPORT MapKeyComparator {
312 virtual ~MapKeyComparator();
316 const std::vector<SpecificField>& )
const {
331 class PROTOBUF_EXPORT IgnoreCriteria {
334 virtual ~IgnoreCriteria();
337 virtual bool IsIgnored(
340 const std::vector<SpecificField>& ) = 0;
348 const std::vector<SpecificField>& ) {
468 void TreatAsMapWithMultipleFieldsAsKey(
470 const std::vector<const FieldDescriptor*>& key_fields);
484 void TreatAsMapWithMultipleFieldPathsAsKey(
486 const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths);
496 const MapKeyComparator* key_comparator);
499 MapKeyComparator* CreateMultipleFieldsMapKeyComparator(
500 const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths);
505 void AddIgnoreCriteria(IgnoreCriteria* ignore_criteria);
526 #ifdef PROTOBUF_FUTURE_BREAKING_CHANGES
528 #endif // PROTOBUF_FUTURE_BREAKING_CHANGES
545 void set_message_field_comparison(MessageFieldComparison comparison);
550 report_matches_ = report_matches;
561 report_ignores_ = report_ignores;
567 void set_scope(Scope scope);
578 void set_float_comparison(FloatComparison comparison);
583 void set_repeated_field_comparison(RepeatedFieldComparison comparison);
586 RepeatedFieldComparison repeated_field_comparison();
599 bool CompareWithFields(
601 const std::vector<const FieldDescriptor*>& message1_fields,
602 const std::vector<const FieldDescriptor*>& message2_fields);
615 void ReportDifferencesTo(Reporter* reporter);
629 bool UnpackAny(
const Message& any, std::unique_ptr<Message>*
data);
653 report_modified_aggregates_ = report;
658 void ReportAdded(
const Message& message1,
const Message& message2,
659 const std::vector<SpecificField>& field_path)
override;
661 void ReportDeleted(
const Message& message1,
const Message& message2,
662 const std::vector<SpecificField>& field_path)
override;
664 void ReportModified(
const Message& message1,
const Message& message2,
665 const std::vector<SpecificField>& field_path)
override;
667 void ReportMoved(
const Message& message1,
const Message& message2,
668 const std::vector<SpecificField>& field_path)
override;
670 void ReportMatched(
const Message& message1,
const Message& message2,
671 const std::vector<SpecificField>& field_path)
override;
673 void ReportIgnored(
const Message& message1,
const Message& message2,
674 const std::vector<SpecificField>& field_path)
override;
676 void ReportUnknownFieldIgnored(
678 const std::vector<SpecificField>& field_path)
override;
682 void SetMessages(
const Message& message1,
const Message& message2);
686 virtual void PrintPath(
const std::vector<SpecificField>& field_path,
695 const std::vector<SpecificField>& field_path,
699 virtual void PrintUnknownFieldValue(
const UnknownField* unknown_field);
706 void PrintMapKey(
bool left_side,
const SpecificField& specific_field);
709 bool delete_printer_;
710 bool report_modified_aggregates_;
732 const std::vector<SpecificField>& parent_fields)
const override;
753 Scope fields2_scope);
761 std::vector<SpecificField>* parent_fields);
764 bool CompareUnknownFields(
const Message& message1,
const Message& message2,
766 std::vector<SpecificField>* parent_fields);
771 bool CompareRequestedFieldsUsingSettings(
775 std::vector<SpecificField>* parent_fields);
778 bool CompareWithFieldsInternal(
const Message& message1,
782 std::vector<SpecificField>* parent_fields);
785 bool CompareRepeatedField(
const Message& message1,
const Message& message2,
787 std::vector<SpecificField>* parent_fields);
790 bool CompareMapField(
const Message& message1,
const Message& message2,
792 std::vector<SpecificField>* parent_fields);
797 bool CompareRepeatedRep(
const Message& message1,
const Message& message2,
799 std::vector<SpecificField>* parent_fields);
803 bool CompareMapFieldByMapReflection(
const Message& message1,
806 std::vector<SpecificField>* parent_fields,
810 bool CompareFieldValue(
const Message& message1,
const Message& message2,
822 bool CompareFieldValueUsingParentFields(
825 std::vector<SpecificField>* parent_fields);
838 const MapKeyComparator* key_comparator,
const Message* message1,
840 const std::vector<SpecificField>& parent_fields,
841 Reporter* reporter,
int index1,
int index2);
853 void SetMatchIndicesForSmartListCallback(
865 const std::vector<SpecificField>& parent_fields);
869 bool IsUnknownFieldIgnored(
const Message& message1,
const Message& message2,
870 const SpecificField&
field,
871 const std::vector<SpecificField>& parent_fields);
875 const MapKeyComparator* GetMapKeyComparator(
886 bool MatchRepeatedFieldIndices(
889 const MapKeyComparator* key_comparator,
890 const std::vector<SpecificField>& parent_fields,
891 std::vector<int>* match_list1, std::vector<int>* match_list2);
894 static bool CheckPathChanged(
const std::vector<SpecificField>& parent_fields);
898 void CheckRepeatedFieldComparisons(
900 const RepeatedFieldComparison& new_comparison);
904 typedef std::map<const FieldDescriptor*, const MapKeyComparator*>
910 typedef std::map<const FieldDescriptor*, RepeatedFieldComparison>
FieldMap;
918 FieldMap repeated_field_comparisons_;
925 std::vector<MapKeyComparator*> owned_key_comparators_;
928 std::vector<IgnoreCriteria*> ignore_criteria_;
930 std::vector<const FieldDescriptor*> tmp_message_fields_;
937 } field_comparator_ = {&default_field_comparator_};
938 enum {
kFCDefault, kFCBase } field_comparator_kind_ = kFCDefault;
940 bool report_matches_;
942 bool report_ignores_;
948 match_indices_for_smart_list_callback_;
959 std::vector<MessageDifferencer::SpecificField>* parent_fields)
974 #include <google/protobuf/port_undef.inc>
976 #endif // GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__