1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #ifndef ART_LIBARTBASE_BASE_ARENA_CONTAINERS_H_
18*795d594fSAndroid Build Coastguard Worker #define ART_LIBARTBASE_BASE_ARENA_CONTAINERS_H_
19*795d594fSAndroid Build Coastguard Worker
20*795d594fSAndroid Build Coastguard Worker #include <deque>
21*795d594fSAndroid Build Coastguard Worker #include <forward_list>
22*795d594fSAndroid Build Coastguard Worker #include <queue>
23*795d594fSAndroid Build Coastguard Worker #include <set>
24*795d594fSAndroid Build Coastguard Worker #include <stack>
25*795d594fSAndroid Build Coastguard Worker #include <unordered_map>
26*795d594fSAndroid Build Coastguard Worker #include <utility>
27*795d594fSAndroid Build Coastguard Worker
28*795d594fSAndroid Build Coastguard Worker #include "arena_allocator.h"
29*795d594fSAndroid Build Coastguard Worker #include "dchecked_vector.h"
30*795d594fSAndroid Build Coastguard Worker #include "hash_map.h"
31*795d594fSAndroid Build Coastguard Worker #include "hash_set.h"
32*795d594fSAndroid Build Coastguard Worker #include "safe_map.h"
33*795d594fSAndroid Build Coastguard Worker
34*795d594fSAndroid Build Coastguard Worker namespace art {
35*795d594fSAndroid Build Coastguard Worker
36*795d594fSAndroid Build Coastguard Worker // Adapter for use of ArenaAllocator in STL containers.
37*795d594fSAndroid Build Coastguard Worker // Use ArenaAllocator::Adapter() to create an adapter to pass to container constructors.
38*795d594fSAndroid Build Coastguard Worker // For example,
39*795d594fSAndroid Build Coastguard Worker // struct Foo {
40*795d594fSAndroid Build Coastguard Worker // explicit Foo(ArenaAllocator* allocator)
41*795d594fSAndroid Build Coastguard Worker // : foo_vector(allocator->Adapter(kArenaAllocMisc)),
42*795d594fSAndroid Build Coastguard Worker // foo_map(std::less<int>(), allocator->Adapter()) {
43*795d594fSAndroid Build Coastguard Worker // }
44*795d594fSAndroid Build Coastguard Worker // ArenaVector<int> foo_vector;
45*795d594fSAndroid Build Coastguard Worker // ArenaSafeMap<int, int> foo_map;
46*795d594fSAndroid Build Coastguard Worker // };
47*795d594fSAndroid Build Coastguard Worker template <typename T>
48*795d594fSAndroid Build Coastguard Worker class ArenaAllocatorAdapter;
49*795d594fSAndroid Build Coastguard Worker
50*795d594fSAndroid Build Coastguard Worker template <typename T>
51*795d594fSAndroid Build Coastguard Worker using ArenaDeque = std::deque<T, ArenaAllocatorAdapter<T>>;
52*795d594fSAndroid Build Coastguard Worker
53*795d594fSAndroid Build Coastguard Worker template <typename T>
54*795d594fSAndroid Build Coastguard Worker using ArenaForwardList = std::forward_list<T, ArenaAllocatorAdapter<T>>;
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker template <typename T>
57*795d594fSAndroid Build Coastguard Worker using ArenaQueue = std::queue<T, ArenaDeque<T>>;
58*795d594fSAndroid Build Coastguard Worker
59*795d594fSAndroid Build Coastguard Worker template <typename T>
60*795d594fSAndroid Build Coastguard Worker using ArenaVector = dchecked_vector<T, ArenaAllocatorAdapter<T>>;
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Worker template <typename T, typename Comparator = std::less<T>>
63*795d594fSAndroid Build Coastguard Worker using ArenaPriorityQueue = std::priority_queue<T, ArenaVector<T>, Comparator>;
64*795d594fSAndroid Build Coastguard Worker
65*795d594fSAndroid Build Coastguard Worker template <typename T>
66*795d594fSAndroid Build Coastguard Worker using ArenaStdStack = std::stack<T, ArenaDeque<T>>;
67*795d594fSAndroid Build Coastguard Worker
68*795d594fSAndroid Build Coastguard Worker template <typename T, typename Comparator = std::less<T>>
69*795d594fSAndroid Build Coastguard Worker using ArenaSet = std::set<T, Comparator, ArenaAllocatorAdapter<T>>;
70*795d594fSAndroid Build Coastguard Worker
71*795d594fSAndroid Build Coastguard Worker template <typename K, typename V, typename Comparator = std::less<K>>
72*795d594fSAndroid Build Coastguard Worker using ArenaSafeMap =
73*795d594fSAndroid Build Coastguard Worker SafeMap<K, V, Comparator, ArenaAllocatorAdapter<std::pair<const K, V>>>;
74*795d594fSAndroid Build Coastguard Worker
75*795d594fSAndroid Build Coastguard Worker template <typename T,
76*795d594fSAndroid Build Coastguard Worker typename EmptyFn = DefaultEmptyFn<T>,
77*795d594fSAndroid Build Coastguard Worker typename HashFn = DefaultHashFn<T>,
78*795d594fSAndroid Build Coastguard Worker typename Pred = DefaultPred<T>>
79*795d594fSAndroid Build Coastguard Worker using ArenaHashSet = HashSet<T, EmptyFn, HashFn, Pred, ArenaAllocatorAdapter<T>>;
80*795d594fSAndroid Build Coastguard Worker
81*795d594fSAndroid Build Coastguard Worker template <typename Key,
82*795d594fSAndroid Build Coastguard Worker typename Value,
83*795d594fSAndroid Build Coastguard Worker typename EmptyFn = DefaultEmptyFn<std::pair<Key, Value>>,
84*795d594fSAndroid Build Coastguard Worker typename HashFn = DefaultHashFn<Key>,
85*795d594fSAndroid Build Coastguard Worker typename Pred = DefaultPred<Key>>
86*795d594fSAndroid Build Coastguard Worker using ArenaHashMap = HashMap<Key,
87*795d594fSAndroid Build Coastguard Worker Value,
88*795d594fSAndroid Build Coastguard Worker EmptyFn,
89*795d594fSAndroid Build Coastguard Worker HashFn,
90*795d594fSAndroid Build Coastguard Worker Pred,
91*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter<std::pair<Key, Value>>>;
92*795d594fSAndroid Build Coastguard Worker
93*795d594fSAndroid Build Coastguard Worker template <typename Key,
94*795d594fSAndroid Build Coastguard Worker typename Value,
95*795d594fSAndroid Build Coastguard Worker typename Hash = std::hash<Key>,
96*795d594fSAndroid Build Coastguard Worker typename Pred = std::equal_to<Key>>
97*795d594fSAndroid Build Coastguard Worker using ArenaUnorderedMap = std::unordered_map<Key,
98*795d594fSAndroid Build Coastguard Worker Value,
99*795d594fSAndroid Build Coastguard Worker Hash,
100*795d594fSAndroid Build Coastguard Worker Pred,
101*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter<std::pair<const Key, Value>>>;
102*795d594fSAndroid Build Coastguard Worker
103*795d594fSAndroid Build Coastguard Worker // Implementation details below.
104*795d594fSAndroid Build Coastguard Worker
105*795d594fSAndroid Build Coastguard Worker template <bool kCount>
106*795d594fSAndroid Build Coastguard Worker class ArenaAllocatorAdapterKindImpl;
107*795d594fSAndroid Build Coastguard Worker
108*795d594fSAndroid Build Coastguard Worker template <>
109*795d594fSAndroid Build Coastguard Worker class ArenaAllocatorAdapterKindImpl<false> {
110*795d594fSAndroid Build Coastguard Worker public:
111*795d594fSAndroid Build Coastguard Worker // Not tracking allocations, ignore the supplied kind and arbitrarily provide kArenaAllocSTL.
ArenaAllocatorAdapterKindImpl(ArenaAllocKind kind)112*795d594fSAndroid Build Coastguard Worker explicit ArenaAllocatorAdapterKindImpl([[maybe_unused]] ArenaAllocKind kind) {}
113*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapterKindImpl(const ArenaAllocatorAdapterKindImpl&) = default;
114*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapterKindImpl& operator=(const ArenaAllocatorAdapterKindImpl&) = default;
Kind()115*795d594fSAndroid Build Coastguard Worker ArenaAllocKind Kind() { return kArenaAllocSTL; }
116*795d594fSAndroid Build Coastguard Worker };
117*795d594fSAndroid Build Coastguard Worker
118*795d594fSAndroid Build Coastguard Worker template <bool kCount>
119*795d594fSAndroid Build Coastguard Worker class ArenaAllocatorAdapterKindImpl {
120*795d594fSAndroid Build Coastguard Worker public:
ArenaAllocatorAdapterKindImpl(ArenaAllocKind kind)121*795d594fSAndroid Build Coastguard Worker explicit ArenaAllocatorAdapterKindImpl(ArenaAllocKind kind) : kind_(kind) { }
122*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapterKindImpl(const ArenaAllocatorAdapterKindImpl&) = default;
123*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapterKindImpl& operator=(const ArenaAllocatorAdapterKindImpl&) = default;
Kind()124*795d594fSAndroid Build Coastguard Worker ArenaAllocKind Kind() { return kind_; }
125*795d594fSAndroid Build Coastguard Worker
126*795d594fSAndroid Build Coastguard Worker private:
127*795d594fSAndroid Build Coastguard Worker ArenaAllocKind kind_;
128*795d594fSAndroid Build Coastguard Worker };
129*795d594fSAndroid Build Coastguard Worker
130*795d594fSAndroid Build Coastguard Worker using ArenaAllocatorAdapterKind = ArenaAllocatorAdapterKindImpl<kArenaAllocatorCountAllocations>;
131*795d594fSAndroid Build Coastguard Worker
132*795d594fSAndroid Build Coastguard Worker template <>
133*795d594fSAndroid Build Coastguard Worker class ArenaAllocatorAdapter<void> : private ArenaAllocatorAdapterKind {
134*795d594fSAndroid Build Coastguard Worker public:
135*795d594fSAndroid Build Coastguard Worker using value_type = void;
136*795d594fSAndroid Build Coastguard Worker using pointer = void*;
137*795d594fSAndroid Build Coastguard Worker using const_pointer = const void*;
138*795d594fSAndroid Build Coastguard Worker
139*795d594fSAndroid Build Coastguard Worker template <typename U>
140*795d594fSAndroid Build Coastguard Worker struct rebind {
141*795d594fSAndroid Build Coastguard Worker using other = ArenaAllocatorAdapter<U>;
142*795d594fSAndroid Build Coastguard Worker };
143*795d594fSAndroid Build Coastguard Worker
144*795d594fSAndroid Build Coastguard Worker explicit ArenaAllocatorAdapter(ArenaAllocator* allocator,
145*795d594fSAndroid Build Coastguard Worker ArenaAllocKind kind = kArenaAllocSTL)
ArenaAllocatorAdapterKind(kind)146*795d594fSAndroid Build Coastguard Worker : ArenaAllocatorAdapterKind(kind),
147*795d594fSAndroid Build Coastguard Worker allocator_(allocator) {
148*795d594fSAndroid Build Coastguard Worker }
149*795d594fSAndroid Build Coastguard Worker template <typename U>
ArenaAllocatorAdapter(const ArenaAllocatorAdapter<U> & other)150*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter(const ArenaAllocatorAdapter<U>& other)
151*795d594fSAndroid Build Coastguard Worker : ArenaAllocatorAdapterKind(other),
152*795d594fSAndroid Build Coastguard Worker allocator_(other.allocator_) {
153*795d594fSAndroid Build Coastguard Worker }
154*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter(const ArenaAllocatorAdapter&) = default;
155*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter& operator=(const ArenaAllocatorAdapter&) = default;
156*795d594fSAndroid Build Coastguard Worker ~ArenaAllocatorAdapter() = default;
157*795d594fSAndroid Build Coastguard Worker
158*795d594fSAndroid Build Coastguard Worker private:
159*795d594fSAndroid Build Coastguard Worker ArenaAllocator* allocator_;
160*795d594fSAndroid Build Coastguard Worker
161*795d594fSAndroid Build Coastguard Worker template <typename U>
162*795d594fSAndroid Build Coastguard Worker friend class ArenaAllocatorAdapter;
163*795d594fSAndroid Build Coastguard Worker };
164*795d594fSAndroid Build Coastguard Worker
165*795d594fSAndroid Build Coastguard Worker template <typename T>
166*795d594fSAndroid Build Coastguard Worker class ArenaAllocatorAdapter : private ArenaAllocatorAdapterKind {
167*795d594fSAndroid Build Coastguard Worker public:
168*795d594fSAndroid Build Coastguard Worker using value_type = T;
169*795d594fSAndroid Build Coastguard Worker using pointer = T*;
170*795d594fSAndroid Build Coastguard Worker using reference = T&;
171*795d594fSAndroid Build Coastguard Worker using const_pointer = const T*;
172*795d594fSAndroid Build Coastguard Worker using const_reference = const T&;
173*795d594fSAndroid Build Coastguard Worker using size_type = size_t;
174*795d594fSAndroid Build Coastguard Worker using difference_type = ptrdiff_t;
175*795d594fSAndroid Build Coastguard Worker
176*795d594fSAndroid Build Coastguard Worker template <typename U>
177*795d594fSAndroid Build Coastguard Worker struct rebind {
178*795d594fSAndroid Build Coastguard Worker using other = ArenaAllocatorAdapter<U>;
179*795d594fSAndroid Build Coastguard Worker };
180*795d594fSAndroid Build Coastguard Worker
ArenaAllocatorAdapter(ArenaAllocator * allocator,ArenaAllocKind kind)181*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter(ArenaAllocator* allocator, ArenaAllocKind kind)
182*795d594fSAndroid Build Coastguard Worker : ArenaAllocatorAdapterKind(kind),
183*795d594fSAndroid Build Coastguard Worker allocator_(allocator) {
184*795d594fSAndroid Build Coastguard Worker }
185*795d594fSAndroid Build Coastguard Worker template <typename U>
ArenaAllocatorAdapter(const ArenaAllocatorAdapter<U> & other)186*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter(const ArenaAllocatorAdapter<U>& other)
187*795d594fSAndroid Build Coastguard Worker : ArenaAllocatorAdapterKind(other),
188*795d594fSAndroid Build Coastguard Worker allocator_(other.allocator_) {
189*795d594fSAndroid Build Coastguard Worker }
190*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter(const ArenaAllocatorAdapter&) = default;
191*795d594fSAndroid Build Coastguard Worker ArenaAllocatorAdapter& operator=(const ArenaAllocatorAdapter&) = default;
192*795d594fSAndroid Build Coastguard Worker ~ArenaAllocatorAdapter() = default;
193*795d594fSAndroid Build Coastguard Worker
max_size()194*795d594fSAndroid Build Coastguard Worker size_type max_size() const {
195*795d594fSAndroid Build Coastguard Worker return static_cast<size_type>(-1) / sizeof(T);
196*795d594fSAndroid Build Coastguard Worker }
197*795d594fSAndroid Build Coastguard Worker
address(reference x)198*795d594fSAndroid Build Coastguard Worker pointer address(reference x) const { return &x; }
address(const_reference x)199*795d594fSAndroid Build Coastguard Worker const_pointer address(const_reference x) const { return &x; }
200*795d594fSAndroid Build Coastguard Worker
201*795d594fSAndroid Build Coastguard Worker pointer allocate(size_type n,
202*795d594fSAndroid Build Coastguard Worker [[maybe_unused]] ArenaAllocatorAdapter<void>::pointer hint = nullptr) {
203*795d594fSAndroid Build Coastguard Worker DCHECK_LE(n, max_size());
204*795d594fSAndroid Build Coastguard Worker return allocator_->AllocArray<T>(n, ArenaAllocatorAdapterKind::Kind());
205*795d594fSAndroid Build Coastguard Worker }
deallocate(pointer p,size_type n)206*795d594fSAndroid Build Coastguard Worker void deallocate(pointer p, size_type n) {
207*795d594fSAndroid Build Coastguard Worker allocator_->MakeInaccessible(p, sizeof(T) * n);
208*795d594fSAndroid Build Coastguard Worker }
209*795d594fSAndroid Build Coastguard Worker
210*795d594fSAndroid Build Coastguard Worker template <typename U, typename... Args>
construct(U * p,Args &&...args)211*795d594fSAndroid Build Coastguard Worker void construct(U* p, Args&&... args) {
212*795d594fSAndroid Build Coastguard Worker ::new (static_cast<void*>(p)) U(std::forward<Args>(args)...);
213*795d594fSAndroid Build Coastguard Worker }
214*795d594fSAndroid Build Coastguard Worker template <typename U>
destroy(U * p)215*795d594fSAndroid Build Coastguard Worker void destroy(U* p) {
216*795d594fSAndroid Build Coastguard Worker p->~U();
217*795d594fSAndroid Build Coastguard Worker }
218*795d594fSAndroid Build Coastguard Worker
219*795d594fSAndroid Build Coastguard Worker private:
220*795d594fSAndroid Build Coastguard Worker ArenaAllocator* allocator_;
221*795d594fSAndroid Build Coastguard Worker
222*795d594fSAndroid Build Coastguard Worker template <typename U>
223*795d594fSAndroid Build Coastguard Worker friend class ArenaAllocatorAdapter;
224*795d594fSAndroid Build Coastguard Worker
225*795d594fSAndroid Build Coastguard Worker template <typename U>
226*795d594fSAndroid Build Coastguard Worker friend bool operator==(const ArenaAllocatorAdapter<U>& lhs,
227*795d594fSAndroid Build Coastguard Worker const ArenaAllocatorAdapter<U>& rhs);
228*795d594fSAndroid Build Coastguard Worker };
229*795d594fSAndroid Build Coastguard Worker
230*795d594fSAndroid Build Coastguard Worker template <typename T>
231*795d594fSAndroid Build Coastguard Worker inline bool operator==(const ArenaAllocatorAdapter<T>& lhs,
232*795d594fSAndroid Build Coastguard Worker const ArenaAllocatorAdapter<T>& rhs) {
233*795d594fSAndroid Build Coastguard Worker return lhs.allocator_ == rhs.allocator_;
234*795d594fSAndroid Build Coastguard Worker }
235*795d594fSAndroid Build Coastguard Worker
236*795d594fSAndroid Build Coastguard Worker template <typename T>
237*795d594fSAndroid Build Coastguard Worker inline bool operator!=(const ArenaAllocatorAdapter<T>& lhs,
238*795d594fSAndroid Build Coastguard Worker const ArenaAllocatorAdapter<T>& rhs) {
239*795d594fSAndroid Build Coastguard Worker return !(lhs == rhs);
240*795d594fSAndroid Build Coastguard Worker }
241*795d594fSAndroid Build Coastguard Worker
Adapter(ArenaAllocKind kind)242*795d594fSAndroid Build Coastguard Worker inline ArenaAllocatorAdapter<void> ArenaAllocator::Adapter(ArenaAllocKind kind) {
243*795d594fSAndroid Build Coastguard Worker return ArenaAllocatorAdapter<void>(this, kind);
244*795d594fSAndroid Build Coastguard Worker }
245*795d594fSAndroid Build Coastguard Worker
246*795d594fSAndroid Build Coastguard Worker // Special deleter that only calls the destructor. Also checks for double free errors.
247*795d594fSAndroid Build Coastguard Worker template <typename T>
248*795d594fSAndroid Build Coastguard Worker class ArenaDelete {
249*795d594fSAndroid Build Coastguard Worker static constexpr uint8_t kMagicFill = 0xCE;
250*795d594fSAndroid Build Coastguard Worker
251*795d594fSAndroid Build Coastguard Worker protected:
252*795d594fSAndroid Build Coastguard Worker // Used for variable sized objects such as RegisterLine.
ProtectMemory(T * ptr,size_t size)253*795d594fSAndroid Build Coastguard Worker ALWAYS_INLINE void ProtectMemory(T* ptr, size_t size) const {
254*795d594fSAndroid Build Coastguard Worker if (kRunningOnMemoryTool) {
255*795d594fSAndroid Build Coastguard Worker memset(ptr, kMagicFill, size);
256*795d594fSAndroid Build Coastguard Worker MEMORY_TOOL_MAKE_NOACCESS(ptr, size);
257*795d594fSAndroid Build Coastguard Worker } else if (kIsDebugBuild) {
258*795d594fSAndroid Build Coastguard Worker // Write a magic value to try and catch use after free errors.
259*795d594fSAndroid Build Coastguard Worker memset(ptr, kMagicFill, size);
260*795d594fSAndroid Build Coastguard Worker }
261*795d594fSAndroid Build Coastguard Worker }
262*795d594fSAndroid Build Coastguard Worker
263*795d594fSAndroid Build Coastguard Worker public:
operator()264*795d594fSAndroid Build Coastguard Worker void operator()(T* ptr) const {
265*795d594fSAndroid Build Coastguard Worker if (ptr != nullptr) {
266*795d594fSAndroid Build Coastguard Worker ptr->~T();
267*795d594fSAndroid Build Coastguard Worker ProtectMemory(ptr, sizeof(T));
268*795d594fSAndroid Build Coastguard Worker }
269*795d594fSAndroid Build Coastguard Worker }
270*795d594fSAndroid Build Coastguard Worker };
271*795d594fSAndroid Build Coastguard Worker
272*795d594fSAndroid Build Coastguard Worker // In general we lack support for arrays. We would need to call the destructor on each element,
273*795d594fSAndroid Build Coastguard Worker // which requires access to the array size. Support for that is future work.
274*795d594fSAndroid Build Coastguard Worker //
275*795d594fSAndroid Build Coastguard Worker // However, we can support trivially destructible component types, as then a destructor doesn't
276*795d594fSAndroid Build Coastguard Worker // need to be called.
277*795d594fSAndroid Build Coastguard Worker template <typename T>
278*795d594fSAndroid Build Coastguard Worker class ArenaDelete<T[]> {
279*795d594fSAndroid Build Coastguard Worker public:
operator()280*795d594fSAndroid Build Coastguard Worker void operator()([[maybe_unused]] T* ptr) const {
281*795d594fSAndroid Build Coastguard Worker static_assert(std::is_trivially_destructible_v<T>,
282*795d594fSAndroid Build Coastguard Worker "ArenaUniquePtr does not support non-trivially-destructible arrays.");
283*795d594fSAndroid Build Coastguard Worker // TODO: Implement debug checks, and MEMORY_TOOL support.
284*795d594fSAndroid Build Coastguard Worker }
285*795d594fSAndroid Build Coastguard Worker };
286*795d594fSAndroid Build Coastguard Worker
287*795d594fSAndroid Build Coastguard Worker // Arena unique ptr that only calls the destructor of the element.
288*795d594fSAndroid Build Coastguard Worker template <typename T>
289*795d594fSAndroid Build Coastguard Worker using ArenaUniquePtr = std::unique_ptr<T, ArenaDelete<T>>;
290*795d594fSAndroid Build Coastguard Worker
291*795d594fSAndroid Build Coastguard Worker } // namespace art
292*795d594fSAndroid Build Coastguard Worker
293*795d594fSAndroid Build Coastguard Worker #endif // ART_LIBARTBASE_BASE_ARENA_CONTAINERS_H_
294