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