1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Contains container classes to represent different protocol buffer types.
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleThis file defines container classes which represent categories of protocol
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebuffer field types which need extra maintenance. Currently these categories
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleare:
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  - Repeated scalar fields - These are all repeated fields which aren't
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    composite (e.g. they are of simple types like int32, string, etc).
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  - Repeated composite fields - Repeated fields which are composite. This
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    includes groups and nested messages.
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'petar@google.com (Petar Petrov)'
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass BaseContainer(object):
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Base container class."""
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Minimizes memory usage and disallows assignment to other attributes.
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  __slots__ = ['_message_listener', '_values']
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, message_listener):
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message_listener: A MessageListener implementation.
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        The RepeatedScalarFieldContainer will call this object's
57d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        Modified() method when it is modified.
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._message_listener = message_listener
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._values = []
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __getitem__(self, key):
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Retrieves item by the specified key."""
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return self._values[key]
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __len__(self):
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Returns the number of elements in the container."""
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return len(self._values)
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __ne__(self, other):
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Checks if another instance isn't equal to this one."""
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The concrete classes should define __eq__.
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return not self == other
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
75d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def __repr__(self):
76d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    return repr(self._values)
77d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedScalarFieldContainer(BaseContainer):
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Simple, type-checked, list-like container for holding repeated scalars."""
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Disallows assignment to other attributes.
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  __slots__ = ['_type_checker']
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, message_listener, type_checker):
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message_listener: A MessageListener implementation.
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        The RepeatedScalarFieldContainer will call this object's
91d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        Modified() method when it is modified.
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      type_checker: A type_checkers.ValueChecker instance to run on elements
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        inserted into this container.
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(RepeatedScalarFieldContainer, self).__init__(message_listener)
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._type_checker = type_checker
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def append(self, value):
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Appends an item to the list. Similar to list.append()."""
100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._type_checker.CheckValue(value)
101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._values.append(value)
102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if not self._message_listener.dirty:
103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      self._message_listener.Modified()
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def insert(self, key, value):
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Inserts the item at the specified position. Similar to list.insert()."""
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._type_checker.CheckValue(value)
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._values.insert(key, value)
109d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if not self._message_listener.dirty:
110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      self._message_listener.Modified()
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def extend(self, elem_seq):
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Extends by appending the given sequence. Similar to list.extend()."""
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if not elem_seq:
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    new_values = []
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for elem in elem_seq:
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self._type_checker.CheckValue(elem)
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      new_values.append(elem)
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._values.extend(new_values)
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def MergeFrom(self, other):
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Appends the contents of another repeated field of the same type to this
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    one. We do not check the types of the individual fields.
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._values.extend(other._values)
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def remove(self, elem):
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Removes an item from the list. Similar to list.remove()."""
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._values.remove(elem)
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __setitem__(self, key, value):
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Sets the item on the specified position."""
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._type_checker.CheckValue(value)
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._values[key] = value
140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __getslice__(self, start, stop):
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Retrieves the subset of items from between the specified indices."""
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return self._values[start:stop]
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __setslice__(self, start, stop, values):
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Sets the subset of items from between the specified indices."""
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    new_values = []
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for value in values:
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self._type_checker.CheckValue(value)
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      new_values.append(value)
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._values[start:stop] = new_values
153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __delitem__(self, key):
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Deletes the item at the specified position."""
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del self._values[key]
158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __delslice__(self, start, stop):
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Deletes the subset of items from between the specified indices."""
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del self._values[start:stop]
163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __eq__(self, other):
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Compares the current instance with another one."""
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if self is other:
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return True
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Special case for the same type which should be common and fast.
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if isinstance(other, self.__class__):
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return other._values == self._values
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # We are presumably comparing against some other sequence type.
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return other == self._values
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass RepeatedCompositeFieldContainer(BaseContainer):
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Simple, list-like container for holding repeated composite fields."""
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Disallows assignment to other attributes.
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  __slots__ = ['_message_descriptor']
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __init__(self, message_listener, message_descriptor):
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Note that we pass in a descriptor instead of the generated directly,
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    since at the time we construct a _RepeatedCompositeFieldContainer we
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    haven't yet necessarily initialized the type that will be contained in the
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    container.
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message_listener: A MessageListener implementation.
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        The RepeatedCompositeFieldContainer will call this object's
193d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville        Modified() method when it is modified.
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      message_descriptor: A Descriptor instance describing the protocol type
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        that should be present in this container.  We'll use the
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        _concrete_class field of this descriptor when the client calls add().
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    super(RepeatedCompositeFieldContainer, self).__init__(message_listener)
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._message_descriptor = message_descriptor
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def add(self):
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    new_element = self._message_descriptor._concrete_class()
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    new_element._SetListener(self._message_listener)
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._values.append(new_element)
205d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if not self._message_listener.dirty:
206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      self._message_listener.Modified()
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return new_element
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
209d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def MergeFrom(self, other):
210d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """Appends the contents of another repeated field of the same type to this
211d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    one, copying each individual message.
212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    message_class = self._message_descriptor._concrete_class
214d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    listener = self._message_listener
215d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    values = self._values
216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    for message in other._values:
217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      new_element = message_class()
218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      new_element._SetListener(listener)
219d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      new_element.MergeFrom(message)
220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      values.append(new_element)
221d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    listener.Modified()
222d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __getslice__(self, start, stop):
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Retrieves the subset of items from between the specified indices."""
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return self._values[start:stop]
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __delitem__(self, key):
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Deletes the item at the specified position."""
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del self._values[key]
230d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __delslice__(self, start, stop):
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Deletes the subset of items from between the specified indices."""
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del self._values[start:stop]
235d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._message_listener.Modified()
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def __eq__(self, other):
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Compares the current instance with another one."""
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if self is other:
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return True
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if not isinstance(other, self.__class__):
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      raise TypeError('Can only compare repeated composite fields against '
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                      'other repeated composite fields.')
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return self._values == other._values
245