repeated_field.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/ 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions of source code must retain the above copyright 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions in binary form must reproduce the above 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Based on original Protocol Buffers design by 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanjay Ghemawat, Jeff Dean, and others. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RepeatedField and RepeatedPtrField are used by generated protocol message 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// classes to manipulate repeated fields. These classes are very similar to 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// STL's vector, but include a number of optimizations found to be useful 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specifically in the case of Protocol Buffers. RepeatedPtrField is 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particularly different from STL vector as it manages ownership of the 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pointers that it contains. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Typically, clients should not need to access RepeatedField objects directly, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but should instead use the accessor functions generated automatically by the 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// protocol compiler. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GOOGLE_PROTOBUF_REPEATED_FIELD_H__ 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GOOGLE_PROTOBUF_REPEATED_FIELD_H__ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <iterator> 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h> 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/message_lite.h> 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Message; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We need this (from generated_message_reflection.cc). 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LIBPROTOBUF_EXPORT int StringSpaceUsedExcludingSelf(const string& str); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RepeatedField is used to represent repeated fields of a primitive type (in 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// other words, everything except strings and nested Messages). Most users will 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not ever use a RepeatedField directly; they will use the get-by-index, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set-by-index, and add accessors that are generated for all repeated fields. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedField { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField(const RepeatedField& other); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RepeatedField(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField& operator=(const RepeatedField& other); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size() const; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Element& Get(int index) const; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* Mutable(int index); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Set(int index, const Element& value); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Add(const Element& value); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* Add(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the last element in the array. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't provide a way to remove any element other than the last 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because it invites inefficient use, such as O(n^2) filtering loops 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that should have been O(n). If you want to remove an element other 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // than the last, the best way to do it is to re-arrange the elements 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so that the one you want removed is at the end, then call RemoveLast(). 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveLast(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MergeFrom(const RepeatedField& other); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CopyFrom(const RepeatedField& other); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reserve space to expand the field to at least the given size. If the 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // array is grown, it will always be at least doubled in size. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reserve(int new_size); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resize the RepeatedField to a new, smaller size. This is O(1). 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Truncate(int new_size); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAlreadyReserved(const Element& value); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* AddAlreadyReserved(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Capacity() const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the underlying array. This pointer is possibly invalidated by 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any add or remove operation. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* mutable_data(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Element* data() const; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap entire contents with "other". 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(RepeatedField* other); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap two elements. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SwapElements(int index1, int index2); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // STL-like iterator support 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Element* iterator; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef const Element* const_iterator; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Element value_type; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator begin(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator begin() const; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator end(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator end() const; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of bytes used by the repeated field, excluding 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sizeof(*this) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int SpaceUsedExcludingSelf() const; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kInitialSize = 4; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* elements_; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_size_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_size_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element initial_space_[kInitialSize]; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the contents of |from| into |to|, possibly clobbering |from| in the 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process. For primitive types this is just a memcpy(), but it could be 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specialized for non-primitive types to, say, swap each element instead. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MoveArray(Element to[], Element from[], int size); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Copy the elements of |from| into |to|. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CopyArray(Element to[], const Element from[], int size); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename It> class RepeatedPtrIterator; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename It> class RepeatedPtrOverPtrsIterator; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the common base class for RepeatedPtrFields. It deals only in void* 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pointers. Users should not use this interface directly. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The methods of this interface correspond to the methods of RepeatedPtrField, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but may have a template argument called TypeHandler. Its signature is: 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class TypeHandler { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// public: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// typedef MyType Type; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static Type* New(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static void Delete(Type*); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static void Clear(Type*); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static void Merge(const Type& from, Type* to); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // Only needs to be implemented if SpaceUsedExcludingSelf() is called. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static int SpaceUsed(const Type&); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// }; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The reflection implementation needs to call protected methods directly, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reinterpreting pointers as being to Message instead of a specific Message 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subclass. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class GeneratedMessageReflection; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ExtensionSet stores repeated message extensions as 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RepeatedPtrField<MessageLite>, but non-lite ExtensionSets need to 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implement SpaceUsed(), and thus need to call SpaceUsedExcludingSelf() 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reinterpreting MessageLite as Message. ExtensionSet also needs to make 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use of AddFromCleared(), which is not part of the public interface. 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ExtensionSet; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called from destructor. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Destroy(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size() const; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const typename TypeHandler::Type& Get(int index) const; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* Mutable(int index); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* Add(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveLast(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MergeFrom(const RepeatedPtrFieldBase& other); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CopyFrom(const RepeatedPtrFieldBase& other); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reserve(int new_size); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Capacity() const; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for constructing iterators. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* const* raw_data() const; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** raw_mutable_data() const; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type** mutable_data(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const typename TypeHandler::Type* const* data() const; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(RepeatedPtrFieldBase* other); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SwapElements(int index1, int index2); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int SpaceUsedExcludingSelf() const; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Advanced memory management -------------------------------------- 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Like Add(), but if there are no cleared objects to use, returns NULL. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* AddFromCleared(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAllocated(typename TypeHandler::Type* value); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* ReleaseLast(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ClearedCount() const; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddCleared(typename TypeHandler::Type* value); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* ReleaseCleared(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPtrFieldBase); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kInitialSize = 4; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** elements_; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int current_size_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int allocated_size_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int total_size_; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* initial_space_[kInitialSize]; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline typename TypeHandler::Type* cast(void* element) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<typename TypeHandler::Type*>(element); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename TypeHandler> 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static inline const typename TypeHandler::Type* cast(const void* element) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<const typename TypeHandler::Type*>(element); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename GenericType> 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GenericTypeHandler { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef GenericType Type; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static GenericType* New() { return new GenericType; } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Delete(GenericType* value) { delete value; } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Clear(GenericType* value) { value->Clear(); } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Merge(const GenericType& from, GenericType* to) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to->MergeFrom(from); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int SpaceUsed(const GenericType& value) { return value.SpaceUsed(); } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void GenericTypeHandler<MessageLite>::Merge( 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MessageLite& from, MessageLite* to) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to->CheckTypeAndMergeFrom(from); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HACK: If a class is declared as DLL-exported in MSVC, it insists on 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// generating copies of all its methods -- even inline ones -- to include 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the DLL. But SpaceUsed() calls StringSpaceUsedExcludingSelf() which 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// isn't in the lite library, therefore the lite library cannot link if 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// StringTypeHandler is exported. So, we factor out StringTypeHandlerBase, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// export that, then make StringTypeHandler be a subclass which is NOT 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exported. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kenton): There has to be a better way. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LIBPROTOBUF_EXPORT StringTypeHandlerBase { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef string Type; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static string* New(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Delete(string* value); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Clear(string* value) { value->clear(); } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Merge(const string& from, string* to) { *to = from; } 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringTypeHandler : public StringTypeHandlerBase { 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int SpaceUsed(const string& value) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sizeof(value) + StringSpaceUsedExcludingSelf(value); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RepeatedPtrField is like RepeatedField, but used for repeated strings or 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Messages. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedPtrField : public internal::RepeatedPtrFieldBase { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField(const RepeatedPtrField& other); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~RepeatedPtrField(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField& operator=(const RepeatedPtrField& other); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size() const; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Element& Get(int index) const; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* Mutable(int index); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* Add(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveLast(); // Remove the last element in the array. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MergeFrom(const RepeatedPtrField& other); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CopyFrom(const RepeatedPtrField& other); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reserve space to expand the field to at least the given size. This only 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // resizes the pointer array; it doesn't allocate any objects. If the 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // array is grown, it will always be at least doubled in size. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reserve(int new_size); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Capacity() const; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the underlying array. This pointer is possibly invalidated by 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any add or remove operation. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element** mutable_data(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Element* const* data() const; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap entire contents with "other". 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(RepeatedPtrField* other); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap two elements. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SwapElements(int index1, int index2); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // STL-like iterator support 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef internal::RepeatedPtrIterator<Element> iterator; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef internal::RepeatedPtrIterator<const Element> const_iterator; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef Element value_type; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator begin(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator begin() const; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator end(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator end() const; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Custom STL-like iterator that iterates over and returns the underlying 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointers to Element rather than Element itself. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef internal::RepeatedPtrOverPtrsIterator<Element> pointer_iterator; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer_iterator pointer_begin(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer_iterator pointer_end(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns (an estimate of) the number of bytes used by the repeated field, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // excluding sizeof(*this). 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int SpaceUsedExcludingSelf() const; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Advanced memory management -------------------------------------- 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When hardcore memory management becomes necessary -- as it often 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // does here at Google -- the following methods may be useful. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add an already-allocated object, passing ownership to the 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RepeatedPtrField. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddAllocated(Element* value); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the last element and return it, passing ownership to the 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // caller. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requires: size() > 0 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* ReleaseLast(); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When elements are removed by calls to RemoveLast() or Clear(), they 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not actually freed. Instead, they are cleared and kept so that 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // they can be reused later. This can save lots of CPU time when 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repeatedly reusing a protocol message for similar purposes. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Really, extremely hardcore programs may actually want to manipulate 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // these objects to better-optimize memory management. These methods 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // allow that. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the number of cleared objects that are currently being kept 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // around for reuse. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ClearedCount() const; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add an element to the pool of cleared objects, passing ownership to 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the RepeatedPtrField. The element must be cleared prior to calling 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this method. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddCleared(Element* value); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove a single element from the cleared pool and return it, passing 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ownership to the caller. The element is guaranteed to be cleared. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requires: ClearedCount() > 0 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* ReleaseCleared(); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note: RepeatedPtrField SHOULD NOT be subclassed by users. We only 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subclass it in one place as a hack for compatibility with proto1. The 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subclass needs to know about TypeHandler in order to call protected 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // methods on RepeatedPtrFieldBase. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class TypeHandler; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation ==================================================== 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline RepeatedField<Element>::RepeatedField() 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : elements_(initial_space_), 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_(0), 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size_(kInitialSize) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline RepeatedField<Element>::RepeatedField(const RepeatedField& other) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : elements_(initial_space_), 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_(0), 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size_(kInitialSize) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyFrom(other); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedField<Element>::~RepeatedField() { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elements_ != initial_space_) { 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] elements_; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline RepeatedField<Element>& 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedField<Element>::operator=(const RepeatedField& other) { 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyFrom(other); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedField<Element>::size() const { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_size_; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedField<Element>::Capacity() const { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return total_size_; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Element> 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::AddAlreadyReserved(const Element& value) { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LT(size(), Capacity()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[current_size_++] = value; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Element> 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedField<Element>::AddAlreadyReserved() { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LT(size(), Capacity()); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &elements_[current_size_++]; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const Element& RepeatedField<Element>::Get(int index) const { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LT(index, size()); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_[index]; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedField<Element>::Mutable(int index) { 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LT(index, size()); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_ + index; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::Set(int index, const Element& value) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LT(index, size()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[index] = value; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::Add(const Element& value) { 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_size_ == total_size_) Reserve(total_size_ + 1); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[current_size_++] = value; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedField<Element>::Add() { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_size_ == total_size_) Reserve(total_size_ + 1); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &elements_[current_size_++]; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::RemoveLast() { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_GT(current_size_, 0); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --current_size_; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::Clear() { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_ = 0; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::MergeFrom(const RepeatedField& other) { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reserve(current_size_ + other.current_size_); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyArray(elements_ + current_size_, other.elements_, other.current_size_); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_ += other.current_size_; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::CopyFrom(const RepeatedField& other) { 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MergeFrom(other); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedField<Element>::mutable_data() { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const Element* RepeatedField<Element>::data() const { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedField<Element>::Swap(RepeatedField* other) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* swap_elements = elements_; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int swap_current_size = current_size_; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int swap_total_size = total_size_; 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We may not be using initial_space_ but it's not worth checking. Just 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // copy it anyway. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element swap_initial_space[kInitialSize]; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MoveArray(swap_initial_space, initial_space_, kInitialSize); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_ = other->elements_; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_ = other->current_size_; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size_ = other->total_size_; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MoveArray(initial_space_, other->initial_space_, kInitialSize); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other->elements_ = swap_elements; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other->current_size_ = swap_current_size; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other->total_size_ = swap_total_size; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MoveArray(other->initial_space_, swap_initial_space, kInitialSize); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elements_ == other->initial_space_) { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_ = initial_space_; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (other->elements_ == initial_space_) { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) other->elements_ = other->initial_space_; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedField<Element>::SwapElements(int index1, int index2) { 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::swap(elements_[index1], elements_[index2]); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedField<Element>::iterator 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedField<Element>::begin() { 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedField<Element>::const_iterator 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedField<Element>::begin() const { 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedField<Element>::iterator 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedField<Element>::end() { 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_ + current_size_; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedField<Element>::const_iterator 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedField<Element>::end() const { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_ + current_size_; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedField<Element>::SpaceUsedExcludingSelf() const { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Avoid inlining of Reserve(): new, memcpy, and delete[] lead to a significant 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// amount of code bloat. 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedField<Element>::Reserve(int new_size) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (total_size_ >= new_size) return; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element* old_elements = elements_; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size_ = max(total_size_ * 2, new_size); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_ = new Element[total_size_]; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MoveArray(elements_, old_elements, current_size_); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (old_elements != initial_space_) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] old_elements; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::Truncate(int new_size) { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LE(new_size, current_size_); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_ = new_size; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::MoveArray( 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element to[], Element from[], int array_size) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(to, from, array_size * sizeof(Element)); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedField<Element>::CopyArray( 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Element to[], const Element from[], int array_size) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(to, from, array_size * sizeof(Element)); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------- 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline RepeatedPtrFieldBase::RepeatedPtrFieldBase() 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : elements_(initial_space_), 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_(0), 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allocated_size_(0), 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_size_(kInitialSize) { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPtrFieldBase::Destroy() { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < allocated_size_; i++) { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeHandler::Delete(cast<TypeHandler>(elements_[i])); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elements_ != initial_space_) { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete [] elements_; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrFieldBase::size() const { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_size_; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const typename TypeHandler::Type& 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrFieldBase::Get(int index) const { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LT(index, size()); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *cast<TypeHandler>(elements_[index]); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename TypeHandler::Type* 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrFieldBase::Mutable(int index) { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_LT(index, size()); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast<TypeHandler>(elements_[index]); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename TypeHandler::Type* RepeatedPtrFieldBase::Add() { 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_size_ < allocated_size_) { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast<TypeHandler>(elements_[current_size_++]); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (allocated_size_ == total_size_) Reserve(total_size_ + 1); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++allocated_size_; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* result = TypeHandler::New(); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[current_size_++] = result; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrFieldBase::RemoveLast() { 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_GT(current_size_, 0); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeHandler::Clear(cast<TypeHandler>(elements_[--current_size_])); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPtrFieldBase::Clear() { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < current_size_; i++) { 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeHandler::Clear(cast<TypeHandler>(elements_[i])); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_size_ = 0; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrFieldBase::MergeFrom(const RepeatedPtrFieldBase& other) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reserve(current_size_ + other.current_size_); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < other.current_size_; i++) { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeHandler::Merge(other.template Get<TypeHandler>(i), Add<TypeHandler>()); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrFieldBase::CopyFrom(const RepeatedPtrFieldBase& other) { 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::Clear<TypeHandler>(); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrFieldBase::Capacity() const { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return total_size_; 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void* const* RepeatedPtrFieldBase::raw_data() const { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void** RepeatedPtrFieldBase::raw_mutable_data() const { 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return elements_; 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename TypeHandler::Type** RepeatedPtrFieldBase::mutable_data() { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kenton): Breaks C++ aliasing rules. We should probably remove this 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method entirely. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<typename TypeHandler::Type**>(elements_); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const typename TypeHandler::Type* const* 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrFieldBase::data() const { 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kenton): Breaks C++ aliasing rules. We should probably remove this 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // method entirely. 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reinterpret_cast<const typename TypeHandler::Type* const*>(elements_); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrFieldBase::SwapElements(int index1, int index2) { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::swap(elements_[index1], elements_[index2]); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrFieldBase::SpaceUsedExcludingSelf() const { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int allocated_bytes = 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0; 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < allocated_size_; ++i) { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allocated_bytes += TypeHandler::SpaceUsed(*cast<TypeHandler>(elements_[i])); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allocated_bytes; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename TypeHandler::Type* RepeatedPtrFieldBase::AddFromCleared() { 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_size_ < allocated_size_) { 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast<TypeHandler>(elements_[current_size_++]); 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPtrFieldBase::AddAllocated( 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* value) { 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make room for the new pointer. 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_size_ == total_size_) { 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The array is completely full with no cleared objects, so grow it. 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Reserve(total_size_ + 1); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++allocated_size_; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (allocated_size_ == total_size_) { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no more space in the pointer array because it contains some 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cleared objects awaiting reuse. We don't want to grow the array in this 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // case because otherwise a loop calling AddAllocated() followed by Clear() 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // would leak memory. 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeHandler::Delete(cast<TypeHandler>(elements_[current_size_])); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (current_size_ < allocated_size_) { 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have some cleared objects. We don't care about their order, so we 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can just move the first one to the end to make space. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[allocated_size_] = elements_[current_size_]; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++allocated_size_; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There are no cleared objects. 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++allocated_size_; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[current_size_++] = value; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLast() { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_GT(current_size_, 0); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* result = 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cast<TypeHandler>(elements_[--current_size_]); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --allocated_size_; 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_size_ < allocated_size_) { 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There are cleared elements on the end; replace the removed element 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the last allocated element. 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[current_size_] = elements_[allocated_size_]; 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrFieldBase::ClearedCount() const { 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return allocated_size_ - current_size_; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrFieldBase::AddCleared( 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename TypeHandler::Type* value) { 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (allocated_size_ == total_size_) Reserve(total_size_ + 1); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements_[allocated_size_++] = value; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename TypeHandler> 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseCleared() { 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_DCHECK_GT(allocated_size_, current_size_); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cast<TypeHandler>(elements_[--allocated_size_]); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------- 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedPtrField<Element>::TypeHandler 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public internal::GenericTypeHandler<Element> {}; 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <> 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedPtrField<string>::TypeHandler 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public internal::StringTypeHandler {}; 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline RepeatedPtrField<Element>::RepeatedPtrField() {} 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline RepeatedPtrField<Element>::RepeatedPtrField( 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RepeatedPtrField& other) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyFrom(other); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrField<Element>::~RepeatedPtrField() { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Destroy<TypeHandler>(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline RepeatedPtrField<Element>& RepeatedPtrField<Element>::operator=( 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RepeatedPtrField& other) { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CopyFrom(other); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrField<Element>::size() const { 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::size(); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const Element& RepeatedPtrField<Element>::Get(int index) const { 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::Get<TypeHandler>(index); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedPtrField<Element>::Mutable(int index) { 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::Mutable<TypeHandler>(index); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedPtrField<Element>::Add() { 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::Add<TypeHandler>(); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrField<Element>::RemoveLast() { 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::RemoveLast<TypeHandler>(); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrField<Element>::Clear() { 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::Clear<TypeHandler>(); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrField<Element>::MergeFrom( 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RepeatedPtrField& other) { 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrField<Element>::CopyFrom( 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const RepeatedPtrField& other) { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::CopyFrom<TypeHandler>(other); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element** RepeatedPtrField<Element>::mutable_data() { 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::mutable_data<TypeHandler>(); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline const Element* const* RepeatedPtrField<Element>::data() const { 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::data<TypeHandler>(); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPtrField<Element>::Swap(RepeatedPtrField* other) { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::Swap(other); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedPtrField<Element>::SwapElements(int index1, int index2) { 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::SwapElements(index1, index2); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrField<Element>::SpaceUsedExcludingSelf() const { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::SpaceUsedExcludingSelf<TypeHandler>(); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrField<Element>::AddAllocated(Element* value) { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBase::AddAllocated<TypeHandler>(value); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedPtrField<Element>::ReleaseLast() { 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>(); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrField<Element>::ClearedCount() const { 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::ClearedCount(); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrField<Element>::AddCleared(Element* value) { 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::AddCleared<TypeHandler>(value); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Element* RepeatedPtrField<Element>::ReleaseCleared() { 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::ReleaseCleared<TypeHandler>(); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void RepeatedPtrField<Element>::Reserve(int new_size) { 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::Reserve(new_size); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int RepeatedPtrField<Element>::Capacity() const { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RepeatedPtrFieldBase::Capacity(); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------- 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// STL-like iterator implementation for RepeatedPtrField. You should not 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// refer to this class directly; use RepeatedPtrField<T>::iterator instead. 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The iterator for RepeatedPtrField<T>, RepeatedPtrIterator<T>, is 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// very similar to iterator_ptr<T**> in util/gtl/iterator_adaptors-inl.h, 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but adds random-access operators and is modified to wrap a void** base 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iterator (since RepeatedPtrField stores its array as a void* array and 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// casting void** to T** would violate C++ aliasing rules). 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This code based on net/proto/proto-array-internal.h by Jeffrey Yasskin 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (jyasskin@google.com). 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Element> 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedPtrIterator 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public std::iterator< 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::random_access_iterator_tag, Element> { 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef RepeatedPtrIterator<Element> iterator; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::iterator< 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::random_access_iterator_tag, Element> superclass; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the compiler know that these are type names, so we don't have to 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // write "typename" in front of them everywhere. 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename superclass::reference reference; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename superclass::pointer pointer; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename superclass::difference_type difference_type; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrIterator() : it_(NULL) {} 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RepeatedPtrIterator(void* const* it) : it_(it) {} 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow "upcasting" from RepeatedPtrIterator<T**> to 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RepeatedPtrIterator<const T*const*>. 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename OtherElement> 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrIterator(const RepeatedPtrIterator<OtherElement>& other) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : it_(other.it_) { 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force a compiler error if the other type is not convertible to ours. 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (false) { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) implicit_cast<Element*, OtherElement*>(0); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dereferenceable 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reference operator*() const { return *reinterpret_cast<Element*>(*it_); } 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer operator->() const { return &(operator*()); } 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // {inc,dec}rementable 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator++() { ++it_; return *this; } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator operator++(int) { return iterator(it_++); } 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator--() { --it_; return *this; } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator operator--(int) { return iterator(it_--); } 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equality_comparable 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const iterator& x) const { return it_ == x.it_; } 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator!=(const iterator& x) const { return it_ != x.it_; } 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // less_than_comparable 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(const iterator& x) const { return it_ < x.it_; } 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<=(const iterator& x) const { return it_ <= x.it_; } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>(const iterator& x) const { return it_ > x.it_; } 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>=(const iterator& x) const { return it_ >= x.it_; } 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // addable, subtractable 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator+=(difference_type d) { 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_ += d; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend iterator operator+(iterator it, difference_type d) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it += d; 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend iterator operator+(difference_type d, iterator it) { 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it += d; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator-=(difference_type d) { 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_ -= d; 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend iterator operator-(iterator it, difference_type d) { 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it -= d; 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it; 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indexable 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reference operator[](difference_type d) const { return *(*this + d); } 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // random access iterator 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) difference_type operator-(const iterator& x) const { return it_ - x.it_; } 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename OtherElement> 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class RepeatedPtrIterator; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The internal iterator. 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* const* it_; 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provide an iterator that operates on pointers to the underlying objects 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// rather than the objects themselves as RepeatedPtrIterator does. 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Consider using this when working with stl algorithms that change 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the array. 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Element> 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RepeatedPtrOverPtrsIterator 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public std::iterator<std::random_access_iterator_tag, Element*> { 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef RepeatedPtrOverPtrsIterator<Element> iterator; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::iterator< 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::random_access_iterator_tag, Element*> superclass; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the compiler know that these are type names, so we don't have to 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // write "typename" in front of them everywhere. 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename superclass::reference reference; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename superclass::pointer pointer; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef typename superclass::difference_type difference_type; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrOverPtrsIterator() : it_(NULL) {} 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RepeatedPtrOverPtrsIterator(void** it) : it_(it) {} 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dereferenceable 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reference operator*() const { return *reinterpret_cast<Element**>(it_); } 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pointer operator->() const { return &(operator*()); } 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // {inc,dec}rementable 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator++() { ++it_; return *this; } 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator operator++(int) { return iterator(it_++); } 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator--() { --it_; return *this; } 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator operator--(int) { return iterator(it_--); } 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equality_comparable 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator==(const iterator& x) const { return it_ == x.it_; } 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator!=(const iterator& x) const { return it_ != x.it_; } 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // less_than_comparable 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(const iterator& x) const { return it_ < x.it_; } 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<=(const iterator& x) const { return it_ <= x.it_; } 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>(const iterator& x) const { return it_ > x.it_; } 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator>=(const iterator& x) const { return it_ >= x.it_; } 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // addable, subtractable 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator+=(difference_type d) { 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_ += d; 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend iterator operator+(iterator it, difference_type d) { 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it += d; 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend iterator operator+(difference_type d, iterator it) { 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it += d; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iterator& operator-=(difference_type d) { 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it_ -= d; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend iterator operator-(iterator it, difference_type d) { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it -= d; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return it; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indexable 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reference operator[](difference_type d) const { return *(*this + d); } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // random access iterator 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) difference_type operator-(const iterator& x) const { return it_ - x.it_; } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template<typename OtherElement> 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class RepeatedPtrIterator; 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The internal iterator. 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** it_; 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedPtrField<Element>::iterator 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrField<Element>::begin() { 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iterator(raw_data()); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedPtrField<Element>::const_iterator 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrField<Element>::begin() const { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iterator(raw_data()); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedPtrField<Element>::iterator 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrField<Element>::end() { 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iterator(raw_data() + size()); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedPtrField<Element>::const_iterator 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrField<Element>::end() const { 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iterator(raw_data() + size()); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedPtrField<Element>::pointer_iterator 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrField<Element>::pointer_begin() { 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pointer_iterator(raw_mutable_data()); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Element> 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline typename RepeatedPtrField<Element>::pointer_iterator 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedPtrField<Element>::pointer_end() { 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pointer_iterator(raw_mutable_data() + size()); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Iterators and helper functions that follow the spirit of the STL 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::back_insert_iterator and std::back_inserter but are tailor-made 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for RepeatedField and RepatedPtrField. Typical usage would be: 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::copy(some_sequence.begin(), some_sequence.end(), 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// google::protobuf::RepeatedFieldBackInserter(proto.mutable_sequence())); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ported by johannes from util/gtl/proto-array-iterators-inl.h 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A back inserter for RepeatedField objects. 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> class RepeatedFieldBackInsertIterator 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public std::iterator<std::output_iterator_tag, T> { 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RepeatedFieldBackInsertIterator( 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField<T>* const mutable_field) 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : field_(mutable_field) { 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedFieldBackInsertIterator<T>& operator=(const T& value) { 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_->Add(value); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedFieldBackInsertIterator<T>& operator*() { 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedFieldBackInsertIterator<T>& operator++() { 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedFieldBackInsertIterator<T>& operator++(int ignores_parameter) { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedField<T>* field_; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A back inserter for RepeatedPtrField objects. 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> class RepeatedPtrFieldBackInsertIterator 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public std::iterator<std::output_iterator_tag, T> { 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBackInsertIterator( 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField<T>* const mutable_field) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : field_(mutable_field) { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBackInsertIterator<T>& operator=(const T& value) { 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *field_->Add() = value; 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBackInsertIterator<T>& operator=( 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const T* const ptr_to_value) { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *field_->Add() = *ptr_to_value; 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBackInsertIterator<T>& operator*() { 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBackInsertIterator<T>& operator++() { 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrFieldBackInsertIterator<T>& operator++(int ignores_parameter) { 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField<T>* field_; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A back inserter for RepeatedPtrFields that inserts by transfering ownership 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of a pointer. 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> class AllocatedRepeatedPtrFieldBackInsertIterator 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public std::iterator<std::output_iterator_tag, T> { 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit AllocatedRepeatedPtrFieldBackInsertIterator( 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField<T>* const mutable_field) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : field_(mutable_field) { 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator=( 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T* const ptr_to_value) { 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) field_->AddAllocated(ptr_to_value); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator*() { 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++() { 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++( 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ignores_parameter) { 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *this; 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField<T>* field_; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides a back insert iterator for RepeatedField instances, 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// similar to std::back_inserter(). Note the identically named 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function for RepeatedPtrField instances. 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> internal::RepeatedFieldBackInsertIterator<T> 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedFieldBackInserter(RepeatedField<T>* const mutable_field) { 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return internal::RepeatedFieldBackInsertIterator<T>(mutable_field); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides a back insert iterator for RepeatedPtrField instances, 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// similar to std::back_inserter(). Note the identically named 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function for RepeatedField instances. 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> internal::RepeatedPtrFieldBackInsertIterator<T> 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedFieldBackInserter(RepeatedPtrField<T>* const mutable_field) { 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return internal::RepeatedPtrFieldBackInsertIterator<T>(mutable_field); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Provides a back insert iterator for RepeatedPtrField instances 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// similar to std::back_inserter() which transfers the ownership while 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copying elements. 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> internal::AllocatedRepeatedPtrFieldBackInsertIterator<T> 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AllocatedRepeatedPtrFieldBackInserter( 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RepeatedPtrField<T>* const mutable_field) { 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>( 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable_field); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GOOGLE_PROTOBUF_REPEATED_FIELD_H__ 1296