15a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Protocol Buffers - Google's data interchange format
25a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Copyright 2008 Google Inc.  All rights reserved.
35a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// https://developers.google.com/protocol-buffers/
45a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
55a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Redistribution and use in source and binary forms, with or without
65a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// modification, are permitted provided that the following conditions are
75a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// met:
85a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
95a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions of source code must retain the above copyright
105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// notice, this list of conditions and the following disclaimer.
115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Redistributions in binary form must reproduce the above
125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// copyright notice, this list of conditions and the following disclaimer
135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// in the documentation and/or other materials provided with the
145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// distribution.
155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//     * Neither the name of Google Inc. nor the names of its
165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// contributors may be used to endorse or promote products derived from
175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// this software without specific prior written permission.
185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This header defines the RepeatedFieldRef class template used to access
325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// repeated fields with protobuf reflection API.
335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef GOOGLE_PROTOBUF_REFLECTION_H__
345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define GOOGLE_PROTOBUF_REFLECTION_H__
355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <memory>
375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#ifndef _SHARED_PTR_H
385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/stubs/shared_ptr.h>
395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif
405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/message.h>
425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#include <google/protobuf/generated_enum_util.h>
435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace google {
455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace protobuf {
465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace internal {
475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T, typename Enable = void>
485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct RefTypeTraits;
495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace internal
505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotRepeatedFieldRef<T> Reflection::GetRepeatedFieldRef(
535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const Message& message, const FieldDescriptor* field) const {
545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return RepeatedFieldRef<T>(message, field);
555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotMutableRepeatedFieldRef<T> Reflection::GetMutableRepeatedFieldRef(
595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Message* message, const FieldDescriptor* field) const {
605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  return MutableRepeatedFieldRef<T>(message, field);
615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}
625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// RepeatedFieldRef definition for non-message types.
645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass RepeatedFieldRef<
665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if<!internal::is_base_of<Message, T>::value>::type> {
675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename internal::RefTypeTraits<T>::iterator IteratorType;
685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool empty() const {
725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->IsEmpty(data_);
735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int size() const {
755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->Size(data_);
765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  T Get(int index) const {
785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->template Get<T>(data_, index);
795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef IteratorType iterator;
825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef IteratorType const_iterator;
835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  iterator begin() const {
845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return iterator(data_, accessor_, true);
855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  iterator end() const {
875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return iterator(data_, accessor_, false);
885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Reflection;
925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRef(
935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const Message& message,
945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const FieldDescriptor* field) {
955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const Reflection* reflection = message.GetReflection();
965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    data_ = reflection->RepeatedFieldData(
975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        const_cast<Message*>(&message), field,
985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        internal::RefTypeTraits<T>::cpp_type, NULL);
995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_ = reflection->RepeatedFieldAccessor(field);
1005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const void* data_;
1035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const AccessorType* accessor_;
1045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
1055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// MutableRepeatedFieldRef definition for non-message types.
1075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
1085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MutableRepeatedFieldRef<
1095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if<!internal::is_base_of<Message, T>::value>::type> {
1105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
1115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
1135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool empty() const {
1145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->IsEmpty(data_);
1155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int size() const {
1175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->Size(data_);
1185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  T Get(int index) const {
1205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->template Get<T>(data_, index);
1215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Set(int index, const T& value) const {
1245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->template Set<T>(data_, index, value);
1255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Add(const T& value) const {
1275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->template Add<T>(data_, value);
1285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void RemoveLast() const {
1305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->RemoveLast(data_);
1315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SwapElements(int index1, int index2) const {
1335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->SwapElements(data_, index1, index2);
1345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Clear() const {
1365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->Clear(data_);
1375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Swap(const MutableRepeatedFieldRef& other) const {
1405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->Swap(data_, other.accessor_, other.data_);
1415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template<typename Container>
1445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void MergeFrom(const Container& container) const {
1455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    typedef typename Container::const_iterator Iterator;
1465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    for (Iterator it = container.begin(); it != container.end(); ++it) {
1475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      Add(*it);
1485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
1495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template<typename Container>
1515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyFrom(const Container& container) const {
1525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Clear();
1535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    MergeFrom(container);
1545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
1575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Reflection;
1585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MutableRepeatedFieldRef(
1595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      Message* message,
1605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const FieldDescriptor* field) {
1615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const Reflection* reflection = message->GetReflection();
1625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    data_ = reflection->RepeatedFieldData(
1635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        message, field, internal::RefTypeTraits<T>::cpp_type, NULL);
1645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_ = reflection->RepeatedFieldAccessor(field);
1655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void* data_;
1685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const AccessorType* accessor_;
1695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
1705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// RepeatedFieldRef definition for message types.
1725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
1735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass RepeatedFieldRef<
1745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if<internal::is_base_of<Message, T>::value>::type> {
1755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename internal::RefTypeTraits<T>::iterator IteratorType;
1765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
1775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
1785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
1795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool empty() const {
1805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->IsEmpty(data_);
1815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int size() const {
1835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->Size(data_);
1845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // This method returns a reference to the underlying message object if it
1865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // exists. If a message object doesn't exist (e.g., data stored in serialized
1875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // form), scratch_space will be filled with the data and a reference to it
1885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // will be returned.
1895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //
1905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Example:
1915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   RepeatedFieldRef<Message> h = ...
1925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   unique_ptr<Message> scratch_space(h.NewMessage());
1935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  //   const Message& item = h.Get(index, scratch_space.get());
1945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const T& Get(int index, T* scratch_space) const {
1955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return *static_cast<const T*>(accessor_->Get(data_, index, scratch_space));
1965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
1975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Create a new message of the same type as the messages stored in this
1985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // repeated field. Caller takes ownership of the returned object.
1995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  T* NewMessage() const {
2005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<T*>(default_instance_->New());
2015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef IteratorType iterator;
2045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef IteratorType const_iterator;
2055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  iterator begin() const {
2065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return iterator(data_, accessor_, true, NewMessage());
2075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  iterator end() const {
2095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return iterator(data_, accessor_, false, NewMessage());
2105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
2135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Reflection;
2145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRef(
2155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const Message& message,
2165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const FieldDescriptor* field) {
2175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const Reflection* reflection = message.GetReflection();
2185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    data_ = reflection->RepeatedFieldData(
2195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        const_cast<Message*>(&message), field,
2205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        internal::RefTypeTraits<T>::cpp_type,
2215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        internal::RefTypeTraits<T>::GetMessageFieldDescriptor());
2225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_ = reflection->RepeatedFieldAccessor(field);
2235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    default_instance_ =
2245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        reflection->GetMessageFactory()->GetPrototype(field->message_type());
2255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const void* data_;
2285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const AccessorType* accessor_;
2295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Message* default_instance_;
2305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
2315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// MutableRepeatedFieldRef definition for message types.
2335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
2345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass MutableRepeatedFieldRef<
2355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if<internal::is_base_of<Message, T>::value>::type> {
2365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
2375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
2395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool empty() const {
2405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->IsEmpty(data_);
2415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  int size() const {
2435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return accessor_->Size(data_);
2445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // See comments for RepeatedFieldRef<Message>::Get()
2465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const T& Get(int index, T* scratch_space) const {
2475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return *static_cast<const T*>(accessor_->Get(data_, index, scratch_space));
2485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Create a new message of the same type as the messages stored in this
2505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // repeated field. Caller takes ownership of the returned object.
2515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  T* NewMessage() const {
2525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<T*>(default_instance_->New());
2535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Set(int index, const T& value) const {
2565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->Set(data_, index, &value);
2575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Add(const T& value) const {
2595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->Add(data_, &value);
2605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void RemoveLast() const {
2625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->RemoveLast(data_);
2635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void SwapElements(int index1, int index2) const {
2655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->SwapElements(data_, index1, index2);
2665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Clear() const {
2685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->Clear(data_);
2695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Swap(const MutableRepeatedFieldRef& other) const {
2725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->Swap(data_, other.accessor_, other.data_);
2735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template<typename Container>
2765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void MergeFrom(const Container& container) const {
2775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    typedef typename Container::const_iterator Iterator;
2785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    for (Iterator it = container.begin(); it != container.end(); ++it) {
2795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      Add(*it);
2805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
2815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template<typename Container>
2835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void CopyFrom(const Container& container) const {
2845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Clear();
2855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    MergeFrom(container);
2865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
2875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
2885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot private:
2895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  friend class Reflection;
2905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  MutableRepeatedFieldRef(
2915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      Message* message,
2925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const FieldDescriptor* field) {
2935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    const Reflection* reflection = message->GetReflection();
2945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    data_ = reflection->RepeatedFieldData(
2955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        message, field, internal::RefTypeTraits<T>::cpp_type,
2965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        internal::RefTypeTraits<T>::GetMessageFieldDescriptor());
2975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_ = reflection->RepeatedFieldAccessor(field);
2985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    default_instance_ =
2995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        reflection->GetMessageFactory()->GetPrototype(field->message_type());
3005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void* data_;
3035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const AccessorType* accessor_;
3045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const Message* default_instance_;
3055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
3065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotnamespace internal {
3085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Interfaces used to implement reflection RepeatedFieldRef API.
3095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Reflection::GetRepeatedAccessor() should return a pointer to an singleton
3105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// object that implements the below interface.
3115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
3125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// This interface passes/returns values using void pointers. The actual type
3135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// of the value depends on the field's cpp_type. Following is a mapping from
3145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// cpp_type to the type that should be used in this interface:
3155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
3165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   field->cpp_type()      T                Actual type of void*
3175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_INT32        int32                   int32
3185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_UINT32       uint32                  uint32
3195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_INT64        int64                   int64
3205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_UINT64       uint64                  uint64
3215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_DOUBLE       double                  double
3225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_FLOAT        float                   float
3235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_BOOL         bool                    bool
3245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_ENUM         generated enum type     int32
3255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_STRING       string                  string
3265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   CPPTYPE_MESSAGE      generated message type  google::protobuf::Message
3275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//                        or google::protobuf::Message
3285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
3295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Note that for enums we use int32 in the interface.
3305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//
3315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// You can map from T to the actual type using RefTypeTraits:
3325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot//   typedef RefTypeTraits<T>::AccessorValueType ActualType;
3335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass LIBPROTOBUF_EXPORT RepeatedFieldAccessor {
3345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
3355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Typedefs for clarity.
3365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef void Field;
3375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef void Value;
3385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef void Iterator;
3395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual ~RepeatedFieldAccessor();
3415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual bool IsEmpty(const Field* data) const = 0;
3425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual int Size(const Field* data) const = 0;
3435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Depends on the underlying representation of the repeated field, this
3445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // method can return a pointer to the underlying object if such an object
3455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // exists, or fill the data into scratch_space and return scratch_space.
3465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Callers of this method must ensure scratch_space is a valid pointer
3475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // to a mutable object of the correct type.
3485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual const Value* Get(
3495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      const Field* data, int index, Value* scratch_space) const = 0;
3505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual void Clear(Field* data) const = 0;
3525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual void Set(Field* data, int index, const Value* value) const = 0;
3535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual void Add(Field* data, const Value* value) const = 0;
3545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual void RemoveLast(Field* data) const = 0;
3555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual void SwapElements(Field* data, int index1, int index2) const = 0;
3565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual void Swap(Field* data, const RepeatedFieldAccessor* other_mutator,
3575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                    Field* other_data) const = 0;
3585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Create an iterator that points at the begining of the repeated field.
3605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual Iterator* BeginIterator(const Field* data) const = 0;
3615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Create an iterator that points at the end of the repeated field.
3625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual Iterator* EndIterator(const Field* data) const = 0;
3635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Make a copy of an iterator and return the new copy.
3645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual Iterator* CopyIterator(const Field* data,
3655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                 const Iterator* iterator) const = 0;
3665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Move an iterator to point to the next element.
3675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual Iterator* AdvanceIterator(const Field* data,
3685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                    Iterator* iterator) const = 0;
3695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Compare whether two iterators point to the same element.
3705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual bool EqualsIterator(const Field* data, const Iterator* a,
3715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                              const Iterator* b) const = 0;
3725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Delete an iterator created by BeginIterator(), EndIterator() and
3735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // CopyIterator().
3745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual void DeleteIterator(const Field* data, Iterator* iterator) const = 0;
3755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Like Get() but for iterators.
3765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  virtual const Value* GetIteratorValue(const Field* data,
3775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                        const Iterator* iterator,
3785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                                        Value* scratch_space) const = 0;
3795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Templated methods that make using this interface easier for non-message
3815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // types.
3825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template<typename T>
3835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  T Get(const Field* data, int index) const {
3845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    typedef typename RefTypeTraits<T>::AccessorValueType ActualType;
3855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ActualType scratch_space;
3865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<T>(
3875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        *reinterpret_cast<const ActualType*>(
3885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            Get(data, index, static_cast<Value*>(&scratch_space))));
3895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
3905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
3915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template<typename T, typename ValueType>
3925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Set(Field* data, int index, const ValueType& value) const {
3935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    typedef typename RefTypeTraits<T>::AccessorValueType ActualType;
3945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // In this RepeatedFieldAccessor interface we pass/return data using
3955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // raw pointers. Type of the data these raw pointers point to should
3965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // be ActualType. Here we have a ValueType object and want a ActualType
3975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // pointer. We can't cast a ValueType pointer to an ActualType pointer
3985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // directly because their type might be different (for enums ValueType
3995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // may be a generated enum type while ActualType is int32). To be safe
4005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // we make a copy to get a temporary ActualType object and use it.
4015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ActualType tmp = static_cast<ActualType>(value);
4025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Set(data, index, static_cast<const Value*>(&tmp));
4035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  template<typename T, typename ValueType>
4065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void Add(Field* data, const ValueType& value) const {
4075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    typedef typename RefTypeTraits<T>::AccessorValueType ActualType;
4085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // In this RepeatedFieldAccessor interface we pass/return data using
4095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // raw pointers. Type of the data these raw pointers point to should
4105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // be ActualType. Here we have a ValueType object and want a ActualType
4115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // pointer. We can't cast a ValueType pointer to an ActualType pointer
4125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // directly because their type might be different (for enums ValueType
4135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // may be a generated enum type while ActualType is int32). To be safe
4145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    // we make a copy to get a temporary ActualType object and use it.
4155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    ActualType tmp = static_cast<ActualType>(value);
4165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    Add(data, static_cast<const Value*>(&tmp));
4175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
4195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// Implement (Mutable)RepeatedFieldRef::iterator
4215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
4225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotclass RepeatedFieldRefIterator
4235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    : public std::iterator<std::forward_iterator_tag, T> {
4245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename RefTypeTraits<T>::AccessorValueType AccessorValueType;
4255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename RefTypeTraits<T>::IteratorValueType IteratorValueType;
4265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef typename RefTypeTraits<T>::IteratorPointerType IteratorPointerType;
4275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot public:
4295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Constructor for non-message fields.
4305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRefIterator(const void* data,
4315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           const RepeatedFieldAccessor* accessor,
4325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           bool begin)
4335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : data_(data), accessor_(accessor),
4345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        iterator_(begin ? accessor->BeginIterator(data) :
4355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                          accessor->EndIterator(data)),
4365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        scratch_space_(new AccessorValueType) {
4375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // Constructor for message fields.
4395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRefIterator(const void* data,
4405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           const RepeatedFieldAccessor* accessor,
4415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           bool begin,
4425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                           AccessorValueType* scratch_space)
4435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : data_(data), accessor_(accessor),
4445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        iterator_(begin ? accessor->BeginIterator(data) :
4455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                          accessor->EndIterator(data)),
4465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        scratch_space_(scratch_space) {
4475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  ~RepeatedFieldRefIterator() {
4495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    accessor_->DeleteIterator(data_, iterator_);
4505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRefIterator operator++(int) {
4525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    RepeatedFieldRefIterator tmp(*this);
4535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    iterator_ = accessor_->AdvanceIterator(data_, iterator_);
4545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return tmp;
4555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRefIterator& operator++() {
4575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    iterator_ = accessor_->AdvanceIterator(data_, iterator_);
4585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return *this;
4595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  IteratorValueType operator*() const {
4615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<IteratorValueType>(
4625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        *static_cast<const AccessorValueType*>(
4635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            accessor_->GetIteratorValue(
4645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot                data_, iterator_, scratch_space_.get())));
4655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  IteratorPointerType operator->() const {
4675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return static_cast<IteratorPointerType>(
4685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        accessor_->GetIteratorValue(
4695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot            data_, iterator_, scratch_space_.get()));
4705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool operator!=(const RepeatedFieldRefIterator& other) const {
4725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(data_ == other.data_);
4735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    assert(accessor_ == other.accessor_);
4745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return !accessor_->EqualsIterator(data_, iterator_, other.iterator_);
4755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  bool operator==(const RepeatedFieldRefIterator& other) const {
4775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return !this->operator!=(other);
4785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRefIterator(const RepeatedFieldRefIterator& other)
4815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      : data_(other.data_), accessor_(other.accessor_),
4825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot        iterator_(accessor_->CopyIterator(data_, other.iterator_)) {
4835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  RepeatedFieldRefIterator& operator=(const RepeatedFieldRefIterator& other) {
4855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    if (this != &other) {
4865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      accessor_->DeleteIterator(data_, iterator_);
4875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      data_ = other.data_;
4885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      accessor_ = other.accessor_;
4895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      iterator_ = accessor_->CopyIterator(data_, other.iterator_);
4905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    }
4915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return *this;
4925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
4935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
4945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot protected:
4955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const void* data_;
4965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  const RepeatedFieldAccessor* accessor_;
4975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  void* iterator_;
4985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  google::protobuf::scoped_ptr<AccessorValueType> scratch_space_;
4995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5015a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// TypeTraits that maps the type parameter T of RepeatedFieldRef or
5025a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// MutableRepeatedFieldRef to corresponding iterator type,
5035a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot// RepeatedFieldAccessor type, etc.
5045a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
5055a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct PrimitiveTraits {
5065a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const bool is_primitive = false;
5075a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5085a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#define DEFINE_PRIMITIVE(TYPE, type) \
5095a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    template<> struct PrimitiveTraits<type> { \
5105a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      static const bool is_primitive = true; \
5115a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      static const FieldDescriptor::CppType cpp_type = \
5125a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot          FieldDescriptor::CPPTYPE_ ## TYPE; \
5135a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    };
5145a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotDEFINE_PRIMITIVE(INT32, int32)
5155a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotDEFINE_PRIMITIVE(UINT32, uint32)
5165a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotDEFINE_PRIMITIVE(INT64, int64)
5175a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotDEFINE_PRIMITIVE(UINT64, uint64)
5185a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotDEFINE_PRIMITIVE(FLOAT, float)
5195a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotDEFINE_PRIMITIVE(DOUBLE, double)
5205a6e989368cab2b72ab8db50330d02e459b47d4android-build-team RobotDEFINE_PRIMITIVE(BOOL, bool)
5215a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#undef DEFINE_PRIMITIVE
5225a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5235a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
5245a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct RefTypeTraits<
5255a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if<PrimitiveTraits<T>::is_primitive>::type> {
5265a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldRefIterator<T> iterator;
5275a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldAccessor AccessorType;
5285a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef T AccessorValueType;
5295a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef T IteratorValueType;
5305a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef T* IteratorPointerType;
5315a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const FieldDescriptor::CppType cpp_type =
5325a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      PrimitiveTraits<T>::cpp_type;
5335a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const Descriptor* GetMessageFieldDescriptor() {
5345a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return NULL;
5355a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
5365a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5375a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5385a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
5395a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct RefTypeTraits<
5405a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if<is_proto_enum<T>::value>::type> {
5415a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldRefIterator<T> iterator;
5425a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldAccessor AccessorType;
5435a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  // We use int32 for repeated enums in RepeatedFieldAccessor.
5445a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef int32 AccessorValueType;
5455a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef T IteratorValueType;
5465a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef int32* IteratorPointerType;
5475a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const FieldDescriptor::CppType cpp_type =
5485a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      FieldDescriptor::CPPTYPE_ENUM;
5495a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const Descriptor* GetMessageFieldDescriptor() {
5505a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return NULL;
5515a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
5525a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5535a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5545a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
5555a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct RefTypeTraits<
5565a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if< ::google::protobuf::internal::is_same<string, T>::value>::type> {
5575a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldRefIterator<T> iterator;
5585a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldAccessor AccessorType;
5595a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef string AccessorValueType;
5605a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef string IteratorValueType;
5615a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef string* IteratorPointerType;
5625a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const FieldDescriptor::CppType cpp_type =
5635a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      FieldDescriptor::CPPTYPE_STRING;
5645a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const Descriptor* GetMessageFieldDescriptor() {
5655a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return NULL;
5665a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
5675a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5685a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5695a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
5705a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct MessageDescriptorGetter {
5715a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const Descriptor* get() {
5725a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return T::default_instance().GetDescriptor();
5735a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
5745a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5755a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<>
5765a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct MessageDescriptorGetter<Message> {
5775a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const Descriptor* get() {
5785a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return NULL;
5795a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
5805a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5815a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
5825a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robottemplate<typename T>
5835a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robotstruct RefTypeTraits<
5845a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    T, typename internal::enable_if<internal::is_base_of<Message, T>::value>::type> {
5855a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldRefIterator<T> iterator;
5865a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef RepeatedFieldAccessor AccessorType;
5875a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef Message AccessorValueType;
5885a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const T& IteratorValueType;
5895a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  typedef const T* IteratorPointerType;
5905a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const FieldDescriptor::CppType cpp_type =
5915a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot      FieldDescriptor::CPPTYPE_MESSAGE;
5925a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  static const Descriptor* GetMessageFieldDescriptor() {
5935a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot    return MessageDescriptorGetter<T>::get();
5945a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot  }
5955a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot};
5965a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace internal
5975a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace protobuf
5985a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot}  // namespace google
5995a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot
6005a6e989368cab2b72ab8db50330d02e459b47d4android-build-team Robot#endif  // GOOGLE_PROTOBUF_REFLECTION_H__
601