annotate include/unique-ptr.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* gnu::unique_ptr, a simple std::unique_ptr replacement for C++03.
kono
parents:
diff changeset
2
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
3 Copyright (C) 2007-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 This program is free software; you can redistribute it and/or modify
kono
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 the Free Software Foundation; either version 3 of the License, or
kono
parents:
diff changeset
10 (at your option) any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 This program is distributed in the hope that it will be useful,
kono
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
15 GNU General Public License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 /* gnu::unique_ptr defines a C++ owning smart pointer that exposes a
kono
parents:
diff changeset
21 subset of the std::unique_ptr API.
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 In fact, when compiled with a C++11 compiler, gnu::unique_ptr
kono
parents:
diff changeset
24 actually _is_ std::unique_ptr. When compiled with a C++03 compiler
kono
parents:
diff changeset
25 OTOH, it's an hand coded std::unique_ptr emulation that assumes
kono
parents:
diff changeset
26 code is correct and doesn't try to be too smart.
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 This supports custom deleters, but not _stateful_ deleters, so you
kono
parents:
diff changeset
29 can't use those in C++11 mode either. Only the managed pointer is
kono
parents:
diff changeset
30 stored in the smart pointer. That could be changed; it simply
kono
parents:
diff changeset
31 wasn't found necessary.
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 At the end of the file you'll find a gnu::unique_ptr partial
kono
parents:
diff changeset
34 specialization that uses a custom (stateless) deleter:
kono
parents:
diff changeset
35 gnu::unique_xmalloc_ptr. That is used to manage pointers to
kono
parents:
diff changeset
36 objects allocated with xmalloc.
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 The C++03 version was originally based on GCC 7.0's std::auto_ptr
kono
parents:
diff changeset
39 and then heavily customized to behave more like C++11's
kono
parents:
diff changeset
40 std::unique_ptr, but at this point, it no longer shares much at all
kono
parents:
diff changeset
41 with the original file. But, that's the history and the reason for
kono
parents:
diff changeset
42 the copyright's starting year.
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 The C++03 version lets you shoot yourself in the foot, since
kono
parents:
diff changeset
45 similarly to std::auto_ptr, the copy constructor and assignment
kono
parents:
diff changeset
46 operators actually move. Also, in the name of simplicity, no
kono
parents:
diff changeset
47 effort is spent on using SFINAE to prevent invalid conversions,
kono
parents:
diff changeset
48 etc. This is not really a problem, because the goal here is to
kono
parents:
diff changeset
49 allow code that would be correct using std::unique_ptr to be
kono
parents:
diff changeset
50 equally correct in C++03 mode, and, just as efficient. If client
kono
parents:
diff changeset
51 code compiles correctly with a C++11 (or newer) compiler, we know
kono
parents:
diff changeset
52 we're not doing anything invalid by mistake.
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 Usage notes:
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 - Putting gnu::unique_ptr in standard containers is not supported,
kono
parents:
diff changeset
57 since C++03 containers are not move-aware (and our emulation
kono
parents:
diff changeset
58 relies on copy actually moving).
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 - Since there's no nullptr in C++03, gnu::unique_ptr allows
kono
parents:
diff changeset
61 implicit initialization and assignment from NULL instead.
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 - To check whether there's an associated managed object, all these
kono
parents:
diff changeset
64 work as expected:
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 if (ptr)
kono
parents:
diff changeset
67 if (!ptr)
kono
parents:
diff changeset
68 if (ptr != NULL)
kono
parents:
diff changeset
69 if (ptr == NULL)
kono
parents:
diff changeset
70 if (NULL != ptr)
kono
parents:
diff changeset
71 if (NULL == ptr)
kono
parents:
diff changeset
72 */
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 #ifndef GNU_UNIQUE_PTR_H
kono
parents:
diff changeset
75 #define GNU_UNIQUE_PTR_H 1
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 #if __cplusplus >= 201103
kono
parents:
diff changeset
78 # include <memory>
kono
parents:
diff changeset
79 #endif
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 namespace gnu
kono
parents:
diff changeset
82 {
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 #if __cplusplus >= 201103
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 /* In C++11 mode, all we need is import the standard
kono
parents:
diff changeset
87 std::unique_ptr. */
kono
parents:
diff changeset
88 template<typename T> using unique_ptr = std::unique_ptr<T>;
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 /* Pull in move as well. */
kono
parents:
diff changeset
91 using std::move;
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 #else /* C++11 */
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 /* Default destruction policy used by gnu::unique_ptr when no deleter
kono
parents:
diff changeset
96 is specified. Uses delete. */
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 template<typename T>
kono
parents:
diff changeset
99 struct default_delete
kono
parents:
diff changeset
100 {
kono
parents:
diff changeset
101 void operator () (T *ptr) const { delete ptr; }
kono
parents:
diff changeset
102 };
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 /* Specialization for arrays. Uses delete[]. */
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 template<typename T>
kono
parents:
diff changeset
107 struct default_delete<T[]>
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 void operator () (T *ptr) const { delete [] ptr; }
kono
parents:
diff changeset
110 };
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 namespace detail
kono
parents:
diff changeset
113 {
kono
parents:
diff changeset
114 /* Type used to support implicit construction from NULL:
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 gnu::unique_ptr<foo> func (....)
kono
parents:
diff changeset
117 {
kono
parents:
diff changeset
118 return NULL;
kono
parents:
diff changeset
119 }
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 and assignment from NULL:
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 gnu::unique_ptr<foo> ptr (....);
kono
parents:
diff changeset
124 ...
kono
parents:
diff changeset
125 ptr = NULL;
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 It is intentionally not defined anywhere. */
kono
parents:
diff changeset
128 struct nullptr_t;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 /* Base class of our unique_ptr emulation. Contains code common to
kono
parents:
diff changeset
131 both unique_ptr<T, D> and unique_ptr<T[], D>. */
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 template<typename T, typename D>
kono
parents:
diff changeset
134 class unique_ptr_base
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 public:
kono
parents:
diff changeset
137 typedef T *pointer;
kono
parents:
diff changeset
138 typedef T element_type;
kono
parents:
diff changeset
139 typedef D deleter_type;
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 /* Takes ownership of a pointer. P is a pointer to an object of
kono
parents:
diff changeset
142 element_type type. Defaults to NULL. */
kono
parents:
diff changeset
143 explicit unique_ptr_base (element_type *p = NULL) throw () : m_ptr (p) {}
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 /* The "move" constructor. Really a copy constructor that actually
kono
parents:
diff changeset
146 moves. Even though std::unique_ptr is not copyable, our little
kono
parents:
diff changeset
147 simpler emulation allows it, because:
kono
parents:
diff changeset
148
kono
parents:
diff changeset
149 - There are no rvalue references in C++03. Our move emulation
kono
parents:
diff changeset
150 instead relies on copy/assignment moving, like std::auto_ptr.
kono
parents:
diff changeset
151 - RVO/NRVO requires an accessible copy constructor
kono
parents:
diff changeset
152 */
kono
parents:
diff changeset
153 unique_ptr_base (const unique_ptr_base &other) throw ()
kono
parents:
diff changeset
154 : m_ptr (const_cast<unique_ptr_base &> (other).release ()) {}
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 /* Converting "move" constructor. Really an lvalue ref converting
kono
parents:
diff changeset
157 constructor that actually moves. This allows constructs such as:
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 unique_ptr<Derived> func_returning_unique_ptr (.....);
kono
parents:
diff changeset
160 ...
kono
parents:
diff changeset
161 unique_ptr<Base> ptr = func_returning_unique_ptr (.....);
kono
parents:
diff changeset
162 */
kono
parents:
diff changeset
163 template<typename T1, typename D1>
kono
parents:
diff changeset
164 unique_ptr_base (const unique_ptr_base<T1, D1> &other) throw ()
kono
parents:
diff changeset
165 : m_ptr (const_cast<unique_ptr_base<T1, D1> &> (other).release ()) {}
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 /* The "move" assignment operator. Really an lvalue ref copy
kono
parents:
diff changeset
168 assignment operator that actually moves. See comments above. */
kono
parents:
diff changeset
169 unique_ptr_base &operator= (const unique_ptr_base &other) throw ()
kono
parents:
diff changeset
170 {
kono
parents:
diff changeset
171 reset (const_cast<unique_ptr_base &> (other).release ());
kono
parents:
diff changeset
172 return *this;
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 /* Converting "move" assignment. Really an lvalue ref converting
kono
parents:
diff changeset
176 copy assignment operator that moves. See comments above. */
kono
parents:
diff changeset
177 template<typename T1, typename D1>
kono
parents:
diff changeset
178 unique_ptr_base &operator= (const unique_ptr_base<T1, D1> &other) throw ()
kono
parents:
diff changeset
179 {
kono
parents:
diff changeset
180 reset (const_cast<unique_ptr_base<T1, D1> &> (other).release ());
kono
parents:
diff changeset
181 return *this;
kono
parents:
diff changeset
182 }
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 /* std::unique_ptr does not allow assignment, except from nullptr.
kono
parents:
diff changeset
185 nullptr doesn't exist in C++03, so we allow assignment from NULL
kono
parents:
diff changeset
186 instead [ptr = NULL;].
kono
parents:
diff changeset
187 */
kono
parents:
diff changeset
188 unique_ptr_base &operator= (detail::nullptr_t *) throw ()
kono
parents:
diff changeset
189 {
kono
parents:
diff changeset
190 reset ();
kono
parents:
diff changeset
191 return *this;
kono
parents:
diff changeset
192 }
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 ~unique_ptr_base () { call_deleter (); }
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 /* "explicit operator bool ()" emulation using the safe bool
kono
parents:
diff changeset
197 idiom. */
kono
parents:
diff changeset
198 private:
kono
parents:
diff changeset
199 typedef void (unique_ptr_base::*explicit_operator_bool) () const;
kono
parents:
diff changeset
200 void this_type_does_not_support_comparisons () const {}
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 public:
kono
parents:
diff changeset
203 operator explicit_operator_bool () const
kono
parents:
diff changeset
204 {
kono
parents:
diff changeset
205 return (m_ptr != NULL
kono
parents:
diff changeset
206 ? &unique_ptr_base::this_type_does_not_support_comparisons
kono
parents:
diff changeset
207 : 0);
kono
parents:
diff changeset
208 }
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 element_type *get () const throw () { return m_ptr; }
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 element_type *release () throw ()
kono
parents:
diff changeset
213 {
kono
parents:
diff changeset
214 pointer tmp = m_ptr;
kono
parents:
diff changeset
215 m_ptr = NULL;
kono
parents:
diff changeset
216 return tmp;
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 void reset (element_type *p = NULL) throw ()
kono
parents:
diff changeset
220 {
kono
parents:
diff changeset
221 if (p != m_ptr)
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 call_deleter ();
kono
parents:
diff changeset
224 m_ptr = p;
kono
parents:
diff changeset
225 }
kono
parents:
diff changeset
226 }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 private:
kono
parents:
diff changeset
229
kono
parents:
diff changeset
230 /* Call the deleter. Note we assume the deleter is "stateless". */
kono
parents:
diff changeset
231 void call_deleter ()
kono
parents:
diff changeset
232 {
kono
parents:
diff changeset
233 D d;
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 d (m_ptr);
kono
parents:
diff changeset
236 }
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 element_type *m_ptr;
kono
parents:
diff changeset
239 };
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 } /* namespace detail */
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 /* Macro used to create a unique_ptr_base "partial specialization" --
kono
parents:
diff changeset
244 a subclass that uses a specific deleter. Basically this re-defines
kono
parents:
diff changeset
245 the necessary constructors. This is necessary because C++03
kono
parents:
diff changeset
246 doesn't support inheriting constructors with "using". While at it,
kono
parents:
diff changeset
247 we inherit the assignment operator. TYPE is the name of the type
kono
parents:
diff changeset
248 being defined. Assumes that 'base_type' is a typedef of the
kono
parents:
diff changeset
249 baseclass TYPE is inheriting from. */
kono
parents:
diff changeset
250 #define DEFINE_GNU_UNIQUE_PTR(TYPE) \
kono
parents:
diff changeset
251 public: \
kono
parents:
diff changeset
252 explicit TYPE (T *p = NULL) throw () \
kono
parents:
diff changeset
253 : base_type (p) {} \
kono
parents:
diff changeset
254 \
kono
parents:
diff changeset
255 TYPE (const TYPE &other) throw () : base_type (other) {} \
kono
parents:
diff changeset
256 \
kono
parents:
diff changeset
257 TYPE (detail::nullptr_t *) throw () : base_type (NULL) {} \
kono
parents:
diff changeset
258 \
kono
parents:
diff changeset
259 template<typename T1, typename D1> \
kono
parents:
diff changeset
260 TYPE (const detail::unique_ptr_base<T1, D1> &other) throw () \
kono
parents:
diff changeset
261 : base_type (other) {} \
kono
parents:
diff changeset
262 \
kono
parents:
diff changeset
263 using base_type::operator=;
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 /* Define single-object gnu::unique_ptr. */
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 template <typename T, typename D = default_delete<T> >
kono
parents:
diff changeset
268 class unique_ptr : public detail::unique_ptr_base<T, D>
kono
parents:
diff changeset
269 {
kono
parents:
diff changeset
270 typedef detail::unique_ptr_base<T, D> base_type;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 DEFINE_GNU_UNIQUE_PTR (unique_ptr)
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 public:
kono
parents:
diff changeset
275 /* Dereferencing. */
kono
parents:
diff changeset
276 T &operator* () const throw () { return *this->get (); }
kono
parents:
diff changeset
277 T *operator-> () const throw () { return this->get (); }
kono
parents:
diff changeset
278 };
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 /* Define gnu::unique_ptr specialization for T[]. */
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 template <typename T, typename D>
kono
parents:
diff changeset
283 class unique_ptr<T[], D> : public detail::unique_ptr_base<T, D>
kono
parents:
diff changeset
284 {
kono
parents:
diff changeset
285 typedef detail::unique_ptr_base<T, D> base_type;
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 DEFINE_GNU_UNIQUE_PTR (unique_ptr)
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 public:
kono
parents:
diff changeset
290 /* Indexing operator. */
kono
parents:
diff changeset
291 T &operator[] (size_t i) const { return this->get ()[i]; }
kono
parents:
diff changeset
292 };
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 /* Comparison operators. */
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 template <typename T, typename D,
kono
parents:
diff changeset
297 typename U, typename E>
kono
parents:
diff changeset
298 inline bool
kono
parents:
diff changeset
299 operator== (const detail::unique_ptr_base<T, D> &x,
kono
parents:
diff changeset
300 const detail::unique_ptr_base<U, E> &y)
kono
parents:
diff changeset
301 { return x.get() == y.get(); }
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 template <typename T, typename D,
kono
parents:
diff changeset
304 typename U, typename E>
kono
parents:
diff changeset
305 inline bool
kono
parents:
diff changeset
306 operator!= (const detail::unique_ptr_base<T, D> &x,
kono
parents:
diff changeset
307 const detail::unique_ptr_base<U, E> &y)
kono
parents:
diff changeset
308 { return x.get() != y.get(); }
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 template<typename T, typename D,
kono
parents:
diff changeset
311 typename U, typename E>
kono
parents:
diff changeset
312 inline bool
kono
parents:
diff changeset
313 operator< (const detail::unique_ptr_base<T, D> &x,
kono
parents:
diff changeset
314 const detail::unique_ptr_base<U, E> &y)
kono
parents:
diff changeset
315 { return x.get() < y.get (); }
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 template<typename T, typename D,
kono
parents:
diff changeset
318 typename U, typename E>
kono
parents:
diff changeset
319 inline bool
kono
parents:
diff changeset
320 operator<= (const detail::unique_ptr_base<T, D> &x,
kono
parents:
diff changeset
321 const detail::unique_ptr_base<U, E> &y)
kono
parents:
diff changeset
322 { return !(y < x); }
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 template<typename T, typename D,
kono
parents:
diff changeset
325 typename U, typename E>
kono
parents:
diff changeset
326 inline bool
kono
parents:
diff changeset
327 operator> (const detail::unique_ptr_base<T, D> &x,
kono
parents:
diff changeset
328 const detail::unique_ptr_base<U, E> &y)
kono
parents:
diff changeset
329 { return y < x; }
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 template<typename T, typename D,
kono
parents:
diff changeset
332 typename U, typename E>
kono
parents:
diff changeset
333 inline bool
kono
parents:
diff changeset
334 operator>= (const detail::unique_ptr_base<T, D> &x,
kono
parents:
diff changeset
335 const detail::unique_ptr_base<U, E> &y)
kono
parents:
diff changeset
336 { return !(x < y); }
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 /* std::move "emulation". This is as simple as it can be -- no
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
339 attempt is made to emulate rvalue references. This relies on T
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
340 having move semantics like std::auto_ptr.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
341 I.e., copy/assignment actually moves. */
111
kono
parents:
diff changeset
342
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
343 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
344 const T&
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
345 move (T& v)
111
kono
parents:
diff changeset
346 {
kono
parents:
diff changeset
347 return v;
kono
parents:
diff changeset
348 }
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 #endif /* C++11 */
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 /* Define gnu::unique_xmalloc_ptr, a gnu::unique_ptr that manages
kono
parents:
diff changeset
353 xmalloc'ed memory. */
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 /* The deleter for gnu::unique_xmalloc_ptr. Uses free. */
kono
parents:
diff changeset
356 template <typename T>
kono
parents:
diff changeset
357 struct xmalloc_deleter
kono
parents:
diff changeset
358 {
kono
parents:
diff changeset
359 void operator() (T *ptr) const { free (ptr); }
kono
parents:
diff changeset
360 };
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 /* Same, for arrays. */
kono
parents:
diff changeset
363 template <typename T>
kono
parents:
diff changeset
364 struct xmalloc_deleter<T[]>
kono
parents:
diff changeset
365 {
kono
parents:
diff changeset
366 void operator() (T *ptr) const { free (ptr); }
kono
parents:
diff changeset
367 };
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 #if __cplusplus >= 201103
kono
parents:
diff changeset
370
kono
parents:
diff changeset
371 /* In C++11, we just import the standard unique_ptr to our namespace
kono
parents:
diff changeset
372 with a custom deleter. */
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 template<typename T> using unique_xmalloc_ptr
kono
parents:
diff changeset
375 = std::unique_ptr<T, xmalloc_deleter<T>>;
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 #else /* C++11 */
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 /* In C++03, we don't have template aliases, so we need to define a
kono
parents:
diff changeset
380 subclass instead, and re-define the constructors, because C++03
kono
parents:
diff changeset
381 doesn't support inheriting constructors either. */
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 template <typename T>
kono
parents:
diff changeset
384 class unique_xmalloc_ptr : public unique_ptr<T, xmalloc_deleter<T> >
kono
parents:
diff changeset
385 {
kono
parents:
diff changeset
386 typedef unique_ptr<T, xmalloc_deleter<T> > base_type;
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 DEFINE_GNU_UNIQUE_PTR (unique_xmalloc_ptr)
kono
parents:
diff changeset
389 };
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 /* Define gnu::unique_xmalloc_ptr specialization for T[]. */
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 template <typename T>
kono
parents:
diff changeset
394 class unique_xmalloc_ptr<T[]> : public unique_ptr<T[], xmalloc_deleter<T[]> >
kono
parents:
diff changeset
395 {
kono
parents:
diff changeset
396 typedef unique_ptr<T[], xmalloc_deleter<T[]> > base_type;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 DEFINE_GNU_UNIQUE_PTR (unique_xmalloc_ptr)
kono
parents:
diff changeset
399 };
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 #endif /* C++11 */
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 } /* namespace gnu */
kono
parents:
diff changeset
404
kono
parents:
diff changeset
405 #endif /* GNU_UNIQUE_PTR_H */