48 #ifndef GOOGLE_PROTOBUF_REPEATED_PTR_FIELD_H__
49 #define GOOGLE_PROTOBUF_REPEATED_PTR_FIELD_H__
60 #include <type_traits>
62 #include <google/protobuf/stubs/logging.h>
63 #include <google/protobuf/stubs/common.h>
64 #include <google/protobuf/arena.h>
65 #include <google/protobuf/message_lite.h>
66 #include <google/protobuf/port.h>
70 #include <google/protobuf/port_def.inc>
73 #error "You cannot SWIG proto headers"
83 struct WeakRepeatedPtrField;
87 class MergePartialFromCodedStreamHelper;
88 class SwapFieldHelper;
94 template <
typename It>
95 class RepeatedPtrIterator;
96 template <
typename It,
typename Vo
idPtr>
97 class RepeatedPtrOverPtrsIterator;
107 template <
typename T>
108 struct TypeImplementsMergeBehaviorProbeForMergeFrom {
119 template <
typename U,
typename RetType, RetType (U::*)(const U& arg)>
121 template <
typename U>
123 template <
typename U>
125 template <
typename U>
129 typedef std::integral_constant<
bool,
130 (
sizeof(Check<T>(0)) ==
sizeof(
HasMerge))>
134 template <
typename T,
typename =
void>
140 struct TypeImplementsMergeBehavior<
std::
string> {
144 template <
typename T>
146 : std::integral_constant<bool, std::is_move_constructible<T>::value &&
147 std::is_move_assignable<T>::value> {};
167 class PROTOBUF_EXPORT RepeatedPtrFieldBase {
169 constexpr RepeatedPtrFieldBase();
180 template <
typename TypeHandler>
183 void DestroyProtos();
188 template <
typename TypeHandler>
190 template <
typename TypeHandler>
193 template <
typename TypeHandler>
195 template <
typename TypeHandler>
197 template <
typename TypeHandler>
206 template <
typename TypeHandler>
215 template <
typename TypeHandler>
218 template <
typename TypeHandler>
225 typename TypeHandler,
229 template <
typename TypeHandler>
231 template <
typename TypeHandler>
238 int Capacity()
const;
240 template <
typename TypeHandler>
243 auto* new_value = TypeHandler::NewFromPrototype(
value,
nullptr);
249 void*
const* raw_data()
const;
250 void** raw_mutable_data()
const;
252 template <
typename TypeHandler>
254 template <
typename TypeHandler>
257 template <
typename TypeHandler>
260 void SwapElements(
int index1,
int index2);
262 template <
typename TypeHandler>
263 size_t SpaceUsedExcludingSelfLong()
const;
268 template <
typename TypeHandler>
271 template <
typename TypeHandler>
274 AddAllocatedInternal<TypeHandler>(
value, t);
277 template <
typename TypeHandler>
280 template <
typename TypeHandler>
283 return ReleaseLastInternal<TypeHandler>(t);
288 template <
typename TypeHandler>
291 int ClearedCount()
const;
292 template <
typename TypeHandler>
294 template <
typename TypeHandler>
297 template <
typename TypeHandler>
299 template <
typename TypeHandler>
302 template <
typename TypeHandler>
303 PROTOBUF_NOINLINE
void AddAllocatedSlowWithCopy(
305 template <
typename TypeHandler>
306 PROTOBUF_NOINLINE
void AddAllocatedSlowWithoutCopy(
309 template <
typename TypeHandler>
311 template <
typename TypeHandler>
314 template <
typename TypeHandler>
342 static constexpr
size_t kRepHeaderSize = offsetof(
Rep, elements);
345 template <
typename TypeHandler>
349 template <
typename TypeHandler>
361 template <
typename TypeHandler>
362 PROTOBUF_NOINLINE
void MergeFromInnerLoop(
void** our_elems,
363 void** other_elems,
int length,
364 int already_allocated);
370 void** InternalExtend(
int extend_amount);
375 void* AddOutOfLineHelper(
void*
obj);
380 friend class ::PROTOBUF_NAMESPACE_ID::Reflection;
381 friend class ::PROTOBUF_NAMESPACE_ID::internal::SwapFieldHelper;
400 template <
typename T>
406 template <
typename GenericType>
413 return Arena::CreateMaybeMessage<Type>(
arena);
421 if (
arena ==
nullptr) {
426 return Arena::GetOwningArena<Type>(
value);
431 static void Merge(
const GenericType&
from, GenericType*
to);
433 return value.SpaceUsedLong();
437 template <
typename GenericType>
442 template <
typename GenericType>
457 return value->GetOwningArena();
486 return Arena::Create<std::string>(
arena);
497 if (
arena ==
nullptr) {
514 template <
typename Element>
515 class RepeatedPtrField final :
private internal::RepeatedPtrFieldBase {
522 template <
typename Iter,
523 typename =
typename std::enable_if<std::is_constructible<
537 const Element&
Get(
int index)
const;
543 template <
typename Iter>
549 const Element&
at(
int index)
const;
561 PROTOBUF_ATTRIBUTE_REINITIALIZES
void Clear();
566 template <
typename Iter>
579 const Element*
const*
data()
const;
723 #ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
739 #endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
781 template <
typename T>
793 :
arena_(
nullptr), current_size_(0), total_size_(0), rep_(
nullptr) {}
796 :
arena_(
arena), current_size_(0), total_size_(0), rep_(nullptr) {}
798 template <
typename TypeHandler>
800 if (rep_ !=
nullptr &&
arena_ ==
nullptr) {
802 void*
const* elements = rep_->
elements;
803 for (
int i = 0;
i <
n;
i++) {
806 #if defined(__GXX_DELETE_WITH_SIZE__) || defined(__cpp_sized_deallocation)
807 const size_t size = total_size_ *
sizeof(elements[0]) + kRepHeaderSize;
808 ::operator
delete(
static_cast<void*
>(rep_),
size);
810 ::operator
delete(
static_cast<void*
>(rep_));
816 template <
typename TypeHandler>
818 #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
820 #else // PROTOBUF_FORCE_COPY_IN_SWAP
821 if (
GetArena() == other->GetArena()) {
822 #endif // !PROTOBUF_FORCE_COPY_IN_SWAP
825 SwapFallback<TypeHandler>(other);
829 template <
typename TypeHandler>
830 void RepeatedPtrFieldBase::SwapFallback(RepeatedPtrFieldBase* other) {
831 #ifdef PROTOBUF_FORCE_COPY_IN_SWAP
833 #else // PROTOBUF_FORCE_COPY_IN_SWAP
835 #endif // !PROTOBUF_FORCE_COPY_IN_SWAP
840 RepeatedPtrFieldBase
temp(other->GetArena());
841 temp.MergeFrom<TypeHandler>(*this);
842 this->Clear<TypeHandler>();
843 this->MergeFrom<TypeHandler>(*other);
844 other->InternalSwap(&
temp);
845 temp.Destroy<TypeHandler>();
852 template <
typename TypeHandler>
860 template <
typename TypeHandler>
868 template <
typename TypeHandler>
875 template <
typename TypeHandler>
882 template <
typename TypeHandler>
889 template <
typename TypeHandler>
892 if (rep_ !=
nullptr && current_size_ < rep_->allocated_size) {
893 return cast<TypeHandler>(rep_->
elements[current_size_++]);
896 TypeHandler::NewFromPrototype(prototype,
arena_);
898 AddOutOfLineHelper(
result));
901 template <
typename TypeHandler,
904 if (rep_ !=
nullptr && current_size_ < rep_->allocated_size) {
909 Reserve(total_size_ + 1);
917 template <
typename TypeHandler>
918 inline void RepeatedPtrFieldBase::RemoveLast() {
923 template <
typename TypeHandler>
925 const int n = current_size_;
928 void*
const* elements = rep_->
elements;
943 template <
typename TypeHandler>
946 if (other.current_size_ == 0)
return;
947 MergeFromInternal(other,
948 &RepeatedPtrFieldBase::MergeFromInnerLoop<TypeHandler>);
951 inline void RepeatedPtrFieldBase::MergeFromInternal(
952 const RepeatedPtrFieldBase& other,
953 void (RepeatedPtrFieldBase::*inner_loop)(
void**,
void**,
int,
int)) {
955 int other_size = other.current_size_;
956 void** other_elements = other.rep_->elements;
957 void** new_elements = InternalExtend(other_size);
959 (this->*inner_loop)(new_elements, other_elements, other_size,
961 current_size_ += other_size;
968 template <
typename TypeHandler>
969 void RepeatedPtrFieldBase::MergeFromInnerLoop(
void** our_elems,
970 void** other_elems,
int length,
971 int already_allocated) {
972 if (already_allocated <
length) {
976 for (
int i = already_allocated;
i <
length;
i++) {
979 TypeHandler::NewFromPrototype(elem_prototype,
arena);
980 our_elems[
i] = new_elem;
994 template <
typename TypeHandler>
996 if (&other ==
this)
return;
997 RepeatedPtrFieldBase::Clear<TypeHandler>();
998 RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other);
1001 inline int RepeatedPtrFieldBase::Capacity()
const {
return total_size_; }
1003 inline void*
const* RepeatedPtrFieldBase::raw_data()
const {
1004 return rep_ ? rep_->
elements :
nullptr;
1007 inline void** RepeatedPtrFieldBase::raw_mutable_data()
const {
1008 return rep_ ?
const_cast<void**
>(rep_->
elements) :
nullptr;
1011 template <
typename TypeHandler>
1018 template <
typename TypeHandler>
1026 inline void RepeatedPtrFieldBase::SwapElements(
int index1,
int index2) {
1031 template <
typename TypeHandler>
1032 inline size_t RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong()
const {
1033 size_t allocated_bytes =
static_cast<size_t>(total_size_) *
sizeof(
void*);
1034 if (rep_ !=
nullptr) {
1037 TypeHandler::SpaceUsedLong(*cast<TypeHandler>(rep_->
elements[
i]));
1039 allocated_bytes += kRepHeaderSize;
1041 return allocated_bytes;
1044 template <
typename TypeHandler>
1046 if (rep_ !=
nullptr && current_size_ < rep_->allocated_size) {
1047 return cast<TypeHandler>(rep_->
elements[current_size_++]);
1054 template <
typename TypeHandler>
1055 void RepeatedPtrFieldBase::AddAllocatedInternal(
1057 Arena* element_arena =
1058 reinterpret_cast<Arena*
>(TypeHandler::GetOwningArena(
value));
1065 if (current_size_ < rep_->allocated_size) {
1070 elems[current_size_] =
value;
1071 current_size_ = current_size_ + 1;
1074 AddAllocatedSlowWithCopy<TypeHandler>(
value, element_arena,
arena);
1079 template <
typename TypeHandler>
1080 void RepeatedPtrFieldBase::AddAllocatedSlowWithCopy(
1087 if (my_arena !=
nullptr && value_arena ==
nullptr) {
1088 my_arena->Own(
value);
1089 }
else if (my_arena != value_arena) {
1091 TypeHandler::NewFromPrototype(
value, my_arena);
1097 UnsafeArenaAddAllocated<TypeHandler>(
value);
1101 template <
typename TypeHandler>
1102 void RepeatedPtrFieldBase::AddAllocatedInternal(
1109 if (current_size_ < rep_->allocated_size) {
1114 elems[current_size_] =
value;
1115 current_size_ = current_size_ + 1;
1118 UnsafeArenaAddAllocated<TypeHandler>(
value);
1122 template <
typename TypeHandler>
1123 void RepeatedPtrFieldBase::UnsafeArenaAddAllocated(
1126 if (!rep_ || current_size_ == total_size_) {
1128 Reserve(total_size_ + 1);
1137 }
else if (current_size_ < rep_->allocated_size) {
1151 template <
typename TypeHandler>
1160 #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
1161 new_result = copy<TypeHandler>(
result);
1163 #else // PROTOBUF_FORCE_COPY_IN_RELEASE
1165 #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE
1173 template <
typename TypeHandler>
1177 <<
"ReleaseLast() called on a RepeatedPtrField that is on an arena, "
1178 <<
"with a type that does not implement MergeFrom. This is unsafe; "
1179 <<
"please implement MergeFrom for your type.";
1180 return UnsafeArenaReleaseLast<TypeHandler>();
1183 template <
typename TypeHandler>
1185 RepeatedPtrFieldBase::UnsafeArenaReleaseLast() {
1188 cast<TypeHandler>(rep_->
elements[--current_size_]);
1190 if (current_size_ < rep_->allocated_size) {
1198 inline int RepeatedPtrFieldBase::ClearedCount()
const {
1202 template <
typename TypeHandler>
1203 inline void RepeatedPtrFieldBase::AddCleared(
1206 <<
"AddCleared() can only be used on a RepeatedPtrField not on an arena.";
1208 <<
"AddCleared() can only accept values not on an arena.";
1210 Reserve(total_size_ + 1);
1215 template <
typename TypeHandler>
1218 <<
"ReleaseCleared() can only be used on a RepeatedPtrField not on "
1230 template <
typename Element>
1231 class RepeatedPtrField<Element>::TypeHandler
1232 :
public internal::GenericTypeHandler<Element> {};
1235 class RepeatedPtrField<
std::
string>::TypeHandler
1236 :
public internal::StringTypeHandler {};
1238 template <
typename Element>
1239 constexpr RepeatedPtrField<Element>::RepeatedPtrField()
1240 : RepeatedPtrFieldBase() {}
1242 template <
typename Element>
1243 inline RepeatedPtrField<Element>::RepeatedPtrField(
Arena*
arena)
1244 : RepeatedPtrFieldBase(
arena) {}
1246 template <
typename Element>
1247 inline RepeatedPtrField<Element>::RepeatedPtrField(
1248 const RepeatedPtrField& other)
1249 : RepeatedPtrFieldBase() {
1253 template <
typename Element>
1254 template <
typename Iter,
typename>
1259 template <
typename Element>
1261 #ifdef __cpp_if_constexpr
1266 if (NeedsDestroy()) DestroyProtos();
1268 Destroy<TypeHandler>();
1272 template <
typename Element>
1273 inline RepeatedPtrField<Element>& RepeatedPtrField<Element>::operator=(
1274 const RepeatedPtrField& other) {
1275 if (
this != &other)
CopyFrom(other);
1279 template <
typename Element>
1280 inline RepeatedPtrField<Element>::RepeatedPtrField(
1281 RepeatedPtrField&& other) noexcept
1282 : RepeatedPtrField() {
1283 #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
1285 #else // PROTOBUF_FORCE_COPY_IN_MOVE
1289 if (other.GetArena()) {
1292 InternalSwap(&other);
1294 #endif // !PROTOBUF_FORCE_COPY_IN_MOVE
1297 template <
typename Element>
1298 inline RepeatedPtrField<Element>& RepeatedPtrField<Element>::operator=(
1299 RepeatedPtrField&& other) noexcept {
1302 if (
this != &other) {
1304 #ifdef PROTOBUF_FORCE_COPY_IN_MOVE
1310 InternalSwap(&other);
1316 template <
typename Element>
1321 template <
typename Element>
1326 template <
typename Element>
1328 return RepeatedPtrFieldBase::Get<TypeHandler>(
index);
1331 template <
typename Element>
1332 inline const Element& RepeatedPtrField<Element>::at(
int index)
const {
1333 return RepeatedPtrFieldBase::at<TypeHandler>(
index);
1336 template <
typename Element>
1337 inline Element& RepeatedPtrField<Element>::at(
int index) {
1338 return RepeatedPtrFieldBase::at<TypeHandler>(
index);
1342 template <
typename Element>
1343 inline Element* RepeatedPtrField<Element>::Mutable(
int index) {
1344 return RepeatedPtrFieldBase::Mutable<TypeHandler>(
index);
1347 template <
typename Element>
1349 return RepeatedPtrFieldBase::Add<TypeHandler>();
1352 template <
typename Element>
1357 template <
typename Element>
1358 template <
typename Iter>
1360 if (std::is_base_of<
1361 std::forward_iterator_tag,
1362 typename std::iterator_traits<Iter>::iterator_category>::
value) {
1371 template <
typename Element>
1373 RepeatedPtrFieldBase::RemoveLast<TypeHandler>();
1376 template <
typename Element>
1377 inline void RepeatedPtrField<Element>::DeleteSubrange(
int start,
int num) {
1381 for (
int i = 0;
i <
num; ++
i) {
1382 RepeatedPtrFieldBase::Delete<TypeHandler>(
start +
i);
1384 UnsafeArenaExtractSubrange(
start,
num,
nullptr);
1387 template <
typename Element>
1388 inline void RepeatedPtrField<Element>::ExtractSubrange(
int start,
int num,
1389 Element** elements) {
1390 typename internal::TypeImplementsMergeBehavior<
1392 ExtractSubrangeInternal(
start,
num, elements, t);
1397 template <
typename Element>
1398 inline void RepeatedPtrField<Element>::ExtractSubrangeInternal(
1404 if (
num == 0)
return;
1407 <<
"Releasing elements without transferring ownership is an unsafe "
1408 "operation. Use UnsafeArenaExtractSubrange.";
1409 if (elements ==
nullptr) {
1415 #ifdef PROTOBUF_FORCE_COPY_IN_RELEASE
1417 for (
int i = 0;
i <
num; ++
i) {
1418 elements[
i] = copy<TypeHandler>(
1419 RepeatedPtrFieldBase::Mutable<TypeHandler>(
i +
start));
1421 if (
arena ==
nullptr) {
1422 for (
int i = 0;
i <
num; ++
i) {
1423 delete RepeatedPtrFieldBase::Mutable<TypeHandler>(
i +
start);
1426 #else // PROTOBUF_FORCE_COPY_IN_RELEASE
1429 if (
arena !=
nullptr) {
1430 for (
int i = 0;
i <
num; ++
i) {
1431 elements[
i] = copy<TypeHandler>(
1432 RepeatedPtrFieldBase::Mutable<TypeHandler>(
i +
start));
1435 for (
int i = 0;
i <
num; ++
i) {
1436 elements[
i] = RepeatedPtrFieldBase::Mutable<TypeHandler>(
i +
start);
1439 #endif // !PROTOBUF_FORCE_COPY_IN_RELEASE
1445 template <
typename Element>
1446 inline void RepeatedPtrField<Element>::ExtractSubrangeInternal(
1453 <<
"ExtractSubrange() when arena is non-nullptr is only supported when "
1454 <<
"the Element type supplies a MergeFrom() operation to make copies.";
1455 UnsafeArenaExtractSubrange(
start,
num, elements);
1458 template <
typename Element>
1459 inline void RepeatedPtrField<Element>::UnsafeArenaExtractSubrange(
1460 int start,
int num, Element** elements) {
1467 if (elements !=
nullptr) {
1468 for (
int i = 0;
i <
num; ++
i) {
1469 elements[
i] = RepeatedPtrFieldBase::Mutable<TypeHandler>(
i +
start);
1476 template <
typename Element>
1478 RepeatedPtrFieldBase::Clear<TypeHandler>();
1481 template <
typename Element>
1483 const RepeatedPtrField& other) {
1484 RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other);
1487 template <
typename Element>
1489 RepeatedPtrFieldBase::CopyFrom<TypeHandler>(other);
1492 template <
typename Element>
1493 template <
typename Iter>
1499 template <
typename Element>
1505 template <
typename Element>
1507 RepeatedPtrField<Element>::erase(const_iterator
first, const_iterator last) {
1508 size_type pos_offset = std::distance(cbegin(),
first);
1509 size_type last_offset = std::distance(cbegin(), last);
1510 DeleteSubrange(pos_offset, last_offset - pos_offset);
1511 return begin() + pos_offset;
1514 template <
typename Element>
1515 inline Element** RepeatedPtrField<Element>::mutable_data() {
1516 return RepeatedPtrFieldBase::mutable_data<TypeHandler>();
1519 template <
typename Element>
1521 return RepeatedPtrFieldBase::data<TypeHandler>();
1524 template <
typename Element>
1526 if (
this == other)
return;
1527 RepeatedPtrFieldBase::Swap<TypeHandler>(other);
1530 template <
typename Element>
1531 inline void RepeatedPtrField<Element>::UnsafeArenaSwap(
1532 RepeatedPtrField* other) {
1533 if (
this == other)
return;
1534 RepeatedPtrFieldBase::InternalSwap(other);
1537 template <
typename Element>
1538 inline void RepeatedPtrField<Element>::SwapElements(
int index1,
int index2) {
1539 RepeatedPtrFieldBase::SwapElements(index1, index2);
1542 template <
typename Element>
1547 template <
typename Element>
1548 inline size_t RepeatedPtrField<Element>::SpaceUsedExcludingSelfLong()
const {
1549 return RepeatedPtrFieldBase::SpaceUsedExcludingSelfLong<TypeHandler>();
1552 template <
typename Element>
1553 inline void RepeatedPtrField<Element>::AddAllocated(Element*
value) {
1554 RepeatedPtrFieldBase::AddAllocated<TypeHandler>(
value);
1557 template <
typename Element>
1558 inline void RepeatedPtrField<Element>::UnsafeArenaAddAllocated(Element*
value) {
1559 RepeatedPtrFieldBase::UnsafeArenaAddAllocated<TypeHandler>(
value);
1562 template <
typename Element>
1563 inline Element* RepeatedPtrField<Element>::ReleaseLast() {
1564 return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>();
1567 template <
typename Element>
1568 inline Element* RepeatedPtrField<Element>::UnsafeArenaReleaseLast() {
1569 return RepeatedPtrFieldBase::UnsafeArenaReleaseLast<TypeHandler>();
1572 template <
typename Element>
1573 inline int RepeatedPtrField<Element>::ClearedCount()
const {
1574 return RepeatedPtrFieldBase::ClearedCount();
1577 #ifndef PROTOBUF_FUTURE_BREAKING_CHANGES
1578 template <
typename Element>
1579 inline void RepeatedPtrField<Element>::AddCleared(Element*
value) {
1580 return RepeatedPtrFieldBase::AddCleared<TypeHandler>(
value);
1583 template <
typename Element>
1584 inline Element* RepeatedPtrField<Element>::ReleaseCleared() {
1585 return RepeatedPtrFieldBase::ReleaseCleared<TypeHandler>();
1587 #endif // !PROTOBUF_FUTURE_BREAKING_CHANGES
1589 template <
typename Element>
1590 inline void RepeatedPtrField<Element>::Reserve(
int new_size) {
1591 return RepeatedPtrFieldBase::Reserve(
new_size);
1594 template <
typename Element>
1595 inline int RepeatedPtrField<Element>::Capacity()
const {
1596 return RepeatedPtrFieldBase::Capacity();
1614 template <
typename Element>
1615 class RepeatedPtrIterator {
1629 template <
typename OtherElement>
1634 static_cast<void>([](OtherElement*
from) -> Element* {
return from; });
1693 template <
typename OtherElement>
1707 template <
typename Element,
typename Vo
idPtr>
1708 class RepeatedPtrOverPtrsIterator {
1775 template <
typename OtherElement>
1790 std::tie(
arena_, current_size_, total_size_, rep_) =
temp;
1795 template <
typename Element>
1800 template <
typename Element>
1801 inline typename RepeatedPtrField<Element>::const_iterator
1805 template <
typename Element>
1806 inline typename RepeatedPtrField<Element>::const_iterator
1807 RepeatedPtrField<Element>::cbegin()
const {
1810 template <
typename Element>
1815 template <
typename Element>
1816 inline typename RepeatedPtrField<Element>::const_iterator
1820 template <
typename Element>
1821 inline typename RepeatedPtrField<Element>::const_iterator
1822 RepeatedPtrField<Element>::cend()
const {
1826 template <
typename Element>
1827 inline typename RepeatedPtrField<Element>::pointer_iterator
1828 RepeatedPtrField<Element>::pointer_begin() {
1829 return pointer_iterator(raw_mutable_data());
1831 template <
typename Element>
1832 inline typename RepeatedPtrField<Element>::const_pointer_iterator
1833 RepeatedPtrField<Element>::pointer_begin()
const {
1834 return const_pointer_iterator(
const_cast<const void*
const*
>(raw_data()));
1836 template <
typename Element>
1837 inline typename RepeatedPtrField<Element>::pointer_iterator
1838 RepeatedPtrField<Element>::pointer_end() {
1839 return pointer_iterator(raw_mutable_data() +
size());
1841 template <
typename Element>
1842 inline typename RepeatedPtrField<Element>::const_pointer_iterator
1843 RepeatedPtrField<Element>::pointer_end()
const {
1844 return const_pointer_iterator(
1845 const_cast<const void*
const*
>(raw_data() +
size()));
1860 template <
typename T>
1861 class RepeatedPtrFieldBackInsertIterator {
1870 : field_(mutable_field) {}
1872 *field_->Add() =
value;
1876 const T*
const ptr_to_value) {
1877 *field_->Add() = *ptr_to_value;
1896 template <
typename T>
1897 class AllocatedRepeatedPtrFieldBackInsertIterator {
1907 : field_(mutable_field) {}
1909 T*
const ptr_to_value) {
1910 field_->AddAllocated(ptr_to_value);
1925 template <
typename T>
1926 class UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator {
1936 : field_(mutable_field) {}
1938 T const*
const ptr_to_value) {
1939 field_->UnsafeArenaAddAllocated(
const_cast<T*
>(ptr_to_value));
1961 template <
typename T>
1963 RepeatedPtrField<T>*
const mutable_field) {
1964 return internal::RepeatedPtrFieldBackInsertIterator<T>(mutable_field);
1970 template <
typename T>
1972 RepeatedPtrField<T>*
const mutable_field) {
1973 return internal::RepeatedPtrFieldBackInsertIterator<T>(mutable_field);
1979 template <
typename T>
1980 internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>
1982 RepeatedPtrField<T>*
const mutable_field) {
1983 return internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>(
1998 template <
typename T>
1999 internal::UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator<T>
2001 RepeatedPtrField<T>*
const mutable_field) {
2002 return internal::UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator<T>(
2006 extern template class PROTOBUF_EXPORT_TEMPLATE_DECLARE
2007 RepeatedPtrField<std::string>;
2012 #include <google/protobuf/port_undef.inc>
2014 #endif // GOOGLE_PROTOBUF_REPEATED_PTR_FIELD_H__