@@ -1497,6 +1497,15 @@ class ABSL_ATTRIBUTE_WARN_UNUSED RepeatedPtrField final
14971497#endif // !PROTOBUF_INTERNAL_REMOVE_ARENA_PTRS_REPEATED_PTR_FIELD
14981498
14991499
1500+ void AddAllocatedWithArena (Arena* arena, Element* value);
1501+
1502+ PROTOBUF_FUTURE_ADD_NODISCARD Element* ReleaseLastWithArena (Arena* arena);
1503+
1504+ void UnsafeArenaAddAllocatedWithArena (Arena* arena, Element* value);
1505+
1506+ void ExtractSubrangeWithArena (Arena* arena, int start, int num,
1507+ Element** elements);
1508+
15001509 void AddAllocatedForParse (Element* p, Arena* arena) {
15011510 return RepeatedPtrFieldBase::AddAllocatedForParse (p, arena);
15021511 }
@@ -1724,6 +1733,13 @@ inline void RepeatedPtrField<Element>::DeleteSubrange(int start, int num) {
17241733template <typename Element>
17251734inline void RepeatedPtrField<Element>::ExtractSubrange(int start, int num,
17261735 Element** elements) {
1736+ ExtractSubrangeWithArena (GetArena (), start, num, elements);
1737+ }
1738+
1739+ template <typename Element>
1740+ inline void RepeatedPtrField<Element>::ExtractSubrangeWithArena(
1741+ Arena* arena, int start, int num, Element** elements) {
1742+ ABSL_DCHECK_EQ (arena, GetArena ());
17271743 ABSL_DCHECK_GE (start, 0 );
17281744 ABSL_DCHECK_GE (num, 0 );
17291745 ABSL_DCHECK_LE (start + num, size ());
@@ -1734,7 +1750,6 @@ inline void RepeatedPtrField<Element>::ExtractSubrange(int start, int num,
17341750 << " Releasing elements without transferring ownership is an unsafe "
17351751 " operation. Use UnsafeArenaExtractSubrange." ;
17361752 if (elements != nullptr ) {
1737- Arena* arena = GetArena ();
17381753 auto * extracted = data () + start;
17391754 if (internal::DebugHardenForceCopyInRelease ()) {
17401755 // Always copy.
@@ -1874,17 +1889,36 @@ inline size_t RepeatedPtrField<Element>::SpaceUsedExcludingSelfLong() const {
18741889
18751890template <typename Element>
18761891inline void RepeatedPtrField<Element>::AddAllocated(Element* value) {
1877- RepeatedPtrFieldBase::AddAllocated<TypeHandler>(GetArena (), value);
1892+ AddAllocatedWithArena (GetArena (), value);
1893+ }
1894+
1895+ template <typename Element>
1896+ inline void RepeatedPtrField<Element>::AddAllocatedWithArena(Arena* arena,
1897+ Element* value) {
1898+ ABSL_DCHECK_EQ (arena, GetArena ());
1899+ RepeatedPtrFieldBase::AddAllocated<TypeHandler>(arena, value);
18781900}
18791901
18801902template <typename Element>
18811903inline void RepeatedPtrField<Element>::UnsafeArenaAddAllocated(Element* value) {
1882- RepeatedPtrFieldBase::UnsafeArenaAddAllocated<TypeHandler>(GetArena (), value);
1904+ UnsafeArenaAddAllocatedWithArena (GetArena (), value);
1905+ }
1906+
1907+ template <typename Element>
1908+ inline void RepeatedPtrField<Element>::UnsafeArenaAddAllocatedWithArena(
1909+ Arena* arena, Element* value) {
1910+ ABSL_DCHECK_EQ (arena, GetArena ());
1911+ RepeatedPtrFieldBase::UnsafeArenaAddAllocated<TypeHandler>(arena, value);
18831912}
18841913
18851914template <typename Element>
18861915inline Element* RepeatedPtrField<Element>::ReleaseLast() {
1887- return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>(GetArena ());
1916+ return ReleaseLastWithArena (GetArena ());
1917+ }
1918+ template <typename Element>
1919+ inline Element* RepeatedPtrField<Element>::ReleaseLastWithArena(Arena* arena) {
1920+ ABSL_DCHECK_EQ (arena, GetArena ());
1921+ return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>(arena);
18881922}
18891923
18901924template <typename Element>
0 commit comments