46 #ifndef GOOGLE_PROTOBUF_REPEATED_FIELD_H__ 47 #define GOOGLE_PROTOBUF_REPEATED_FIELD_H__ 67 namespace google_opensource {
78 static const int kMinRepeatedFieldAllocationSize = 4;
83 template <
typename Iter>
88 template <
typename Iter>
90 std::input_iterator_tag ) {
94 template <
typename Iter>
96 typedef typename std::iterator_traits<Iter>::iterator_category Category;
106 template <
typename Element>
112 template <
typename Iter>
121 const Element&
Get(
int index)
const;
122 Element* Mutable(
int index);
123 void Set(
int index,
const Element&
value);
124 void Add(
const Element& value);
133 void ExtractSubrange(
int start,
int num, Element* elements);
141 void Reserve(
int new_size);
144 void Truncate(
int new_size);
146 void AddAlreadyReserved(
const Element& value);
147 Element* AddAlreadyReserved();
148 int Capacity()
const;
153 void Resize(
int new_size,
const Element& value);
157 Element* mutable_data();
158 const Element*
data()
const;
171 void SwapElements(
int index1,
int index2);
185 const_iterator begin()
const;
186 const_iterator cbegin()
const;
188 const_iterator
end()
const;
189 const_iterator cend()
const;
195 return reverse_iterator(
end());
198 return const_reverse_iterator(
end());
201 return reverse_iterator(begin());
203 const_reverse_iterator
rend()
const {
204 return const_reverse_iterator(begin());
209 int SpaceUsedExcludingSelf()
const;
228 return GetArenaNoVirtual();
232 static const int kInitialSize = 0;
253 static const size_t kRepHeaderSize;
259 typedef void InternalArenaConstructable_;
264 void MoveArray(Element* to, Element* from,
int size);
267 void CopyArray(Element* to,
const Element* from,
int size);
272 inline Arena* GetArenaNoVirtual()
const {
273 return (rep_ ==
NULL) ?
NULL : rep_->arena;
279 void InternalDeallocate(Rep* rep,
int size) {
281 Element*
e = &rep->elements[0];
282 Element* limit = &rep->elements[
size];
283 for (; e < limit; e++) {
284 e->Element::~Element();
286 if (rep->arena ==
NULL) {
287 delete[]
reinterpret_cast<char*
>(rep);
293 template<
typename Element>
295 reinterpret_cast<size_t>(&
reinterpret_cast<Rep*
>(16)->elements[0]) - 16;
308 template <
typename Element,
311 void operator()(Element* to,
const Element* from,
int array_size);
335 template<
typename U,
typename RetType, RetType (U::*)(const U& arg)>
337 template<
typename U>
static HasMerge Check(
339 template<
typename U>
static HasMerge Check(
341 template<
typename U>
static HasNoMerge Check(...);
345 (
sizeof(Check<T>(0)) ==
sizeof(HasMerge))>
type;
390 friend class upb::google_opensource::GMR_Handlers;
397 template <
typename TypeHandler>
403 template <
typename TypeHandler>
405 template <
typename TypeHandler>
407 template <
typename TypeHandler>
408 void Delete(
int index);
409 template <
typename TypeHandler>
412 template <
typename TypeHandler>
414 template <
typename TypeHandler>
416 template <
typename TypeHandler>
418 template <
typename TypeHandler>
421 void CloseGap(
int start,
int num);
423 void Reserve(
int new_size);
425 int Capacity()
const;
428 void*
const* raw_data()
const;
429 void** raw_mutable_data()
const;
431 template <
typename TypeHandler>
433 template <
typename TypeHandler>
436 template <
typename TypeHandler>
439 void SwapElements(
int index1,
int index2);
441 template <
typename TypeHandler>
442 int SpaceUsedExcludingSelf()
const;
448 template <
typename TypeHandler>
451 template<
typename TypeHandler>
454 AddAllocatedInternal<TypeHandler>(
value,
t);
457 template <
typename TypeHandler>
460 template <
typename TypeHandler>
463 return ReleaseLastInternal<TypeHandler>(
t);
468 template <
typename TypeHandler>
471 int ClearedCount()
const;
472 template <
typename TypeHandler>
474 template <
typename TypeHandler>
480 template <
typename TypeHandler>
483 template <
typename TypeHandler>
494 template <
typename TypeHandler>
496 template <
typename TypeHandler>
507 static const int kInitialSize = 0;
526 static const size_t kRepHeaderSize =
sizeof(Rep) -
sizeof(
void*);
531 template <
typename TypeHandler>
535 template <
typename TypeHandler>
542 void MergeFromInternal(
546 template<
typename TypeHandler>
547 void MergeFromInnerLoop(
548 void** our_elems,
void** other_elems,
int length,
int already_allocated);
554 void** InternalExtend(
int extend_amount);
559 template <
typename GenericType>
564 return ::google::protobuf::Arena::CreateMaybeMessage<Type>(
565 arena,
static_cast<GenericType*
>(0));
573 static inline ::google::protobuf::Arena*
GetArena(GenericType* value) {
574 return ::google::protobuf::Arena::GetArena<Type>(
value);
577 return ::google::protobuf::Arena::GetArena<Type>(
value);
580 static inline void Clear(GenericType* value) { value->Clear(); }
584 return value.SpaceUsed();
587 return Type::default_instance();
591 template <
typename GenericType>
596 template <
typename GenericType>
602 template <
typename GenericType>
639 #define DECLARE_SPECIALIZATIONS_FOR_BASE_PROTO_TYPES(TypeName) \ 641 TypeName* GenericTypeHandler<TypeName>::NewFromPrototype( \ 642 const TypeName* prototype, google::protobuf::Arena* arena); \ 644 google::protobuf::Arena* GenericTypeHandler<TypeName>::GetArena( \ 647 void* GenericTypeHandler<TypeName>::GetMaybeArenaPointer( \ 656 #undef DECLARE_SPECIALIZATIONS_FOR_BASE_PROTO_TYPES 691 return Arena::Create<string>(arena);
697 static inline ::google::protobuf::Arena*
GetArena(
string*) {
708 static inline void Clear(
string* value) { value->clear(); }
709 static inline void Merge(
const string& from,
string* to) { *to = from; }
727 template <
typename Element>
734 template <
typename Iter>
743 const Element&
Get(
int index)
const;
744 Element* Mutable(
int index);
754 void DeleteSubrange(
int start,
int num);
763 void Reserve(
int new_size);
765 int Capacity()
const;
769 Element** mutable_data();
770 const Element*
const*
data()
const;
783 void SwapElements(
int index1,
int index2);
788 typedef Element value_type;
790 typedef const value_type& const_reference;
792 typedef const value_type* const_pointer;
793 typedef int size_type;
797 const_iterator begin()
const;
798 const_iterator cbegin()
const;
800 const_iterator
end()
const;
801 const_iterator cend()
const;
804 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
805 typedef std::reverse_iterator<iterator> reverse_iterator;
806 reverse_iterator rbegin() {
807 return reverse_iterator(
end());
809 const_reverse_iterator rbegin()
const {
810 return const_reverse_iterator(
end());
812 reverse_iterator rend() {
813 return reverse_iterator(begin());
815 const_reverse_iterator rend()
const {
816 return const_reverse_iterator(begin());
824 const_pointer_iterator;
825 pointer_iterator pointer_begin();
826 const_pointer_iterator pointer_begin()
const;
827 pointer_iterator pointer_end();
828 const_pointer_iterator pointer_end()
const;
832 int SpaceUsedExcludingSelf()
const;
849 void AddAllocated(Element* value);
857 Element* ReleaseLast();
871 void UnsafeArenaAddAllocated(Element* value);
877 Element* UnsafeArenaReleaseLast();
894 void ExtractSubrange(
int start,
int num, Element** elements);
900 void UnsafeArenaExtractSubrange(
int start,
int num, Element** elements);
912 int ClearedCount()
const;
919 void AddCleared(Element* value);
927 Element* ReleaseCleared();
935 iterator
erase(const_iterator position);
942 iterator
erase(const_iterator first, const_iterator last);
946 return GetArenaNoVirtual();
957 inline Arena* GetArenaNoVirtual()
const;
964 void ExtractSubrangeInternal(
int start,
int num, Element** elements,
966 void ExtractSubrangeInternal(
int start,
int num, Element** elements,
970 typedef void InternalArenaConstructable_;
976 template <
typename Element>
983 template <
typename Element>
991 rep_ =
reinterpret_cast<Rep*
>(
992 ::google::protobuf::Arena::CreateArray<char>(arena, kRepHeaderSize));
997 template <
typename Element>
1005 template <
typename Element>
1006 template <
typename Iter>
1012 if (reserve != -1) {
1014 for (; begin !=
end; ++begin) {
1015 AddAlreadyReserved(*begin);
1018 for (; begin !=
end; ++begin) {
1024 template <
typename Element>
1028 InternalDeallocate(rep_, total_size_);
1031 template <
typename Element>
1039 template <
typename Element>
1041 return current_size_ == 0;
1044 template <
typename Element>
1046 return current_size_;
1049 template <
typename Element>
1054 template<
typename Element>
1057 rep_->elements[current_size_++] =
value;
1060 template<
typename Element>
1063 return &rep_->elements[current_size_++];
1066 template<
typename Element>
1069 if (new_size > current_size_) {
1071 std::fill(&rep_->elements[current_size_],
1072 &rep_->elements[new_size], value);
1074 current_size_ = new_size;
1077 template <
typename Element>
1081 return rep_->elements[
index];
1084 template <
typename Element>
1088 return &rep_->elements[
index];
1091 template <
typename Element>
1098 template <
typename Element>
1100 if (current_size_ == total_size_) Reserve(total_size_ + 1);
1101 rep_->elements[current_size_++] =
value;
1104 template <
typename Element>
1106 if (current_size_ == total_size_) Reserve(total_size_ + 1);
1107 return &rep_->elements[current_size_++];
1110 template <
typename Element>
1116 template <
typename Element>
1118 int start,
int num, Element* elements) {
1124 if (elements !=
NULL) {
1125 for (
int i = 0;
i < num; ++
i)
1126 elements[
i] = this->
Get(
i + start);
1131 for (
int i = start + num;
i < this->current_size_; ++
i)
1132 this->Set(
i - num, this->
Get(
i));
1133 this->Truncate(this->current_size_ - num);
1137 template <
typename Element>
1142 template <
typename Element>
1145 if (other.current_size_ != 0) {
1146 Reserve(current_size_ + other.current_size_);
1147 CopyArray(rep_->elements + current_size_,
1148 other.rep_->elements, other.current_size_);
1149 current_size_ += other.current_size_;
1153 template <
typename Element>
1155 if (&other ==
this)
return;
1160 template <
typename Element>
1162 const_iterator position) {
1163 return erase(position, position + 1);
1166 template <
typename Element>
1168 const_iterator first, const_iterator last) {
1169 size_type first_offset = first - cbegin();
1170 if (first != last) {
1171 Truncate(
std::copy(last, cend(), begin() + first_offset) - cbegin());
1173 return begin() + first_offset;
1176 template <
typename Element>
1178 return rep_ ? rep_->elements :
NULL;
1181 template <
typename Element>
1183 return rep_ ? rep_->elements :
NULL;
1187 template <
typename Element>
1190 std::swap(current_size_, other->current_size_);
1191 std::swap(total_size_, other->total_size_);
1194 template <
typename Element>
1196 if (
this == other)
return;
1197 if (GetArenaNoVirtual() == other->GetArenaNoVirtual()) {
1198 InternalSwap(other);
1201 temp.MergeFrom(*
this);
1207 template <
typename Element>
1209 if (
this == other)
return;
1210 GOOGLE_DCHECK(GetArenaNoVirtual() == other->GetArenaNoVirtual());
1211 InternalSwap(other);
1214 template <
typename Element>
1217 swap(rep_->elements[index1], rep_->elements[index2]);
1220 template <
typename Element>
1223 return rep_ ? rep_->elements :
NULL;
1225 template <
typename Element>
1228 return rep_ ? rep_->elements :
NULL;
1230 template <
typename Element>
1233 return rep_ ? rep_->elements :
NULL;
1235 template <
typename Element>
1238 return rep_ ? rep_->elements + current_size_ :
NULL;
1240 template <
typename Element>
1243 return rep_ ? rep_->elements + current_size_ :
NULL;
1245 template <
typename Element>
1248 return rep_ ? rep_->elements + current_size_ :
NULL;
1251 template <
typename Element>
1254 (total_size_ *
sizeof(Element) + kRepHeaderSize) : 0;
1259 template <
typename Element>
1261 if (total_size_ >= new_size)
return;
1262 Rep* old_rep = rep_;
1263 Arena* arena = GetArenaNoVirtual();
1264 new_size =
std::max(google::protobuf::internal::kMinRepeatedFieldAllocationSize,
1265 std::max(total_size_ * 2, new_size));
1269 <<
"Requested size is too large to fit into size_t.";
1270 if (arena ==
NULL) {
1271 rep_ =
reinterpret_cast<Rep*
>(
1272 new char[kRepHeaderSize +
sizeof(Element) * new_size]);
1274 rep_ =
reinterpret_cast<Rep*
>(
1275 ::google::protobuf::Arena::CreateArray<char>(arena,
1276 kRepHeaderSize +
sizeof(Element) * new_size));
1278 rep_->arena = arena;
1279 int old_total_size = total_size_;
1280 total_size_ = new_size;
1290 Element* e = &rep_->elements[0];
1291 Element* limit = &rep_->elements[total_size_];
1292 for (; e < limit; e++) {
1295 if (current_size_ > 0) {
1296 MoveArray(rep_->elements, old_rep->elements, current_size_);
1300 InternalDeallocate(old_rep, old_total_size);
1304 template <
typename Element>
1307 if (current_size_ > 0) {
1308 current_size_ = new_size;
1312 template <
typename Element>
1314 Element* to, Element* from,
int array_size) {
1315 CopyArray(to, from, array_size);
1318 template <
typename Element>
1320 Element* to,
const Element* from,
int array_size) {
1326 template <
typename Element,
bool HasTrivialCopy>
1328 Element* to,
const Element* from,
int array_size) {
1332 template <
typename Element>
1334 void operator()(Element* to,
const Element* from,
int array_size) {
1335 memcpy(to, from, array_size *
sizeof(Element));
1346 inline RepeatedPtrFieldBase::RepeatedPtrFieldBase()
1360 template <
typename TypeHandler>
1363 for (
int i = 0;
i < rep_->allocated_size;
i++) {
1364 TypeHandler::Delete(cast<TypeHandler>(rep_->elements[
i]), arena_);
1366 if (arena_ ==
NULL) {
1367 delete []
reinterpret_cast<char*
>(rep_);
1373 template <
typename TypeHandler>
1378 SwapFallback<TypeHandler>(other);
1382 template <
typename TypeHandler>
1390 temp.MergeFrom<TypeHandler>(*this);
1391 this->Clear<TypeHandler>();
1392 this->MergeFrom<TypeHandler>(*other);
1393 other->Clear<TypeHandler>();
1394 other->InternalSwap(&
temp);
1395 temp.Destroy<TypeHandler>();
1399 return current_size_ == 0;
1403 return current_size_;
1406 template <
typename TypeHandler>
1411 return *cast<TypeHandler>(rep_->elements[
index]);
1415 template <
typename TypeHandler>
1420 return cast<TypeHandler>(rep_->elements[
index]);
1423 template <
typename TypeHandler>
1427 TypeHandler::Delete(cast<TypeHandler>(rep_->elements[index]), arena_);
1430 template <
typename TypeHandler>
1433 if (rep_ !=
NULL && current_size_ < rep_->allocated_size) {
1434 return cast<TypeHandler>(rep_->elements[current_size_++]);
1436 if (!rep_ || rep_->allocated_size == total_size_) {
1439 ++rep_->allocated_size;
1441 TypeHandler::NewFromPrototype(prototype, arena_);
1442 rep_->elements[current_size_++] =
result;
1446 template <
typename TypeHandler>
1452 template <
typename TypeHandler>
1454 const int n = current_size_;
1457 void*
const* elements = rep_->elements;
1472 template <
typename TypeHandler>
1475 if (other.current_size_ == 0)
return;
1477 other, &RepeatedPtrFieldBase::MergeFromInnerLoop<TypeHandler>);
1480 inline void RepeatedPtrFieldBase::MergeFromInternal(
1484 int other_size = other.current_size_;
1485 void** other_elements = other.rep_->elements;
1486 void** new_elements = InternalExtend(other_size);
1487 int allocated_elems = rep_->allocated_size - current_size_;
1488 (this->*inner_loop)(new_elements, other_elements,
1489 other_size, allocated_elems);
1490 current_size_ += other_size;
1491 if (rep_->allocated_size < current_size_) {
1492 rep_->allocated_size = current_size_;
1497 template<
typename TypeHandler>
1498 void RepeatedPtrFieldBase::MergeFromInnerLoop(
1499 void** our_elems,
void** other_elems,
int length,
int already_allocated) {
1502 for (
int i = 0;
i < already_allocated &&
i <
length;
i++) {
1511 for (
int i = already_allocated;
i <
length;
i++) {
1516 TypeHandler::NewFromPrototype(other_elem, arena);
1518 our_elems[
i] = new_elem;
1522 template <
typename TypeHandler>
1524 if (&other ==
this)
return;
1525 RepeatedPtrFieldBase::Clear<TypeHandler>();
1526 RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other);
1534 return rep_ ? rep_->elements :
NULL;
1538 return rep_ ?
const_cast<void**
>(rep_->elements) :
NULL;
1541 template <
typename TypeHandler>
1548 template <
typename TypeHandler>
1558 swap(rep_->elements[index1], rep_->elements[index2]);
1561 template <
typename TypeHandler>
1563 int allocated_bytes = total_size_ *
sizeof(
void*);
1565 for (
int i = 0;
i < rep_->allocated_size; ++
i) {
1566 allocated_bytes += TypeHandler::SpaceUsed(
1567 *cast<TypeHandler>(rep_->elements[
i]));
1569 allocated_bytes += kRepHeaderSize;
1571 return allocated_bytes;
1574 template <
typename TypeHandler>
1576 if (rep_ !=
NULL && current_size_ < rep_->allocated_size) {
1577 return cast<TypeHandler>(rep_->elements[current_size_++]);
1584 template <
typename TypeHandler>
1588 Arena* element_arena =
reinterpret_cast<Arena*
>(
1589 TypeHandler::GetMaybeArenaPointer(value));
1591 if (arena == element_arena && rep_ &&
1592 rep_->allocated_size < total_size_) {
1596 void** elems = rep_->elements;
1597 if (current_size_ < rep_->allocated_size) {
1600 elems[rep_->allocated_size] = elems[current_size_];
1602 elems[current_size_] =
value;
1603 current_size_ = current_size_ + 1;
1604 rep_->allocated_size = rep_->allocated_size + 1;
1607 AddAllocatedSlowWithCopy<TypeHandler>(
1608 value, TypeHandler::GetArena(value), arena);
1613 template<
typename TypeHandler>
1621 if (my_arena !=
NULL && value_arena ==
NULL) {
1622 my_arena->
Own(value);
1623 }
else if (my_arena != value_arena) {
1625 TypeHandler::NewFromPrototype(value, my_arena);
1627 TypeHandler::Delete(value, value_arena);
1631 UnsafeArenaAddAllocated<TypeHandler>(
value);
1635 template <
typename TypeHandler>
1639 if (rep_ && rep_->allocated_size < total_size_) {
1643 void** elems = rep_->elements;
1644 if (current_size_ < rep_->allocated_size) {
1647 elems[rep_->allocated_size] = elems[current_size_];
1649 elems[current_size_] =
value;
1650 current_size_ = current_size_ + 1;
1651 ++rep_->allocated_size;
1654 UnsafeArenaAddAllocated<TypeHandler>(
value);
1658 template <
typename TypeHandler>
1662 if (!rep_ || current_size_ == total_size_) {
1665 ++rep_->allocated_size;
1666 }
else if (rep_->allocated_size == total_size_) {
1671 TypeHandler::Delete(
1672 cast<TypeHandler>(rep_->elements[current_size_]), arena_);
1673 }
else if (current_size_ < rep_->allocated_size) {
1676 rep_->elements[rep_->allocated_size] = rep_->elements[current_size_];
1677 ++rep_->allocated_size;
1680 ++rep_->allocated_size;
1683 rep_->elements[current_size_++] =
value;
1687 template <
typename TypeHandler>
1694 if (arena ==
NULL) {
1698 TypeHandler::NewFromPrototype(result,
NULL);
1708 template <
typename TypeHandler>
1712 <<
"ReleaseLast() called on a RepeatedPtrField that is on an arena, " 1713 <<
"with a type that does not implement MergeFrom. This is unsafe; " 1714 <<
"please implement MergeFrom for your type.";
1715 return UnsafeArenaReleaseLast<TypeHandler>();
1718 template <
typename TypeHandler>
1723 cast<TypeHandler>(rep_->elements[--current_size_]);
1724 --rep_->allocated_size;
1725 if (current_size_ < rep_->allocated_size) {
1728 rep_->elements[current_size_] = rep_->elements[rep_->allocated_size];
1734 return rep_ ? (rep_->allocated_size - current_size_) : 0;
1737 template <
typename TypeHandler>
1741 <<
"AddCleared() can only be used on a RepeatedPtrField not on an arena.";
1743 <<
"AddCleared() can only accept values not on an arena.";
1744 if (!rep_ || rep_->allocated_size == total_size_) {
1747 rep_->elements[rep_->allocated_size++] =
value;
1750 template <
typename TypeHandler>
1753 <<
"ReleaseCleared() can only be used on a RepeatedPtrField not on " 1758 return cast<TypeHandler>(rep_->elements[--rep_->allocated_size]);
1765 template <
typename Element>
1776 template <
typename Element>
1780 template <
typename Element>
1782 RepeatedPtrFieldBase(arena) {}
1784 template <
typename Element>
1787 : RepeatedPtrFieldBase() {
1791 template <
typename Element>
1792 template <
typename Iter>
1796 if (reserve != -1) {
1799 for (; begin !=
end; ++begin) {
1804 template <
typename Element>
1806 Destroy<TypeHandler>();
1809 template <
typename Element>
1817 template <
typename Element>
1819 return RepeatedPtrFieldBase::empty();
1822 template <
typename Element>
1827 template <
typename Element>
1829 return RepeatedPtrFieldBase::Get<TypeHandler>(
index);
1833 template <
typename Element>
1835 return RepeatedPtrFieldBase::Mutable<TypeHandler>(
index);
1838 template <
typename Element>
1840 return RepeatedPtrFieldBase::Add<TypeHandler>();
1843 template <
typename Element>
1845 RepeatedPtrFieldBase::RemoveLast<TypeHandler>();
1848 template <
typename Element>
1853 for (
int i = 0;
i < num; ++
i) {
1854 RepeatedPtrFieldBase::Delete<TypeHandler>(start +
i);
1856 ExtractSubrange(start, num,
NULL);
1859 template <
typename Element>
1861 int start,
int num, Element** elements) {
1864 ExtractSubrangeInternal(start, num, elements, t);
1869 template <
typename Element>
1878 if (elements !=
NULL) {
1879 if (GetArenaNoVirtual() !=
NULL) {
1882 for (
int i = 0;
i < num; ++
i) {
1883 Element*
element = RepeatedPtrFieldBase::
1884 Mutable<TypeHandler>(
i +
start);
1886 TypeHandler::NewFromPrototype(element,
NULL);
1888 elements[
i] = new_value;
1891 for (
int i = 0;
i < num; ++
i) {
1892 elements[
i] = RepeatedPtrFieldBase::Mutable<TypeHandler>(
i +
start);
1896 CloseGap(start, num);
1902 template<
typename Element>
1910 <<
"ExtractSubrange() when arena is non-NULL is only supported when " 1911 <<
"the Element type supplies a MergeFrom() operation to make copies.";
1912 UnsafeArenaExtractSubrange(start, num, elements);
1915 template <
typename Element>
1917 int start,
int num, Element** elements) {
1924 if (elements !=
NULL) {
1925 for (
int i = 0;
i < num; ++
i) {
1926 elements[
i] = RepeatedPtrFieldBase::Mutable<TypeHandler>(
i +
start);
1929 CloseGap(start, num);
1933 template <
typename Element>
1935 RepeatedPtrFieldBase::Clear<TypeHandler>();
1938 template <
typename Element>
1941 RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other);
1944 template <
typename Element>
1947 RepeatedPtrFieldBase::CopyFrom<TypeHandler>(other);
1950 template <
typename Element>
1953 return erase(position, position + 1);
1956 template <
typename Element>
1961 DeleteSubrange(pos_offset, last_offset - pos_offset);
1962 return begin() + pos_offset;
1965 template <
typename Element>
1967 return RepeatedPtrFieldBase::mutable_data<TypeHandler>();
1970 template <
typename Element>
1972 return RepeatedPtrFieldBase::data<TypeHandler>();
1975 template <
typename Element>
1979 RepeatedPtrFieldBase::Swap<TypeHandler>(other);
1982 template <
typename Element>
1988 RepeatedPtrFieldBase::InternalSwap(other);
1991 template <
typename Element>
1993 RepeatedPtrFieldBase::SwapElements(index1, index2);
1996 template <
typename Element>
1998 return RepeatedPtrFieldBase::GetArenaNoVirtual();
2001 template <
typename Element>
2003 return RepeatedPtrFieldBase::SpaceUsedExcludingSelf<TypeHandler>();
2006 template <
typename Element>
2008 RepeatedPtrFieldBase::AddAllocated<TypeHandler>(
value);
2011 template <
typename Element>
2013 RepeatedPtrFieldBase::UnsafeArenaAddAllocated<TypeHandler>(
value);
2016 template <
typename Element>
2018 return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>();
2021 template <
typename Element>
2023 return RepeatedPtrFieldBase::UnsafeArenaReleaseLast<TypeHandler>();
2026 template <
typename Element>
2028 return RepeatedPtrFieldBase::ClearedCount();
2031 template <
typename Element>
2033 return RepeatedPtrFieldBase::AddCleared<TypeHandler>(
value);
2036 template <
typename Element>
2038 return RepeatedPtrFieldBase::ReleaseCleared<TypeHandler>();
2041 template <
typename Element>
2043 return RepeatedPtrFieldBase::Reserve(new_size);
2046 template <
typename Element>
2048 return RepeatedPtrFieldBase::Capacity();
2066 template<
typename Element>
2067 class RepeatedPtrIterator
2068 :
public std::iterator<
2069 std::random_access_iterator_tag, Element> {
2072 typedef std::iterator<
2090 template<
typename OtherElement>
2100 reference
operator*()
const {
return *
reinterpret_cast<Element*
>(*it_); }
2124 friend iterator
operator+(iterator it,
const difference_type
d) {
2128 friend iterator
operator+(
const difference_type
d, iterator it) {
2145 difference_type
operator-(
const iterator&
x)
const {
return it_ - x.it_; }
2148 template<
typename OtherElement>
2162 template<
typename Element,
typename Vo
idPtr>
2164 :
public std::iterator<std::random_access_iterator_tag, Element*> {
2167 typedef std::iterator<
2184 reference
operator*()
const {
return *
reinterpret_cast<Element**
>(it_); }
2229 difference_type
operator-(
const iterator&
x)
const {
return it_ - x.it_; }
2232 template<
typename OtherElement>
2241 std::swap(current_size_, other->current_size_);
2242 std::swap(total_size_, other->total_size_);
2247 template <
typename Element>
2250 return iterator(raw_data());
2252 template <
typename Element>
2255 return iterator(raw_data());
2257 template <
typename Element>
2262 template <
typename Element>
2265 return iterator(raw_data() +
size());
2267 template <
typename Element>
2270 return iterator(raw_data() +
size());
2272 template <
typename Element>
2278 template <
typename Element>
2281 return pointer_iterator(raw_mutable_data());
2283 template <
typename Element>
2286 return const_pointer_iterator(const_cast<const void**>(raw_mutable_data()));
2288 template <
typename Element>
2291 return pointer_iterator(raw_mutable_data() +
size());
2293 template <
typename Element>
2296 return const_pointer_iterator(
2297 const_cast<const void**>(raw_mutable_data() +
size()));
2313 :
public std::iterator<std::output_iterator_tag, T> {
2317 : field_(mutable_field) {
2339 :
public std::iterator<std::output_iterator_tag, T> {
2343 : field_(mutable_field) {
2346 *field_->Add() =
value;
2350 const T*
const ptr_to_value) {
2351 *field_->Add() = *ptr_to_value;
2371 :
public std::iterator<std::output_iterator_tag, T> {
2375 : field_(mutable_field) {
2378 T*
const ptr_to_value) {
2379 field_->AddAllocated(ptr_to_value);
2399 template<
typename T>
2401 :
public std::iterator<std::output_iterator_tag, T> {
2405 : field_(mutable_field) {
2408 T const*
const ptr_to_value) {
2409 field_->UnsafeArenaAddAllocated(const_cast<T*>(ptr_to_value));
2455 AllocatedRepeatedPtrFieldBackInserter(
2472 template<
typename T>
2474 UnsafeArenaAllocatedRepeatedPtrFieldBackInserter(
2483 #endif // GOOGLE_PROTOBUF_REPEATED_FIELD_H__ void SwapElements(int index1, int index2)
Definition: repeated_field.h:1556
void AddCleared(typename TypeHandler::Type *value)
Definition: repeated_field.h:1738
const value_type * const_pointer
Definition: repeated_field.h:180
bool operator>=(const iterator &x) const
Definition: repeated_field.h:2117
void UnsafeArenaAddAllocated(typename TypeHandler::Type *value)
Definition: repeated_field.h:1659
RepeatedPtrFieldBackInsertIterator< T > & operator*()
Definition: repeated_field.h:2354
std::reverse_iterator< iterator > reverse_iterator
Definition: repeated_field.h:193
static void * GetMaybeArenaPointer(string *)
Definition: repeated_field.h:700
bool operator!=(const iterator &x) const
Definition: repeated_field.h:2195
#define size
Definition: float-mm.c:27
Definition: message.h:179
EGLStreamKHR EGLint EGLint EGLint size
Definition: eglext.h:984
GLint first
Definition: gl2.h:421
def copy(src_path, out_dir, rel_path)
Definition: blink-import.py:86
int StringSpaceUsedExcludingSelf(const string &str)
Definition: generated_message_util.cc:69
AllocatedRepeatedPtrFieldBackInsertIterator(RepeatedPtrField< T > *const mutable_field)
Definition: repeated_field.h:2373
Definition: map_field.h:60
RepeatedPtrIterator()
Definition: repeated_field.h:2085
RepeatedPtrOverPtrsIterator< Element, VoidPtr > iterator
Definition: repeated_field.h:2166
RepeatedPtrIterator< Element > iterator
Definition: repeated_field.h:2071
Definition: repeated_field.h:2312
int SpaceUsedExcludingSelf() const
Definition: repeated_field.h:1562
static int SpaceUsed(const GenericType &value)
Definition: repeated_field.h:583
GLuint GLuint end
Definition: gl2ext.h:323
difference_type operator-(const iterator &x) const
Definition: repeated_field.h:2229
Definition: repeated_field.h:298
AllocatedRepeatedPtrFieldBackInsertIterator< T > & operator=(T *const ptr_to_value)
Definition: repeated_field.h:2377
string Type
Definition: repeated_field.h:688
typename detail::erase_dispatch< L, K, detail::has_erase_method< L >::value >::type erase
Definition: Brigand.h:2304
static inline ::google::protobuf::Arena * GetArena(GenericType *value)
Definition: repeated_field.h:573
UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator< T > & operator*()
Definition: repeated_field.h:2412
value_type & reference
Definition: repeated_field.h:177
const Element * const_iterator
Definition: repeated_field.h:175
void Clear()
Definition: repeated_field.h:1453
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)
Definition: macros.h:40
pointer operator->() const
Definition: repeated_field.h:2185
const_reverse_iterator rend() const
Definition: repeated_field.h:203
Element * iterator
Definition: repeated_field.h:174
Definition: repeated_field.h:324
int size() const
Definition: repeated_field.h:1402
remove_const< Element * >::type value_type
Definition: repeated_field.h:2172
static int SpaceUsed(const string &value)
Definition: repeated_field.h:717
GOOGLE_ATTRIBUTE_ALWAYS_INLINE void Swap(RepeatedPtrFieldBase *other)
reference operator[](difference_type d) const
Definition: repeated_field.h:2142
::google::protobuf::Arena * GetArena() const
Definition: repeated_field.h:227
AllocatedRepeatedPtrFieldBackInsertIterator< T > & operator++(int)
Definition: repeated_field.h:2388
GenericType Type
Definition: repeated_field.h:562
UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator< T > & operator++(int)
Definition: repeated_field.h:2418
TimeDelta operator*(T a, TimeDelta td)
Definition: timedelta.h:123
AllocatedRepeatedPtrFieldBackInsertIterator< T > & operator++()
Definition: repeated_field.h:2385
#define GOOGLE_DCHECK_GE
Definition: logging.h:199
bool t
Definition: UpdateContents.py:37
#define DECLARE_SPECIALIZATIONS_FOR_BASE_PROTO_TYPES(TypeName)
Definition: repeated_field.h:639
Definition: extension_set.h:160
char HasMerge
Definition: repeated_field.h:325
value_type * pointer
Definition: repeated_field.h:179
static void * GetMaybeArenaPointer(GenericType *value)
Definition: repeated_field.h:576
GOOGLE_ATTRIBUTE_NOINLINE void AddAllocatedSlowWithCopy(typename TypeHandler::Type *value, Arena *value_arena, Arena *my_arena)
reverse_iterator rend()
Definition: repeated_field.h:200
#define GOOGLE_ATTRIBUTE_NOINLINE
Definition: port.h:189
RepeatedPtrIterator(void *const *it)
Definition: repeated_field.h:2086
friend iterator operator+(iterator it, difference_type d)
Definition: repeated_field.h:2208
RepeatedPtrFieldBackInsertIterator< T > & operator++()
Definition: repeated_field.h:2357
RepeatedFieldBackInsertIterator< T > & operator++()
Definition: repeated_field.h:2326
RepeatedFieldBackInsertIterator< T > & operator++(int)
Definition: repeated_field.h:2329
bool operator>=(const iterator &x) const
Definition: repeated_field.h:2201
#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE
Definition: port.h:175
Message
Definition: peerconnection_unittest.cc:105
Definition: command_line_interface.h:56
friend iterator operator-(iterator it, difference_type d)
Definition: repeated_field.h:2220
friend iterator operator+(iterator it, const difference_type d)
Definition: repeated_field.h:2124
superclass::pointer pointer
Definition: repeated_field.h:2082
#define GOOGLE_DCHECK_LE
Definition: logging.h:197
void Reserve(int new_size)
Definition: repeated_field.cc:83
#define GOOGLE_DCHECK_LT
Definition: logging.h:196
virtual ::google::protobuf::Arena * GetArena() const
Definition: message_lite.h:101
Definition: repeated_field.h:2370
difference_type operator-(const iterator &x) const
Definition: repeated_field.h:2145
#define GOOGLE_DCHECK_GT
Definition: logging.h:198
void RemoveLast()
Definition: repeated_field.h:1447
remove_const< Element >::type value_type
Definition: repeated_field.h:2077
iterator & operator+=(difference_type d)
Definition: repeated_field.h:2204
const TypeHandler::Type *const * data() const
Definition: repeated_field.h:1550
superclass::reference reference
Definition: repeated_field.h:2081
void AddAllocated(typename TypeHandler::Type *value)
Definition: repeated_field.h:452
T type
Definition: type_traits.h:300
void InternalSwap(RepeatedPtrFieldBase *other)
Definition: repeated_field.h:2239
bool operator==(const iterator &x) const
Definition: repeated_field.h:2194
virtual void * GetMaybeArenaPointer() const
Definition: message_lite.h:111
void MergeFrom(const RepeatedPtrFieldBase &other)
Definition: repeated_field.h:1473
Definition: repeated_field.h:299
static const Type & default_instance()
Definition: repeated_field.h:710
Definition: float-mm.c:54
static inline ::google::protobuf::Arena * GetArena(string *)
Definition: repeated_field.h:697
superclass::difference_type difference_type
Definition: repeated_field.h:2178
WEBCORE_EXPORT Node * last(const ContainerNode &)
Definition: NodeTraversal.cpp:106
bool operator<(const iterator &x) const
Definition: repeated_field.h:2198
GLuint start
Definition: gl2ext.h:323
~RepeatedPtrFieldBase()
Definition: repeated_field.h:394
void Delete(int index)
Definition: repeated_field.h:1424
Clear
Definition: python_message.py:1326
Element value_type
Definition: repeated_field.h:176
EGLStreamKHR EGLint n
Definition: eglext.h:984
const FieldDescriptor const OneofDescriptor value
Definition: descriptor.h:1717
Definition: generated_message_reflection.h:100
iterator & operator++()
Definition: repeated_field.h:2188
bool operator>(const iterator &x) const
Definition: repeated_field.h:2200
Definition: template_util.h:77
iterator operator++(int)
Definition: repeated_field.h:2189
iterator operator++(int)
Definition: repeated_field.h:2105
superclass::difference_type difference_type
Definition: repeated_field.h:2083
static void Merge(const string &from, string *to)
Definition: repeated_field.h:709
TypeHandler::Type * Add(typename TypeHandler::Type *prototype=NULL)
Definition: repeated_field.h:1431
TestSubObjConstructor T
Definition: TestTypedefs.idl:84
def Merge(text, message, allow_unknown_extension=False, allow_field_number=False)
Definition: text_format.py:349
RepeatedPtrOverPtrsIterator()
Definition: repeated_field.h:2180
EGLSurface EGLint x
Definition: eglext.h:950
int size_type
Definition: repeated_field.h:181
bool operator!=(const iterator &x) const
Definition: repeated_field.h:2111
friend iterator operator+(const difference_type d, iterator it)
Definition: repeated_field.h:2128
Definition: type_traits.h:100
void swap(shared_ptr< T > &r, shared_ptr< T > &s)
Definition: shared_ptr.h:278
GLuint index
Definition: gl2.h:383
EGLAttrib * value
Definition: eglext.h:120
reference operator*() const
Definition: repeated_field.h:2184
int ClearedCount() const
Definition: repeated_field.h:1733
RepeatedFieldBackInsertIterator(RepeatedField< T > *const mutable_field)
Definition: repeated_field.h:2315
RepeatedFieldBackInsertIterator< T > & operator=(const T &value)
Definition: repeated_field.h:2319
bool operator>(const iterator &x) const
Definition: repeated_field.h:2116
google::protobuf::internal::true_type type
Definition: repeated_field.h:350
Definition: message.h:158
Definition: repeated_field.h:686
def Iter(n, format, sep='')
Definition: gen_gtest_pred_impl.py:189
iterator & operator+=(difference_type d)
Definition: repeated_field.h:2120
iterator & operator++()
Definition: repeated_field.h:2104
bool empty() const
Definition: repeated_field.h:1398
TypeHandler::Type ** mutable_data()
Definition: repeated_field.h:1542
std::iterator< std::random_access_iterator_tag, Element > superclass
Definition: repeated_field.h:2073
const ::std::string & GetEmptyString()
Definition: generated_message_util.cc:63
void ** raw_mutable_data() const
Definition: repeated_field.h:1537
Definition: message_lite.h:78
bool operator<=(const iterator &x) const
Definition: repeated_field.h:2199
static void Clear(GenericType *value)
Definition: repeated_field.h:580
Arena * GetArenaNoVirtual() const
Definition: repeated_field.h:1997
static void Delete(string *value, Arena *arena)
Definition: repeated_field.h:703
Definition: __init__.py:1
google::protobuf::internal::integral_constant< bool,(sizeof(Check< T >0))==sizeof(HasMerge))> type
Definition: repeated_field.h:345
bool operator<=(const iterator &x) const
Definition: repeated_field.h:2115
iterator & operator-=(difference_type d)
Definition: repeated_field.h:2216
RepeatedPtrFieldBackInsertIterator< T > & operator++(int)
Definition: repeated_field.h:2360
TypeHandler::Type * AddFromCleared()
Definition: repeated_field.h:1575
void AddAllocatedInternal(typename TypeHandler::Type *value, google::protobuf::internal::true_type)
Definition: repeated_field.h:1585
pointer operator->() const
Definition: repeated_field.h:2101
#define true
Definition: float-mm.c:6
GLenum void ** pointer
Definition: gl2.h:460
GLint reference
Definition: gl2ext.h:922
iterator & operator--()
Definition: repeated_field.h:2190
RepeatedPtrField()
Definition: repeated_field.h:1777
#define GOOGLE_CHECK_NE(A, B)
Definition: logging.h:155
EGLenum type
Definition: eglext.h:63
const_reverse_iterator rbegin() const
Definition: repeated_field.h:197
int CalculateReserve(Iter begin, Iter end)
Definition: repeated_field.h:95
EGLStreamKHR EGLint EGLint EGLint const void * data
Definition: eglext.h:984
static string * NewFromPrototype(const string *, ::google::protobuf::Arena *arena)
Definition: repeated_field.h:693
GOOGLE_ATTRIBUTE_NOINLINE void Own(T *object)
Definition: arena.h:469
std::iterator< std::random_access_iterator_tag, Element * > superclass
Definition: repeated_field.h:2168
GLsizei const GLchar *const * string
Definition: gl2.h:479
Definition: document.h:393
result
Definition: target-blank-opener-post-window.php:5
#define GOOGLE_CHECK_LE(A, B)
Definition: logging.h:157
double max
Definition: DeviceProximityEvent.idl:32
iterator operator--(int)
Definition: repeated_field.h:2191
#define GOOGLE_DCHECK
Definition: logging.h:192
const value_type & const_reference
Definition: repeated_field.h:178
const TypeHandler::Type & Get(int index) const
Definition: repeated_field.h:1408
Definition: repeated_field.h:336
Definition: repeated_field.h:369
std::integral_constant< std::ptrdiff_t, V > ptrdiff_t
Definition: Brigand.h:449
TypeHandler::Type * ReleaseCleared()
Definition: repeated_field.h:1751
for i
Definition: complexityMeasures.m:24
static const Type & default_instance()
Definition: repeated_field.h:586
void *const * raw_data() const
Definition: repeated_field.h:1533
long HasNoMerge
Definition: repeated_field.h:326
static void Clear(string *value)
Definition: repeated_field.h:708
void CopyFrom(const RepeatedPtrFieldBase &other)
Definition: repeated_field.h:1523
RepeatedPtrFieldBackInsertIterator< T > & operator=(const T *const ptr_to_value)
Definition: repeated_field.h:2349
bool operator==(const iterator &x) const
Definition: repeated_field.h:2110
GOOGLE_ATTRIBUTE_NOINLINE void SwapFallback(RepeatedPtrFieldBase *other)
RepeatedPtrOverPtrsIterator(VoidPtr *it)
Definition: repeated_field.h:2181
TypeHandler::Type * Mutable(int index)
Definition: repeated_field.h:1417
iterator operator--(int)
Definition: repeated_field.h:2107
static string * New(Arena *arena)
Definition: repeated_field.h:690
RepeatedPtrFieldBackInsertIterator(RepeatedPtrField< T > *const mutable_field)
Definition: repeated_field.h:2341
GLsizei GLsizei GLfloat distance
Definition: gl2ext.h:2866
friend iterator operator+(difference_type d, iterator it)
Definition: repeated_field.h:2212
const
Definition: upload.py:398
#define NULL
Definition: common_types.h:41
void operator()(Element *to, const Element *from, int array_size)
Definition: repeated_field.h:1334
DOMString e
Definition: WebCryptoAPI.idl:115
UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator< T > & operator++()
Definition: repeated_field.h:2415
superclass::reference reference
Definition: repeated_field.h:2176
#define LIBPROTOBUF_EXPORT
Definition: port.h:97
Definition: repeated_field.h:310
Definition: gflags_completions.h:115
reverse_iterator rbegin()
Definition: repeated_field.h:194
Arena * GetArenaNoVirtual() const
Definition: repeated_field.h:502
int Capacity() const
Definition: repeated_field.h:1529
#define GOOGLE_DCHECK_NE
Definition: logging.h:195
Definition: repeated_field.h:2338
Definition: repeated_field.h:2400
Definition: repeated_field.h:715
RepeatedPtrIterator(const RepeatedPtrIterator< OtherElement > &other)
Definition: repeated_field.h:2091
void swap(JSRetainPtr< T > &a, JSRetainPtr< T > &b)
Definition: JSRetainPtr.h:179
friend iterator operator-(iterator it, difference_type d)
Definition: repeated_field.h:2136
void Destroy()
Definition: repeated_field.h:1361
ptrdiff_t difference_type
Definition: repeated_field.h:182
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: repeated_field.h:192
Type
Type of JSON value.
Definition: rapidjson.h:616
void UnsafeArenaSwap(RepeatedField *other)
Definition: repeated_field.h:1208
iterator & operator-=(difference_type d)
Definition: repeated_field.h:2132
Definition: repeated_field.h:1766
RepeatedPtrFieldBase()
Definition: repeated_field.h:1346
temp
Definition: parse_delay_file.m:64
void swap(optional< T > &x, optional< T > &y) __NOEXCEPT_(__NOEXCEPT_(x.swap(y)))
Definition: Optional.h:1047
AllocatedRepeatedPtrFieldBackInsertIterator< T > & operator*()
Definition: repeated_field.h:2382
TypeHandler::Type * UnsafeArenaReleaseLast()
Definition: repeated_field.h:1720
UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator(::google::protobuf::RepeatedPtrField< T > *const mutable_field)
Definition: repeated_field.h:2403
#define d
Definition: float-mm.c:30
bool operator<(const iterator &x) const
Definition: repeated_field.h:2114
Definition: GetPutInfo.h:232
int size
Definition: protobuf.h:351
To implicit_cast(From const &f)
Definition: casts.h:58
reference operator*() const
Definition: repeated_field.h:2100
GLuint GLsizei GLsizei * length
Definition: gl2.h:435
MergeFrom
Definition: python_message.py:1259
iterator & operator--()
Definition: repeated_field.h:2106
reference operator[](difference_type d) const
Definition: repeated_field.h:2226
UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator< T > & operator=(T const *const ptr_to_value)
Definition: repeated_field.h:2407
TypeHandler::Type * ReleaseLast()
Definition: repeated_field.h:461
static GenericType * New(Arena *arena)
Definition: repeated_field.h:563
void LogIndexOutOfBounds(int index, int size)
RepeatedFieldBackInsertIterator< T > & operator*()
Definition: repeated_field.h:2323
TypeHandler::Type * ReleaseLastInternal(google::protobuf::internal::true_type)
Definition: repeated_field.h:1689
superclass::pointer pointer
Definition: repeated_field.h:2177
RepeatedPtrFieldBackInsertIterator< T > & operator=(const T &value)
Definition: repeated_field.h:2345
unsigned long Add(unsigned long a, unsigned long b)
Definition: mod_ops.h:22