42 #ifndef GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__
43 #define GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__
57 #include <google/protobuf/port_def.inc>
62 class DynamicMessageFactory;
66 class ZeroCopyOutputStream;
72 class DefaultFieldComparator;
131 static bool Equals(
const Message& message1,
const Message& message2);
144 static bool Equivalent(
const Message& message1,
const Message& message2);
156 static bool ApproximatelyEquals(
const Message& message1,
171 static bool ApproximatelyEquivalent(
const Message& message1,
210 unknown_field_number(-1),
213 unknown_field_set1(
NULL),
214 unknown_field_set2(
NULL),
215 unknown_field_index1(-1),
216 unknown_field_index2(-1) {}
234 virtual void ReportAdded(
const Message& message1,
const Message& message2,
235 const std::vector<SpecificField>& field_path) = 0;
238 virtual void ReportDeleted(
240 const std::vector<SpecificField>& field_path) = 0;
243 virtual void ReportModified(
245 const std::vector<SpecificField>& field_path) = 0;
254 const std::vector<SpecificField>& ) {}
262 const std::vector<SpecificField>& ) {}
285 const std::vector<SpecificField>& ) {}
292 const std::vector<SpecificField>& ) {}
307 const std::vector<SpecificField>& )
const {
328 virtual bool IsIgnored(
331 const std::vector<SpecificField>& ) = 0;
339 const std::vector<SpecificField>& ) {
459 void TreatAsMapWithMultipleFieldsAsKey(
461 const std::vector<const FieldDescriptor*>& key_fields);
475 void TreatAsMapWithMultipleFieldPathsAsKey(
477 const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths);
487 const MapKeyComparator* key_comparator);
490 MapKeyComparator* CreateMultipleFieldsMapKeyComparator(
491 const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths);
496 void AddIgnoreCriteria(IgnoreCriteria* ignore_criteria);
533 void set_message_field_comparison(MessageFieldComparison comparison);
538 report_matches_ = report_matches;
549 report_ignores_ = report_ignores;
555 void set_scope(Scope scope);
566 void set_float_comparison(FloatComparison comparison);
571 void set_repeated_field_comparison(RepeatedFieldComparison comparison);
584 bool CompareWithFields(
586 const std::vector<const FieldDescriptor*>& message1_fields,
587 const std::vector<const FieldDescriptor*>& message2_fields);
600 void ReportDifferencesTo(Reporter* reporter);
622 report_modified_aggregates_ = report;
627 void ReportAdded(
const Message& message1,
const Message& message2,
628 const std::vector<SpecificField>& field_path)
override;
630 void ReportDeleted(
const Message& message1,
const Message& message2,
631 const std::vector<SpecificField>& field_path)
override;
633 void ReportModified(
const Message& message1,
const Message& message2,
634 const std::vector<SpecificField>& field_path)
override;
636 void ReportMoved(
const Message& message1,
const Message& message2,
637 const std::vector<SpecificField>& field_path)
override;
639 void ReportMatched(
const Message& message1,
const Message& message2,
640 const std::vector<SpecificField>& field_path)
override;
642 void ReportIgnored(
const Message& message1,
const Message& message2,
643 const std::vector<SpecificField>& field_path)
override;
645 void ReportUnknownFieldIgnored(
647 const std::vector<SpecificField>& field_path)
override;
652 virtual void PrintPath(
const std::vector<SpecificField>& field_path,
656 virtual void PrintPath(
const std::vector<SpecificField>& field_path,
665 const std::vector<SpecificField>& field_path,
669 virtual void PrintUnknownFieldValue(
const UnknownField* unknown_field);
697 const std::vector<SpecificField>& parent_fields)
const override;
718 Scope fields2_scope);
726 std::vector<SpecificField>* parent_fields);
729 bool CompareUnknownFields(
const Message& message1,
const Message& message2,
731 std::vector<SpecificField>* parent_fields);
736 bool CompareRequestedFieldsUsingSettings(
740 std::vector<SpecificField>* parent_fields);
743 bool CompareWithFieldsInternal(
const Message& message1,
747 std::vector<SpecificField>* parent_fields);
750 bool CompareRepeatedField(
const Message& message1,
const Message& message2,
752 std::vector<SpecificField>* parent_fields);
755 bool CompareFieldValue(
const Message& message1,
const Message& message2,
767 bool CompareFieldValueUsingParentFields(
770 std::vector<SpecificField>* parent_fields);
785 const std::vector<SpecificField>& parent_fields,
786 Reporter* reporter,
int index1,
int index2);
798 void SetMatchIndicesForSmartListCallback(
799 std::function<
void(std::vector<int>*, std::vector<int>*)> callback);
810 const std::vector<SpecificField>& parent_fields);
814 bool IsUnknownFieldIgnored(
const Message& message1,
const Message& message2,
816 const std::vector<SpecificField>& parent_fields);
831 bool MatchRepeatedFieldIndices(
835 const std::vector<SpecificField>& parent_fields,
836 std::vector<int>* match_list1, std::vector<int>* match_list2);
840 bool UnpackAny(
const Message& any, std::unique_ptr<Message>*
data);
843 static bool CheckPathChanged(
const std::vector<SpecificField>& parent_fields);
847 void CheckRepeatedFieldComparisons(
853 typedef std::map<const FieldDescriptor*, const MapKeyComparator*>
859 typedef std::map<const FieldDescriptor*, RepeatedFieldComparison>
FieldMap;
891 std::function<
void(std::vector<int>*, std::vector<int>*)>
903 std::vector<MessageDifferencer::SpecificField>* parent_fields)
918 #include <google/protobuf/port_undef.inc>
920 #endif // GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__