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

Side by Side Diff: third_party/protobuf/python/google/protobuf/internal/containers.py

Issue 2590803003: Revert "third_party/protobuf: Update to HEAD (83d681ee2c)" (Closed)
Patch Set: Created 4 years 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 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 raise TypeError('Can only compare repeated composite fields against ' 429 raise TypeError('Can only compare repeated composite fields against '
430 'other repeated composite fields.') 430 'other repeated composite fields.')
431 return self._values == other._values 431 return self._values == other._values
432 432
433 433
434 class ScalarMap(MutableMapping): 434 class ScalarMap(MutableMapping):
435 435
436 """Simple, type-checked, dict-like container for holding repeated scalars.""" 436 """Simple, type-checked, dict-like container for holding repeated scalars."""
437 437
438 # Disallows assignment to other attributes. 438 # Disallows assignment to other attributes.
439 __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener', 439 __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener']
440 '_entry_descriptor']
441 440
442 def __init__(self, message_listener, key_checker, value_checker, 441 def __init__(self, message_listener, key_checker, value_checker):
443 entry_descriptor):
444 """ 442 """
445 Args: 443 Args:
446 message_listener: A MessageListener implementation. 444 message_listener: A MessageListener implementation.
447 The ScalarMap will call this object's Modified() method when it 445 The ScalarMap will call this object's Modified() method when it
448 is modified. 446 is modified.
449 key_checker: A type_checkers.ValueChecker instance to run on keys 447 key_checker: A type_checkers.ValueChecker instance to run on keys
450 inserted into this container. 448 inserted into this container.
451 value_checker: A type_checkers.ValueChecker instance to run on values 449 value_checker: A type_checkers.ValueChecker instance to run on values
452 inserted into this container. 450 inserted into this container.
453 entry_descriptor: The MessageDescriptor of a map entry: key and value.
454 """ 451 """
455 self._message_listener = message_listener 452 self._message_listener = message_listener
456 self._key_checker = key_checker 453 self._key_checker = key_checker
457 self._value_checker = value_checker 454 self._value_checker = value_checker
458 self._entry_descriptor = entry_descriptor
459 self._values = {} 455 self._values = {}
460 456
461 def __getitem__(self, key): 457 def __getitem__(self, key):
462 try: 458 try:
463 return self._values[key] 459 return self._values[key]
464 except KeyError: 460 except KeyError:
465 key = self._key_checker.CheckValue(key) 461 key = self._key_checker.CheckValue(key)
466 val = self._value_checker.DefaultValue() 462 val = self._value_checker.DefaultValue()
467 self._values[key] = val 463 self._values[key] = val
468 return val 464 return val
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 # self._values is to ensure that its size changes. 506 # self._values is to ensure that its size changes.
511 original = self._values 507 original = self._values
512 self._values = original.copy() 508 self._values = original.copy()
513 original[None] = None 509 original[None] = None
514 510
515 # This is defined in the abstract base, but we can do it much more cheaply. 511 # This is defined in the abstract base, but we can do it much more cheaply.
516 def clear(self): 512 def clear(self):
517 self._values.clear() 513 self._values.clear()
518 self._message_listener.Modified() 514 self._message_listener.Modified()
519 515
520 def GetEntryClass(self):
521 return self._entry_descriptor._concrete_class
522
523 516
524 class MessageMap(MutableMapping): 517 class MessageMap(MutableMapping):
525 518
526 """Simple, type-checked, dict-like container for with submessage values.""" 519 """Simple, type-checked, dict-like container for with submessage values."""
527 520
528 # Disallows assignment to other attributes. 521 # Disallows assignment to other attributes.
529 __slots__ = ['_key_checker', '_values', '_message_listener', 522 __slots__ = ['_key_checker', '_values', '_message_listener',
530 '_message_descriptor', '_entry_descriptor'] 523 '_message_descriptor']
531 524
532 def __init__(self, message_listener, message_descriptor, key_checker, 525 def __init__(self, message_listener, message_descriptor, key_checker):
533 entry_descriptor):
534 """ 526 """
535 Args: 527 Args:
536 message_listener: A MessageListener implementation. 528 message_listener: A MessageListener implementation.
537 The ScalarMap will call this object's Modified() method when it 529 The ScalarMap will call this object's Modified() method when it
538 is modified. 530 is modified.
539 key_checker: A type_checkers.ValueChecker instance to run on keys 531 key_checker: A type_checkers.ValueChecker instance to run on keys
540 inserted into this container. 532 inserted into this container.
541 value_checker: A type_checkers.ValueChecker instance to run on values 533 value_checker: A type_checkers.ValueChecker instance to run on values
542 inserted into this container. 534 inserted into this container.
543 entry_descriptor: The MessageDescriptor of a map entry: key and value.
544 """ 535 """
545 self._message_listener = message_listener 536 self._message_listener = message_listener
546 self._message_descriptor = message_descriptor 537 self._message_descriptor = message_descriptor
547 self._key_checker = key_checker 538 self._key_checker = key_checker
548 self._entry_descriptor = entry_descriptor
549 self._values = {} 539 self._values = {}
550 540
551 def __getitem__(self, key): 541 def __getitem__(self, key):
552 try: 542 try:
553 return self._values[key] 543 return self._values[key]
554 except KeyError: 544 except KeyError:
555 key = self._key_checker.CheckValue(key) 545 key = self._key_checker.CheckValue(key)
556 new_element = self._message_descriptor._concrete_class() 546 new_element = self._message_descriptor._concrete_class()
557 new_element._SetListener(self._message_listener) 547 new_element._SetListener(self._message_listener)
558 self._values[key] = new_element 548 self._values[key] = new_element
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 return len(self._values) 587 return len(self._values)
598 588
599 def __iter__(self): 589 def __iter__(self):
600 return iter(self._values) 590 return iter(self._values)
601 591
602 def __repr__(self): 592 def __repr__(self):
603 return repr(self._values) 593 return repr(self._values)
604 594
605 def MergeFrom(self, other): 595 def MergeFrom(self, other):
606 for key in other: 596 for key in other:
607 # According to documentation: "When parsing from the wire or when merging, 597 self[key].MergeFrom(other[key])
608 # if there are duplicate map keys the last key seen is used".
609 if key in self:
610 del self[key]
611 self[key].CopyFrom(other[key])
612 # self._message_listener.Modified() not required here, because 598 # self._message_listener.Modified() not required here, because
613 # mutations to submessages already propagate. 599 # mutations to submessages already propagate.
614 600
615 def InvalidateIterators(self): 601 def InvalidateIterators(self):
616 # It appears that the only way to reliably invalidate iterators to 602 # It appears that the only way to reliably invalidate iterators to
617 # self._values is to ensure that its size changes. 603 # self._values is to ensure that its size changes.
618 original = self._values 604 original = self._values
619 self._values = original.copy() 605 self._values = original.copy()
620 original[None] = None 606 original[None] = None
621 607
622 # This is defined in the abstract base, but we can do it much more cheaply. 608 # This is defined in the abstract base, but we can do it much more cheaply.
623 def clear(self): 609 def clear(self):
624 self._values.clear() 610 self._values.clear()
625 self._message_listener.Modified() 611 self._message_listener.Modified()
626
627 def GetEntryClass(self):
628 return self._entry_descriptor._concrete_class
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698