Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: third_party/protobuf/src/google/protobuf/util/message_differencer.h

Issue 2590803003: Revert "third_party/protobuf: Update to HEAD (83d681ee2c)" (Closed)
Patch Set: Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 // itself and the second will be the actual field in the embedded message 214 // itself and the second will be the actual field in the embedded message
215 // that was added/deleted/modified. 215 // that was added/deleted/modified.
216 class LIBPROTOBUF_EXPORT Reporter { 216 class LIBPROTOBUF_EXPORT Reporter {
217 public: 217 public:
218 Reporter(); 218 Reporter();
219 virtual ~Reporter(); 219 virtual ~Reporter();
220 220
221 // Reports that a field has been added into Message2. 221 // Reports that a field has been added into Message2.
222 virtual void ReportAdded( 222 virtual void ReportAdded(
223 const Message& message1, const Message& message2, 223 const Message& message1, const Message& message2,
224 const std::vector<SpecificField>& field_path) = 0; 224 const vector<SpecificField>& field_path) = 0;
225 225
226 // Reports that a field has been deleted from Message1. 226 // Reports that a field has been deleted from Message1.
227 virtual void ReportDeleted( 227 virtual void ReportDeleted(
228 const Message& message1, 228 const Message& message1,
229 const Message& message2, 229 const Message& message2,
230 const std::vector<SpecificField>& field_path) = 0; 230 const vector<SpecificField>& field_path) = 0;
231 231
232 // Reports that the value of a field has been modified. 232 // Reports that the value of a field has been modified.
233 virtual void ReportModified( 233 virtual void ReportModified(
234 const Message& message1, 234 const Message& message1,
235 const Message& message2, 235 const Message& message2,
236 const std::vector<SpecificField>& field_path) = 0; 236 const vector<SpecificField>& field_path) = 0;
237 237
238 // Reports that a repeated field has been moved to another location. This 238 // Reports that a repeated field has been moved to another location. This
239 // only applies when using TreatAsSet or TreatAsMap() -- see below. Also 239 // only applies when using TreatAsSet or TreatAsMap() -- see below. Also
240 // note that for any given field, ReportModified and ReportMoved are 240 // note that for any given field, ReportModified and ReportMoved are
241 // mutually exclusive. If a field has been both moved and modified, then 241 // mutually exclusive. If a field has been both moved and modified, then
242 // only ReportModified will be called. 242 // only ReportModified will be called.
243 virtual void ReportMoved( 243 virtual void ReportMoved(
244 const Message& message1, 244 const Message& message1,
245 const Message& message2, 245 const Message& message2,
246 const std::vector<SpecificField>& field_path) { } 246 const vector<SpecificField>& field_path) { }
247 247
248 // Reports that two fields match. Useful for doing side-by-side diffs. 248 // Reports that two fields match. Useful for doing side-by-side diffs.
249 // This function is mutually exclusive with ReportModified and ReportMoved. 249 // This function is mutually exclusive with ReportModified and ReportMoved.
250 // Note that you must call set_report_matches(true) before calling Compare 250 // Note that you must call set_report_matches(true) before calling Compare
251 // to make use of this function. 251 // to make use of this function.
252 virtual void ReportMatched( 252 virtual void ReportMatched(
253 const Message& message1, 253 const Message& message1,
254 const Message& message2, 254 const Message& message2,
255 const std::vector<SpecificField>& field_path) { } 255 const vector<SpecificField>& field_path) { }
256 256
257 // Reports that two fields would have been compared, but the 257 // Reports that two fields would have been compared, but the
258 // comparison has been skipped because the field was marked as 258 // comparison has been skipped because the field was marked as
259 // 'ignored' using IgnoreField(). This function is mutually 259 // 'ignored' using IgnoreField(). This function is mutually
260 // exclusive with all the other Report() functions. 260 // exclusive with all the other Report() functions.
261 // 261 //
262 // The contract of ReportIgnored is slightly different than the 262 // The contract of ReportIgnored is slightly different than the
263 // other Report() functions, in that |field_path.back().index| is 263 // other Report() functions, in that |field_path.back().index| is
264 // always equal to -1, even if the last field is repeated. This is 264 // always equal to -1, even if the last field is repeated. This is
265 // because while the other Report() functions indicate where in a 265 // because while the other Report() functions indicate where in a
266 // repeated field the action (Addition, Deletion, etc...) 266 // repeated field the action (Addition, Deletion, etc...)
267 // happened, when a repeated field is 'ignored', the differencer 267 // happened, when a repeated field is 'ignored', the differencer
268 // simply calls ReportIgnored on the repeated field as a whole and 268 // simply calls ReportIgnored on the repeated field as a whole and
269 // moves on without looking at its individual elements. 269 // moves on without looking at its individual elements.
270 // 270 //
271 // Furthermore, ReportIgnored() does not indicate whether the 271 // Furthermore, ReportIgnored() does not indicate whether the
272 // fields were in fact equal or not, as Compare() does not inspect 272 // fields were in fact equal or not, as Compare() does not inspect
273 // these fields at all. It is up to the Reporter to decide whether 273 // these fields at all. It is up to the Reporter to decide whether
274 // the fields are equal or not (perhaps with a second call to 274 // the fields are equal or not (perhaps with a second call to
275 // Compare()), if it cares. 275 // Compare()), if it cares.
276 virtual void ReportIgnored( 276 virtual void ReportIgnored(
277 const Message& message1, 277 const Message& message1,
278 const Message& message2, 278 const Message& message2,
279 const std::vector<SpecificField>& field_path) { } 279 const vector<SpecificField>& field_path) { }
280 280
281 // Report that an unknown field is ignored. (see comment above). 281 // Report that an unkown field is ignored. (see comment above).
282 // Note this is a different function since the last SpecificField in field 282 // Note this is a different function since the last SpecificField in field
283 // path has a null field. This could break existing Reporter. 283 // path has a null field. This could break existing Reporter.
284 virtual void ReportUnknownFieldIgnored( 284 virtual void ReportUnknownFieldIgnored(
285 const Message& message1, const Message& message2, 285 const Message& message1, const Message& message2,
286 const std::vector<SpecificField>& field_path) {} 286 const vector<SpecificField>& field_path) {}
287 287
288 private: 288 private:
289 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reporter); 289 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reporter);
290 }; 290 };
291 291
292 // MapKeyComparator is used to determine if two elements have the same key 292 // MapKeyComparator is used to determine if two elements have the same key
293 // when comparing elements of a repeated field as a map. 293 // when comparing elements of a repeated field as a map.
294 class LIBPROTOBUF_EXPORT MapKeyComparator { 294 class LIBPROTOBUF_EXPORT MapKeyComparator {
295 public: 295 public:
296 MapKeyComparator(); 296 MapKeyComparator();
297 virtual ~MapKeyComparator(); 297 virtual ~MapKeyComparator();
298 298
299 virtual bool IsMatch( 299 virtual bool IsMatch(const Message& message1,
300 const Message& message1, 300 const Message& message2,
301 const Message& message2, 301 const vector<SpecificField>& parent_fields) const {
302 const std::vector<SpecificField>& parent_fields) const {
303 GOOGLE_CHECK(false) << "IsMatch() is not implemented."; 302 GOOGLE_CHECK(false) << "IsMatch() is not implemented.";
304 return false; 303 return false;
305 } 304 }
306 305
307 private: 306 private:
308 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapKeyComparator); 307 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MapKeyComparator);
309 }; 308 };
310 309
311 // Abstract base class from which all IgnoreCriteria derive. 310 // Abstract base class from which all IgnoreCriteria derive.
312 // By adding IgnoreCriteria more complex ignore logic can be implemented. 311 // By adding IgnoreCriteria more complex ignore logic can be implemented.
313 // IgnoreCriteria are registed with AddIgnoreCriteria. For each compared 312 // IgnoreCriteria are registed with AddIgnoreCriteria. For each compared
314 // field IsIgnored is called on each added IgnoreCriteria until one returns 313 // field IsIgnored is called on each added IgnoreCriteria until one returns
315 // true or all return false. 314 // true or all return false.
316 // IsIgnored is called for fields where at least one side has a value. 315 // IsIgnored is called for fields where at least one side has a value.
317 class LIBPROTOBUF_EXPORT IgnoreCriteria { 316 class LIBPROTOBUF_EXPORT IgnoreCriteria {
318 public: 317 public:
319 IgnoreCriteria(); 318 IgnoreCriteria();
320 virtual ~IgnoreCriteria(); 319 virtual ~IgnoreCriteria();
321 320
322 // Returns true if the field should be ignored. 321 // Returns true if the field should be ignored.
323 virtual bool IsIgnored( 322 virtual bool IsIgnored(
324 const Message& message1, 323 const Message& message1,
325 const Message& message2, 324 const Message& message2,
326 const FieldDescriptor* field, 325 const FieldDescriptor* field,
327 const std::vector<SpecificField>& parent_fields) = 0; 326 const vector<SpecificField>& parent_fields) = 0;
328 327
329 // Returns true if the unknown field should be ignored. 328 // Returns true if the unknown field should be ignored.
330 // Note: This will be called for unknown fields as well in which case 329 // Note: This will be called for unknown fields as well in which case
331 // field.field will be null. 330 // field.field will be null.
332 virtual bool IsUnknownFieldIgnored( 331 virtual bool IsUnknownFieldIgnored(
333 const Message& message1, const Message& message2, 332 const Message& message1, const Message& message2,
334 const SpecificField& field, 333 const SpecificField& field,
335 const std::vector<SpecificField>& parent_fields) { 334 const vector<SpecificField>& parent_fields) {
336 return false; 335 return false;
337 } 336 }
338 }; 337 };
339 338
340 // To add a Reporter, construct default here, then use ReportDifferencesTo or 339 // To add a Reporter, construct default here, then use ReportDifferencesTo or
341 // ReportDifferencesToString. 340 // ReportDifferencesToString.
342 explicit MessageDifferencer(); 341 explicit MessageDifferencer();
343 342
344 ~MessageDifferencer(); 343 ~MessageDifferencer();
345 344
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 // comparison. Those pairs of elements with the same key (with equal value 433 // comparison. Those pairs of elements with the same key (with equal value
435 // for every field in 'key_fields') will be compared in this step. 434 // for every field in 'key_fields') will be compared in this step.
436 // Time complexity of the first step is O(s * m * n ^ 2) where s is the 435 // Time complexity of the first step is O(s * m * n ^ 2) where s is the
437 // average size of the fields specified in 'key_fields', m is the number of 436 // average size of the fields specified in 'key_fields', m is the number of
438 // fields in 'key_fields' and n is the number of elements. If partial 437 // fields in 'key_fields' and n is the number of elements. If partial
439 // matching is enabled, an extra O(n^3) will be incured by the maximum 438 // matching is enabled, an extra O(n^3) will be incured by the maximum
440 // matching algorithm. The second step is O(k * n) where k is the average 439 // matching algorithm. The second step is O(k * n) where k is the average
441 // size of each element. 440 // size of each element.
442 void TreatAsMapWithMultipleFieldsAsKey( 441 void TreatAsMapWithMultipleFieldsAsKey(
443 const FieldDescriptor* field, 442 const FieldDescriptor* field,
444 const std::vector<const FieldDescriptor*>& key_fields); 443 const vector<const FieldDescriptor*>& key_fields);
445 // Same as TreatAsMapWithMultipleFieldsAsKey, except that each of the field 444 // Same as TreatAsMapWithMultipleFieldsAsKey, except that each of the field
446 // do not necessarily need to be a direct subfield. Each element in 445 // do not necessarily need to be a direct subfield. Each element in
447 // key_field_paths indicate a path from the message being compared, listing 446 // key_field_paths indicate a path from the message being compared, listing
448 // successive subfield to reach the key field. 447 // successive subfield to reach the key field.
449 // 448 //
450 // REQUIRES: 449 // REQUIRES:
451 // for key_field_path in key_field_paths: 450 // for key_field_path in key_field_paths:
452 // key_field_path[0]->containing_type() == field->message_type() 451 // key_field_path[0]->containing_type() == field->message_type()
453 // for i in [0, key_field_path.size() - 1): 452 // for i in [0, key_field_path.size() - 1):
454 // key_field_path[i+1]->containing_type() == 453 // key_field_path[i+1]->containing_type() ==
455 // key_field_path[i]->message_type() 454 // key_field_path[i]->message_type()
456 // key_field_path[i]->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE 455 // key_field_path[i]->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE
457 // !key_field_path[i]->is_repeated() 456 // !key_field_path[i]->is_repeated()
458 void TreatAsMapWithMultipleFieldPathsAsKey( 457 void TreatAsMapWithMultipleFieldPathsAsKey(
459 const FieldDescriptor* field, 458 const FieldDescriptor* field,
460 const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths); 459 const vector<vector<const FieldDescriptor*> >& key_field_paths);
461 460
462 // Uses a custom MapKeyComparator to determine if two elements have the same 461 // Uses a custom MapKeyComparator to determine if two elements have the same
463 // key when comparing a repeated field as a map. 462 // key when comparing a repeated field as a map.
464 // The caller is responsible to delete the key_comparator. 463 // The caller is responsible to delete the key_comparator.
465 // This method varies from TreatAsMapWithMultipleFieldsAsKey only in the 464 // This method varies from TreatAsMapWithMultipleFieldsAsKey only in the
466 // first key matching step. Rather than comparing some specified fields, it 465 // first key matching step. Rather than comparing some specified fields, it
467 // will invoke the IsMatch method of the given 'key_comparator' to decide if 466 // will invoke the IsMatch method of the given 'key_comparator' to decide if
468 // two elements have the same key. 467 // two elements have the same key.
469 void TreatAsMapUsingKeyComparator( 468 void TreatAsMapUsingKeyComparator(
470 const FieldDescriptor* field, 469 const FieldDescriptor* field,
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 // false otherwise. If this method returns false, any changes between the 542 // false otherwise. If this method returns false, any changes between the
544 // two messages will be reported if a Reporter was specified via 543 // two messages will be reported if a Reporter was specified via
545 // ReportDifferencesTo (see also ReportDifferencesToString). 544 // ReportDifferencesTo (see also ReportDifferencesToString).
546 // 545 //
547 // This method REQUIRES that the two messages have the same 546 // This method REQUIRES that the two messages have the same
548 // Descriptor (message1.GetDescriptor() == message2.GetDescriptor()). 547 // Descriptor (message1.GetDescriptor() == message2.GetDescriptor()).
549 bool Compare(const Message& message1, const Message& message2); 548 bool Compare(const Message& message1, const Message& message2);
550 549
551 // Same as above, except comparing only the list of fields specified by the 550 // Same as above, except comparing only the list of fields specified by the
552 // two vectors of FieldDescriptors. 551 // two vectors of FieldDescriptors.
553 bool CompareWithFields( 552 bool CompareWithFields(const Message& message1, const Message& message2,
554 const Message& message1, const Message& message2, 553 const vector<const FieldDescriptor*>& message1_fields,
555 const std::vector<const FieldDescriptor*>& message1_fields, 554 const vector<const FieldDescriptor*>& message2_fields);
556 const std::vector<const FieldDescriptor*>& message2_fields);
557 555
558 // Automatically creates a reporter that will output the differences 556 // Automatically creates a reporter that will output the differences
559 // found (if any) to the specified output string pointer. Note that this 557 // found (if any) to the specified output string pointer. Note that this
560 // method must be called before Compare. 558 // method must be called before Compare.
561 void ReportDifferencesToString(string* output); 559 void ReportDifferencesToString(string* output);
562 560
563 // Tells the MessageDifferencer to report differences via the specified 561 // Tells the MessageDifferencer to report differences via the specified
564 // reporter. Note that this method must be called before Compare for 562 // reporter. Note that this method must be called before Compare for
565 // the reporter to be used. It is the responsibility of the caller to delete 563 // the reporter to be used. It is the responsibility of the caller to delete
566 // this object. 564 // this object.
567 // If the provided pointer equals NULL, the MessageDifferencer stops reporting 565 // If the provided pointer equals NULL, the MessageDifferencer stops reporting
568 // differences to any previously set reporters or output strings. 566 // differences to any previously set reporters or output strings.
569 void ReportDifferencesTo(Reporter* reporter); 567 void ReportDifferencesTo(Reporter* reporter);
570 568
571 // An implementation of the MessageDifferencer Reporter that outputs 569 // An implementation of the MessageDifferencer Reporter that outputs
572 // any differences found in human-readable form to the supplied 570 // any differences found in human-readable form to the supplied
573 // ZeroCopyOutputStream or Printer. If a printer is used, the delimiter 571 // ZeroCopyOutputStream or Printer. If a printer is used, the delimiter
574 // *must* be '$'. 572 // *must* be '$'.
575 //
576 // WARNING: this reporter does not necessarily flush its output until it is
577 // destroyed. As a result, it is not safe to assume the output is valid or
578 // complete until after you destroy the reporter. For example, if you use a
579 // StreamReporter to write to a StringOutputStream, the target string may
580 // contain uninitialized data until the reporter is destroyed.
581 class LIBPROTOBUF_EXPORT StreamReporter : public Reporter { 573 class LIBPROTOBUF_EXPORT StreamReporter : public Reporter {
582 public: 574 public:
583 explicit StreamReporter(io::ZeroCopyOutputStream* output); 575 explicit StreamReporter(io::ZeroCopyOutputStream* output);
584 explicit StreamReporter(io::Printer* printer); // delimiter '$' 576 explicit StreamReporter(io::Printer* printer); // delimiter '$'
585 virtual ~StreamReporter(); 577 virtual ~StreamReporter();
586 578
587 // When set to true, the stream reporter will also output aggregates nodes 579 // When set to true, the stream reporter will also output aggregates nodes
588 // (i.e. messages and groups) whose subfields have been modified. When 580 // (i.e. messages and groups) whose subfields have been modified. When
589 // false, will only report the individual subfields. Defaults to false. 581 // false, will only report the individual subfields. Defaults to false.
590 void set_report_modified_aggregates(bool report) { 582 void set_report_modified_aggregates(bool report) {
591 report_modified_aggregates_ = report; 583 report_modified_aggregates_ = report;
592 } 584 }
593 585
594 // The following are implementations of the methods described above. 586 // The following are implementations of the methods described above.
595 virtual void ReportAdded(const Message& message1, const Message& message2, 587 virtual void ReportAdded(const Message& message1, const Message& message2,
596 const std::vector<SpecificField>& field_path); 588 const vector<SpecificField>& field_path);
597 589
598 virtual void ReportDeleted(const Message& message1, 590 virtual void ReportDeleted(const Message& message1,
599 const Message& message2, 591 const Message& message2,
600 const std::vector<SpecificField>& field_path); 592 const vector<SpecificField>& field_path);
601 593
602 virtual void ReportModified(const Message& message1, 594 virtual void ReportModified(const Message& message1,
603 const Message& message2, 595 const Message& message2,
604 const std::vector<SpecificField>& field_path); 596 const vector<SpecificField>& field_path);
605 597
606 virtual void ReportMoved(const Message& message1, 598 virtual void ReportMoved(const Message& message1,
607 const Message& message2, 599 const Message& message2,
608 const std::vector<SpecificField>& field_path); 600 const vector<SpecificField>& field_path);
609 601
610 virtual void ReportMatched(const Message& message1, 602 virtual void ReportMatched(const Message& message1,
611 const Message& message2, 603 const Message& message2,
612 const std::vector<SpecificField>& field_path); 604 const vector<SpecificField>& field_path);
613 605
614 virtual void ReportIgnored(const Message& message1, 606 virtual void ReportIgnored(const Message& message1,
615 const Message& message2, 607 const Message& message2,
616 const std::vector<SpecificField>& field_path); 608 const vector<SpecificField>& field_path);
617 609
618 virtual void ReportUnknownFieldIgnored( 610 virtual void ReportUnknownFieldIgnored(
619 const Message& message1, const Message& message2, 611 const Message& message1, const Message& message2,
620 const std::vector<SpecificField>& field_path); 612 const vector<SpecificField>& field_path);
621 613
622 protected: 614 protected:
623 // Prints the specified path of fields to the buffer. 615 // Prints the specified path of fields to the buffer.
624 virtual void PrintPath(const std::vector<SpecificField>& field_path, 616 virtual void PrintPath(const vector<SpecificField>& field_path,
625 bool left_side); 617 bool left_side);
626 618
627 // Prints the value of fields to the buffer. left_side is true if the 619 // Prints the value of fields to the buffer. left_side is true if the
628 // given message is from the left side of the comparison, false if it 620 // given message is from the left side of the comparison, false if it
629 // was the right. This is relevant only to decide whether to follow 621 // was the right. This is relevant only to decide whether to follow
630 // unknown_field_index1 or unknown_field_index2 when an unknown field 622 // unknown_field_index1 or unknown_field_index2 when an unknown field
631 // is encountered in field_path. 623 // is encountered in field_path.
632 virtual void PrintValue(const Message& message, 624 virtual void PrintValue(const Message& message,
633 const std::vector<SpecificField>& field_path, 625 const vector<SpecificField>& field_path,
634 bool left_side); 626 bool left_side);
635 627
636 // Prints the specified path of unknown fields to the buffer. 628 // Prints the specified path of unknown fields to the buffer.
637 virtual void PrintUnknownFieldValue(const UnknownField* unknown_field); 629 virtual void PrintUnknownFieldValue(const UnknownField* unknown_field);
638 630
639 // Just print a string 631 // Just print a string
640 void Print(const string& str); 632 void Print(const string& str);
641 633
642 private: 634 private:
643 io::Printer* printer_; 635 io::Printer* printer_;
(...skipping 10 matching lines...) Expand all
654 // class is declared as a nested class of MessageDifferencer. 646 // class is declared as a nested class of MessageDifferencer.
655 class MultipleFieldsMapKeyComparator; 647 class MultipleFieldsMapKeyComparator;
656 // Returns true if field1's number() is less than field2's. 648 // Returns true if field1's number() is less than field2's.
657 static bool FieldBefore(const FieldDescriptor* field1, 649 static bool FieldBefore(const FieldDescriptor* field1,
658 const FieldDescriptor* field2); 650 const FieldDescriptor* field2);
659 651
660 // Combine the two lists of fields into the combined_fields output vector. 652 // Combine the two lists of fields into the combined_fields output vector.
661 // All fields present in both lists will always be included in the combined 653 // All fields present in both lists will always be included in the combined
662 // list. Fields only present in one of the lists will only appear in the 654 // list. Fields only present in one of the lists will only appear in the
663 // combined list if the corresponding fields_scope option is set to FULL. 655 // combined list if the corresponding fields_scope option is set to FULL.
664 void CombineFields(const std::vector<const FieldDescriptor*>& fields1, 656 void CombineFields(const vector<const FieldDescriptor*>& fields1,
665 Scope fields1_scope, 657 Scope fields1_scope,
666 const std::vector<const FieldDescriptor*>& fields2, 658 const vector<const FieldDescriptor*>& fields2,
667 Scope fields2_scope, 659 Scope fields2_scope,
668 std::vector<const FieldDescriptor*>* combined_fields); 660 vector<const FieldDescriptor*>* combined_fields);
669 661
670 // Internal version of the Compare method which performs the actual 662 // Internal version of the Compare method which performs the actual
671 // comparison. The parent_fields vector is a vector containing field 663 // comparison. The parent_fields vector is a vector containing field
672 // descriptors of all fields accessed to get to this comparison operation 664 // descriptors of all fields accessed to get to this comparison operation
673 // (i.e. if the current message is an embedded message, the parent_fields 665 // (i.e. if the current message is an embedded message, the parent_fields
674 // vector will contain the field that has this embedded message). 666 // vector will contain the field that has this embedded message).
675 bool Compare(const Message& message1, const Message& message2, 667 bool Compare(const Message& message1, const Message& message2,
676 std::vector<SpecificField>* parent_fields); 668 vector<SpecificField>* parent_fields);
677 669
678 // Compares all the unknown fields in two messages. 670 // Compares all the unknown fields in two messages.
679 bool CompareUnknownFields(const Message& message1, const Message& message2, 671 bool CompareUnknownFields(const Message& message1, const Message& message2,
680 const google::protobuf::UnknownFieldSet&, 672 const google::protobuf::UnknownFieldSet&,
681 const google::protobuf::UnknownFieldSet&, 673 const google::protobuf::UnknownFieldSet&,
682 std::vector<SpecificField>* parent_fields); 674 vector<SpecificField>* parent_fields);
683 675
684 // Compares the specified messages for the requested field lists. The field 676 // Compares the specified messages for the requested field lists. The field
685 // lists are modified depending on comparison settings, and then passed to 677 // lists are modified depending on comparison settings, and then passed to
686 // CompareWithFieldsInternal. 678 // CompareWithFieldsInternal.
687 bool CompareRequestedFieldsUsingSettings( 679 bool CompareRequestedFieldsUsingSettings(
688 const Message& message1, const Message& message2, 680 const Message& message1, const Message& message2,
689 const std::vector<const FieldDescriptor*>& message1_fields, 681 const vector<const FieldDescriptor*>& message1_fields,
690 const std::vector<const FieldDescriptor*>& message2_fields, 682 const vector<const FieldDescriptor*>& message2_fields,
691 std::vector<SpecificField>* parent_fields); 683 vector<SpecificField>* parent_fields);
692 684
693 // Compares the specified messages with the specified field lists. 685 // Compares the specified messages with the specified field lists.
694 bool CompareWithFieldsInternal( 686 bool CompareWithFieldsInternal(
695 const Message& message1, const Message& message2, 687 const Message& message1, const Message& message2,
696 const std::vector<const FieldDescriptor*>& message1_fields, 688 const vector<const FieldDescriptor*>& message1_fields,
697 const std::vector<const FieldDescriptor*>& message2_fields, 689 const vector<const FieldDescriptor*>& message2_fields,
698 std::vector<SpecificField>* parent_fields); 690 vector<SpecificField>* parent_fields);
699 691
700 // Compares the repeated fields, and report the error. 692 // Compares the repeated fields, and report the error.
701 bool CompareRepeatedField(const Message& message1, const Message& message2, 693 bool CompareRepeatedField(const Message& message1, const Message& message2,
702 const FieldDescriptor* field, 694 const FieldDescriptor* field,
703 std::vector<SpecificField>* parent_fields); 695 vector<SpecificField>* parent_fields);
704 696
705 // Shorthand for CompareFieldValueUsingParentFields with NULL parent_fields. 697 // Shorthand for CompareFieldValueUsingParentFields with NULL parent_fields.
706 bool CompareFieldValue(const Message& message1, 698 bool CompareFieldValue(const Message& message1,
707 const Message& message2, 699 const Message& message2,
708 const FieldDescriptor* field, 700 const FieldDescriptor* field,
709 int index1, 701 int index1,
710 int index2); 702 int index2);
711 703
712 // Compares the specified field on the two messages, returning 704 // Compares the specified field on the two messages, returning
713 // true if they are the same, false otherwise. For repeated fields, 705 // true if they are the same, false otherwise. For repeated fields,
714 // this method only compares the value in the specified index. This method 706 // this method only compares the value in the specified index. This method
715 // uses Compare functions to recurse into submessages. 707 // uses Compare functions to recurse into submessages.
716 // The parent_fields vector is used in calls to a Reporter instance calls. 708 // The parent_fields vector is used in calls to a Reporter instance calls.
717 // It can be NULL, in which case the MessageDifferencer will create new 709 // It can be NULL, in which case the MessageDifferencer will create new
718 // list of parent messages if it needs to recursively compare the given field. 710 // list of parent messages if it needs to recursively compare the given field.
719 // To avoid confusing users you should not set it to NULL unless you modified 711 // To avoid confusing users you should not set it to NULL unless you modified
720 // Reporter to handle the change of parent_fields correctly. 712 // Reporter to handle the change of parent_fields correctly.
721 bool CompareFieldValueUsingParentFields( 713 bool CompareFieldValueUsingParentFields(const Message& message1,
722 const Message& message1, 714 const Message& message2,
723 const Message& message2, 715 const FieldDescriptor* field,
724 const FieldDescriptor* field, 716 int index1,
725 int index1, 717 int index2,
726 int index2, 718 vector<SpecificField>* parent_fields);
727 std::vector<SpecificField>* parent_fields);
728 719
729 // Compares the specified field on the two messages, returning comparison 720 // Compares the specified field on the two messages, returning comparison
730 // result, as returned by appropriate FieldComparator. 721 // result, as returned by appropriate FieldComparator.
731 FieldComparator::ComparisonResult GetFieldComparisonResult( 722 FieldComparator::ComparisonResult GetFieldComparisonResult(
732 const Message& message1, const Message& message2, 723 const Message& message1, const Message& message2,
733 const FieldDescriptor* field, int index1, int index2, 724 const FieldDescriptor* field, int index1, int index2,
734 const FieldContext* field_context); 725 const FieldContext* field_context);
735 726
736 // Check if the two elements in the repeated field are match to each other. 727 // Check if the two elements in the repeated field are match to each other.
737 // if the key_comprator is NULL, this function returns true when the two 728 // if the key_comprator is NULL, this function returns true when the two
738 // elements are equal. 729 // elements are equal.
739 bool IsMatch(const FieldDescriptor* repeated_field, 730 bool IsMatch(const FieldDescriptor* repeated_field,
740 const MapKeyComparator* key_comparator, 731 const MapKeyComparator* key_comparator,
741 const Message* message1, const Message* message2, 732 const Message* message1, const Message* message2,
742 const std::vector<SpecificField>& parent_fields, 733 const vector<SpecificField>& parent_fields,
743 int index1, int index2); 734 int index1, int index2);
744 735
745 // Returns true when this repeated field has been configured to be treated 736 // Returns true when this repeated field has been configured to be treated
746 // as a set. 737 // as a set.
747 bool IsTreatedAsSet(const FieldDescriptor* field); 738 bool IsTreatedAsSet(const FieldDescriptor* field);
748 739
749 // Returns true when this repeated field is to be compared as a subset, ie. 740 // Returns true when this repeated field is to be compared as a subset, ie.
750 // has been configured to be treated as a set or map and scope is set to 741 // has been configured to be treated as a set or map and scope is set to
751 // PARTIAL. 742 // PARTIAL.
752 bool IsTreatedAsSubset(const FieldDescriptor* field); 743 bool IsTreatedAsSubset(const FieldDescriptor* field);
753 744
754 // Returns true if this field is to be ignored when this 745 // Returns true if this field is to be ignored when this
755 // MessageDifferencer compares messages. 746 // MessageDifferencer compares messages.
756 bool IsIgnored( 747 bool IsIgnored(
757 const Message& message1, 748 const Message& message1,
758 const Message& message2, 749 const Message& message2,
759 const FieldDescriptor* field, 750 const FieldDescriptor* field,
760 const std::vector<SpecificField>& parent_fields); 751 const vector<SpecificField>& parent_fields);
761 752
762 // Returns true if this unknown field is to be ignored when this 753 // Returns true if this unknown field is to be ignored when this
763 // MessageDifferencer compares messages. 754 // MessageDifferencer compares messages.
764 bool IsUnknownFieldIgnored(const Message& message1, const Message& message2, 755 bool IsUnknownFieldIgnored(const Message& message1, const Message& message2,
765 const SpecificField& field, 756 const SpecificField& field,
766 const std::vector<SpecificField>& parent_fields); 757 const vector<SpecificField>& parent_fields);
767 758
768 // Returns MapKeyComparator* when this field has been configured to 759 // Returns MapKeyComparator* when this field has been configured to
769 // be treated as a map. If not, returns NULL. 760 // be treated as a map. If not, returns NULL.
770 const MapKeyComparator* GetMapKeyComparator(const FieldDescriptor* field); 761 const MapKeyComparator* GetMapKeyComparator(const FieldDescriptor* field);
771 762
772 // Attempts to match indices of a repeated field, so that the contained values 763 // Attempts to match indices of a repeated field, so that the contained values
773 // match. Clears output vectors and sets their values to indices of paired 764 // match. Clears output vectors and sets their values to indices of paired
774 // messages, ie. if message1[0] matches message2[1], then match_list1[0] == 1 765 // messages, ie. if message1[0] matches message2[1], then match_list1[0] == 1
775 // and match_list2[1] == 0. The unmatched indices are indicated by -1. 766 // and match_list2[1] == 0. The unmatched indices are indicated by -1.
776 // This method returns false if the match failed. However, it doesn't mean 767 // This method returns false if the match failed. However, it doesn't mean
777 // that the comparison succeeds when this method returns true (you need to 768 // that the comparison succeeds when this method returns true (you need to
778 // double-check in this case). 769 // double-check in this case).
779 bool MatchRepeatedFieldIndices( 770 bool MatchRepeatedFieldIndices(const Message& message1,
780 const Message& message1, 771 const Message& message2,
781 const Message& message2, 772 const FieldDescriptor* repeated_field,
782 const FieldDescriptor* repeated_field, 773 const vector<SpecificField>& parent_fields,
783 const std::vector<SpecificField>& parent_fields, 774 vector<int>* match_list1,
784 std::vector<int>* match_list1, 775 vector<int>* match_list2);
785 std::vector<int>* match_list2);
786 776
787 // If "any" is of type google.protobuf.Any, extract its payload using 777 // If "any" is of type google.protobuf.Any, extract its payload using
788 // DynamicMessageFactory and store in "data". 778 // DynamicMessageFactory and store in "data".
789 bool UnpackAny(const Message& any, google::protobuf::scoped_ptr<Message>* data ); 779 bool UnpackAny(const Message& any, google::protobuf::scoped_ptr<Message>* data );
790 780
791 // Checks if index is equal to new_index in all the specific fields. 781 // Checks if index is equal to new_index in all the specific fields.
792 static bool CheckPathChanged(const std::vector<SpecificField>& parent_fields); 782 static bool CheckPathChanged(const vector<SpecificField>& parent_fields);
793 783
794 // Defines a map between field descriptors and their MapKeyComparators. 784 // Defines a map between field descriptors and their MapKeyComparators.
795 // Used for repeated fields when they are configured as TreatAsMap. 785 // Used for repeated fields when they are configured as TreatAsMap.
796 typedef std::map<const FieldDescriptor*, 786 typedef map<const FieldDescriptor*,
797 const MapKeyComparator*> FieldKeyComparatorMap; 787 const MapKeyComparator*> FieldKeyComparatorMap;
798 788
799 // Defines a set to store field descriptors. Used for repeated fields when 789 // Defines a set to store field descriptors. Used for repeated fields when
800 // they are configured as TreatAsSet. 790 // they are configured as TreatAsSet.
801 typedef std::set<const FieldDescriptor*> FieldSet; 791 typedef set<const FieldDescriptor*> FieldSet;
802 792
803 Reporter* reporter_; 793 Reporter* reporter_;
804 DefaultFieldComparator default_field_comparator_; 794 DefaultFieldComparator default_field_comparator_;
805 FieldComparator* field_comparator_; 795 FieldComparator* field_comparator_;
806 MessageFieldComparison message_field_comparison_; 796 MessageFieldComparison message_field_comparison_;
807 Scope scope_; 797 Scope scope_;
808 RepeatedFieldComparison repeated_field_comparison_; 798 RepeatedFieldComparison repeated_field_comparison_;
809 799
810 FieldSet set_fields_; 800 FieldSet set_fields_;
811 FieldSet list_fields_; 801 FieldSet list_fields_;
812 // Keeps track of MapKeyComparators that are created within 802 // Keeps track of MapKeyComparators that are created within
813 // MessageDifferencer. These MapKeyComparators should be deleted 803 // MessageDifferencer. These MapKeyComparators should be deleted
814 // before MessageDifferencer is destroyed. 804 // before MessageDifferencer is destroyed.
815 // When TreatAsMap or TreatAsMapWithMultipleFieldsAsKey is called, we don't 805 // When TreatAsMap or TreatAsMapWithMultipleFieldsAsKey is called, we don't
816 // store the supplied FieldDescriptors directly. Instead, a new 806 // store the supplied FieldDescriptors directly. Instead, a new
817 // MapKeyComparator is created for comparison purpose. 807 // MapKeyComparator is created for comparison purpose.
818 std::vector<MapKeyComparator*> owned_key_comparators_; 808 vector<MapKeyComparator*> owned_key_comparators_;
819 FieldKeyComparatorMap map_field_key_comparator_; 809 FieldKeyComparatorMap map_field_key_comparator_;
820 std::vector<IgnoreCriteria*> ignore_criteria_; 810 vector<IgnoreCriteria*> ignore_criteria_;
821 811
822 FieldSet ignored_fields_; 812 FieldSet ignored_fields_;
823 813
814 bool compare_unknown_fields_;
824 bool report_matches_; 815 bool report_matches_;
825 816
826 string* output_string_; 817 string* output_string_;
827 818
828 google::protobuf::scoped_ptr<DynamicMessageFactory> dynamic_message_factory_; 819 google::protobuf::scoped_ptr<DynamicMessageFactory> dynamic_message_factory_;
829 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageDifferencer); 820 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageDifferencer);
830 }; 821 };
831 822
832 // This class provides extra information to the FieldComparator::Compare 823 // This class provides extra information to the FieldComparator::Compare
833 // function. 824 // function.
834 class LIBPROTOBUF_EXPORT FieldContext { 825 class LIBPROTOBUF_EXPORT FieldContext {
835 public: 826 public:
836 explicit FieldContext( 827 explicit FieldContext(
837 std::vector<MessageDifferencer::SpecificField>* parent_fields) 828 vector<MessageDifferencer::SpecificField>* parent_fields)
838 : parent_fields_(parent_fields) {} 829 : parent_fields_(parent_fields) {}
839 830
840 std::vector<MessageDifferencer::SpecificField>* parent_fields() const { 831 vector<MessageDifferencer::SpecificField>* parent_fields() const {
841 return parent_fields_; 832 return parent_fields_;
842 } 833 }
843 834
844 private: 835 private:
845 std::vector<MessageDifferencer::SpecificField>* parent_fields_; 836 vector<MessageDifferencer::SpecificField>* parent_fields_;
846 }; 837 };
847 838
848 } 839 }
849 } 840 }
850 841
851 } // namespace google 842 } // namespace google
852 #endif // GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__ 843 #endif // GOOGLE_PROTOBUF_UTIL_MESSAGE_DIFFERENCER_H__
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698