libstdc++
unique_ptr.h
Go to the documentation of this file.
1 // unique_ptr implementation -*- C++ -*-
2 
3 // Copyright (C) 2008-2016 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file bits/unique_ptr.h
26  * This is an internal header file, included by other library headers.
27  * Do not attempt to use it directly. @headername{memory}
28  */
29 
30 #ifndef _UNIQUE_PTR_H
31 #define _UNIQUE_PTR_H 1
32 
33 #include <bits/c++config.h>
34 #include <debug/assertions.h>
35 #include <type_traits>
36 #include <utility>
37 #include <tuple>
38 
39 namespace std _GLIBCXX_VISIBILITY(default)
40 {
41 _GLIBCXX_BEGIN_NAMESPACE_VERSION
42 
43  /**
44  * @addtogroup pointer_abstractions
45  * @{
46  */
47 
48 #if _GLIBCXX_USE_DEPRECATED
49  template<typename> class auto_ptr;
50 #endif
51 
52  /// Primary template of default_delete, used by unique_ptr
53  template<typename _Tp>
55  {
56  /// Default constructor
57  constexpr default_delete() noexcept = default;
58 
59  /** @brief Converting constructor.
60  *
61  * Allows conversion from a deleter for arrays of another type, @p _Up,
62  * only if @p _Up* is convertible to @p _Tp*.
63  */
64  template<typename _Up, typename = typename
65  enable_if<is_convertible<_Up*, _Tp*>::value>::type>
66  default_delete(const default_delete<_Up>&) noexcept { }
67 
68  /// Calls @c delete @p __ptr
69  void
70  operator()(_Tp* __ptr) const
71  {
72  static_assert(!is_void<_Tp>::value,
73  "can't delete pointer to incomplete type");
74  static_assert(sizeof(_Tp)>0,
75  "can't delete pointer to incomplete type");
76  delete __ptr;
77  }
78  };
79 
80  // _GLIBCXX_RESOLVE_LIB_DEFECTS
81  // DR 740 - omit specialization for array objects with a compile time length
82  /// Specialization for arrays, default_delete.
83  template<typename _Tp>
84  struct default_delete<_Tp[]>
85  {
86  public:
87  /// Default constructor
88  constexpr default_delete() noexcept = default;
89 
90  /** @brief Converting constructor.
91  *
92  * Allows conversion from a deleter for arrays of another type, such as
93  * a const-qualified version of @p _Tp.
94  *
95  * Conversions from types derived from @c _Tp are not allowed because
96  * it is unsafe to @c delete[] an array of derived types through a
97  * pointer to the base type.
98  */
99  template<typename _Up, typename = typename
100  enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value>::type>
101  default_delete(const default_delete<_Up[]>&) noexcept { }
102 
103  /// Calls @c delete[] @p __ptr
104  template<typename _Up>
105  typename enable_if<is_convertible<_Up(*)[], _Tp(*)[]>::value>::type
106  operator()(_Up* __ptr) const
107  {
108  static_assert(sizeof(_Tp)>0,
109  "can't delete pointer to incomplete type");
110  delete [] __ptr;
111  }
112  };
113 
114  /// 20.7.1.2 unique_ptr for single objects.
115  template <typename _Tp, typename _Dp = default_delete<_Tp> >
117  {
118  // use SFINAE to determine whether _Del::pointer exists
119  class _Pointer
120  {
121  template<typename _Up>
122  static typename _Up::pointer __test(typename _Up::pointer*);
123 
124  template<typename _Up>
125  static _Tp* __test(...);
126 
127  typedef typename remove_reference<_Dp>::type _Del;
128 
129  public:
130  typedef decltype(__test<_Del>(0)) type;
131  };
132 
134  __tuple_type _M_t;
135 
136  public:
137  typedef typename _Pointer::type pointer;
138  typedef _Tp element_type;
139  typedef _Dp deleter_type;
140 
141 
142  // helper template for detecting a safe conversion from another
143  // unique_ptr
144  template<typename _Up, typename _Ep>
145  using __safe_conversion_up = __and_<
146  is_convertible<typename unique_ptr<_Up, _Ep>::pointer, pointer>,
147  __not_<is_array<_Up>>,
148  __or_<__and_<is_reference<deleter_type>,
149  is_same<deleter_type, _Ep>>,
150  __and_<__not_<is_reference<deleter_type>>,
151  is_convertible<_Ep, deleter_type>>
152  >
153  >;
154 
155  // Constructors.
156 
157  /// Default constructor, creates a unique_ptr that owns nothing.
158  constexpr unique_ptr() noexcept
159  : _M_t()
160  { static_assert(!is_pointer<deleter_type>::value,
161  "constructed with null function pointer deleter"); }
162 
163  /** Takes ownership of a pointer.
164  *
165  * @param __p A pointer to an object of @c element_type
166  *
167  * The deleter will be value-initialized.
168  */
169  explicit
170  unique_ptr(pointer __p) noexcept
171  : _M_t()
172  {
173  std::get<0>(_M_t) = __p;
174  static_assert(!is_pointer<deleter_type>::value,
175  "constructed with null function pointer deleter");
176  }
177 
178  /** Takes ownership of a pointer.
179  *
180  * @param __p A pointer to an object of @c element_type
181  * @param __d A reference to a deleter.
182  *
183  * The deleter will be initialized with @p __d
184  */
185  unique_ptr(pointer __p,
186  typename conditional<is_reference<deleter_type>::value,
187  deleter_type, const deleter_type&>::type __d) noexcept
188  : _M_t(__p, __d) { }
189 
190  /** Takes ownership of a pointer.
191  *
192  * @param __p A pointer to an object of @c element_type
193  * @param __d An rvalue reference to a deleter.
194  *
195  * The deleter will be initialized with @p std::move(__d)
196  */
197  unique_ptr(pointer __p,
198  typename remove_reference<deleter_type>::type&& __d) noexcept
199  : _M_t(std::move(__p), std::move(__d))
201  "rvalue deleter bound to reference"); }
202 
203  /// Creates a unique_ptr that owns nothing.
204  constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }
205 
206  // Move constructors.
207 
208  /// Move constructor.
209  unique_ptr(unique_ptr&& __u) noexcept
210  : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
211 
212  /** @brief Converting constructor from another type
213  *
214  * Requires that the pointer owned by @p __u is convertible to the
215  * type of pointer owned by this object, @p __u does not own an array,
216  * and @p __u has a compatible deleter type.
217  */
218  template<typename _Up, typename _Ep, typename = _Require<
219  __safe_conversion_up<_Up, _Ep>,
220  typename conditional<is_reference<_Dp>::value,
221  is_same<_Ep, _Dp>,
222  is_convertible<_Ep, _Dp>>::type>>
224  : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
225  { }
226 
227 #if _GLIBCXX_USE_DEPRECATED
228  /// Converting constructor from @c auto_ptr
229  template<typename _Up, typename = _Require<
230  is_convertible<_Up*, _Tp*>, is_same<_Dp, default_delete<_Tp>>>>
231  unique_ptr(auto_ptr<_Up>&& __u) noexcept;
232 #endif
233 
234  /// Destructor, invokes the deleter if the stored pointer is not null.
235  ~unique_ptr() noexcept
236  {
237  auto& __ptr = std::get<0>(_M_t);
238  if (__ptr != nullptr)
239  get_deleter()(__ptr);
240  __ptr = pointer();
241  }
242 
243  // Assignment.
244 
245  /** @brief Move assignment operator.
246  *
247  * @param __u The object to transfer ownership from.
248  *
249  * Invokes the deleter first if this object owns a pointer.
250  */
251  unique_ptr&
252  operator=(unique_ptr&& __u) noexcept
253  {
254  reset(__u.release());
255  get_deleter() = std::forward<deleter_type>(__u.get_deleter());
256  return *this;
257  }
258 
259  /** @brief Assignment from another type.
260  *
261  * @param __u The object to transfer ownership from, which owns a
262  * convertible pointer to a non-array object.
263  *
264  * Invokes the deleter first if this object owns a pointer.
265  */
266  template<typename _Up, typename _Ep>
267  typename enable_if< __and_<
268  __safe_conversion_up<_Up, _Ep>,
269  is_assignable<deleter_type&, _Ep&&>
270  >::value,
271  unique_ptr&>::type
273  {
274  reset(__u.release());
275  get_deleter() = std::forward<_Ep>(__u.get_deleter());
276  return *this;
277  }
278 
279  /// Reset the %unique_ptr to empty, invoking the deleter if necessary.
280  unique_ptr&
281  operator=(nullptr_t) noexcept
282  {
283  reset();
284  return *this;
285  }
286 
287  // Observers.
288 
289  /// Dereference the stored pointer.
290  typename add_lvalue_reference<element_type>::type
291  operator*() const
292  {
293  __glibcxx_assert(get() != pointer());
294  return *get();
295  }
296 
297  /// Return the stored pointer.
298  pointer
299  operator->() const noexcept
300  {
301  _GLIBCXX_DEBUG_PEDASSERT(get() != pointer());
302  return get();
303  }
304 
305  /// Return the stored pointer.
306  pointer
307  get() const noexcept
308  { return std::get<0>(_M_t); }
309 
310  /// Return a reference to the stored deleter.
311  deleter_type&
312  get_deleter() noexcept
313  { return std::get<1>(_M_t); }
314 
315  /// Return a reference to the stored deleter.
316  const deleter_type&
317  get_deleter() const noexcept
318  { return std::get<1>(_M_t); }
319 
320  /// Return @c true if the stored pointer is not null.
321  explicit operator bool() const noexcept
322  { return get() == pointer() ? false : true; }
323 
324  // Modifiers.
325 
326  /// Release ownership of any stored pointer.
327  pointer
328  release() noexcept
329  {
330  pointer __p = get();
331  std::get<0>(_M_t) = pointer();
332  return __p;
333  }
334 
335  /** @brief Replace the stored pointer.
336  *
337  * @param __p The new pointer to store.
338  *
339  * The deleter will be invoked if a pointer is already owned.
340  */
341  void
342  reset(pointer __p = pointer()) noexcept
343  {
344  using std::swap;
345  swap(std::get<0>(_M_t), __p);
346  if (__p != pointer())
347  get_deleter()(__p);
348  }
349 
350  /// Exchange the pointer and deleter with another object.
351  void
352  swap(unique_ptr& __u) noexcept
353  {
354  using std::swap;
355  swap(_M_t, __u._M_t);
356  }
357 
358  // Disable copy from lvalue.
359  unique_ptr(const unique_ptr&) = delete;
360  unique_ptr& operator=(const unique_ptr&) = delete;
361  };
362 
363  /// 20.7.1.3 unique_ptr for array objects with a runtime length
364  // [unique.ptr.runtime]
365  // _GLIBCXX_RESOLVE_LIB_DEFECTS
366  // DR 740 - omit specialization for array objects with a compile time length
367  template<typename _Tp, typename _Dp>
368  class unique_ptr<_Tp[], _Dp>
369  {
370  // use SFINAE to determine whether _Del::pointer exists
371  class _Pointer
372  {
373  template<typename _Up>
374  static typename _Up::pointer __test(typename _Up::pointer*);
375 
376  template<typename _Up>
377  static _Tp* __test(...);
378 
379  typedef typename remove_reference<_Dp>::type _Del;
380 
381  public:
382  typedef decltype(__test<_Del>(0)) type;
383  };
384 
385  typedef std::tuple<typename _Pointer::type, _Dp> __tuple_type;
386  __tuple_type _M_t;
387 
388  template<typename _Up>
389  using __remove_cv = typename remove_cv<_Up>::type;
390 
391  // like is_base_of<_Tp, _Up> but false if unqualified types are the same
392  template<typename _Up>
393  using __is_derived_Tp
394  = __and_< is_base_of<_Tp, _Up>,
395  __not_<is_same<__remove_cv<_Tp>, __remove_cv<_Up>>> >;
396 
397 
398  public:
399  typedef typename _Pointer::type pointer;
400  typedef _Tp element_type;
401  typedef _Dp deleter_type;
402 
403  // helper template for detecting a safe conversion from another
404  // unique_ptr
405  template<typename _Up, typename _Ep,
406  typename _Up_up = unique_ptr<_Up, _Ep>,
407  typename _Up_element_type = typename _Up_up::element_type>
408  using __safe_conversion_up = __and_<
410  is_same<pointer, element_type*>,
411  is_same<typename _Up_up::pointer, _Up_element_type*>,
412  is_convertible<_Up_element_type(*)[], element_type(*)[]>,
413  __or_<__and_<is_reference<deleter_type>, is_same<deleter_type, _Ep>>,
414  __and_<__not_<is_reference<deleter_type>>,
415  is_convertible<_Ep, deleter_type>>>
416  >;
417 
418  // helper template for detecting a safe conversion from a raw pointer
419  template<typename _Up>
420  using __safe_conversion_raw = __and_<
421  __or_<__or_<is_same<_Up, pointer>,
422  is_same<_Up, nullptr_t>>,
423  __and_<is_pointer<_Up>,
424  is_same<pointer, element_type*>,
425  is_convertible<
426  typename remove_pointer<_Up>::type(*)[],
427  element_type(*)[]>
428  >
429  >
430  >;
431 
432  // Constructors.
433 
434  /// Default constructor, creates a unique_ptr that owns nothing.
435  constexpr unique_ptr() noexcept
436  : _M_t()
437  { static_assert(!std::is_pointer<deleter_type>::value,
438  "constructed with null function pointer deleter"); }
439 
440  /** Takes ownership of a pointer.
441  *
442  * @param __p A pointer to an array of a type safely convertible
443  * to an array of @c element_type
444  *
445  * The deleter will be value-initialized.
446  */
447  template<typename _Up,
448  typename = typename enable_if<
449  __safe_conversion_raw<_Up>::value, bool>::type>
450  explicit
451  unique_ptr(_Up __p) noexcept
452  : _M_t(__p, deleter_type())
453  { static_assert(!is_pointer<deleter_type>::value,
454  "constructed with null function pointer deleter"); }
455 
456  /** Takes ownership of a pointer.
457  *
458  * @param __p A pointer to an array of a type safely convertible
459  * to an array of @c element_type
460  * @param __d A reference to a deleter.
461  *
462  * The deleter will be initialized with @p __d
463  */
464  template<typename _Up,
465  typename = typename enable_if<
466  __safe_conversion_raw<_Up>::value, bool>::type>
467  unique_ptr(_Up __p,
468  typename conditional<is_reference<deleter_type>::value,
469  deleter_type, const deleter_type&>::type __d) noexcept
470  : _M_t(__p, __d) { }
471 
472  /** Takes ownership of a pointer.
473  *
474  * @param __p A pointer to an array of a type safely convertible
475  * to an array of @c element_type
476  * @param __d A reference to a deleter.
477  *
478  * The deleter will be initialized with @p std::move(__d)
479  */
480  template<typename _Up,
481  typename = typename enable_if<
482  __safe_conversion_raw<_Up>::value, bool>::type>
483  unique_ptr(_Up __p, typename
484  remove_reference<deleter_type>::type&& __d) noexcept
485  : _M_t(std::move(__p), std::move(__d))
486  { static_assert(!is_reference<deleter_type>::value,
487  "rvalue deleter bound to reference"); }
488 
489  /// Move constructor.
490  unique_ptr(unique_ptr&& __u) noexcept
491  : _M_t(__u.release(), std::forward<deleter_type>(__u.get_deleter())) { }
492 
493  /// Creates a unique_ptr that owns nothing.
494  constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }
495 
496  template<typename _Up, typename _Ep,
497  typename = _Require<__safe_conversion_up<_Up, _Ep>>>
498  unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
499  : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter()))
500  { }
501 
502  /// Destructor, invokes the deleter if the stored pointer is not null.
504  {
505  auto& __ptr = std::get<0>(_M_t);
506  if (__ptr != nullptr)
507  get_deleter()(__ptr);
508  __ptr = pointer();
509  }
510 
511  // Assignment.
512 
513  /** @brief Move assignment operator.
514  *
515  * @param __u The object to transfer ownership from.
516  *
517  * Invokes the deleter first if this object owns a pointer.
518  */
519  unique_ptr&
520  operator=(unique_ptr&& __u) noexcept
521  {
522  reset(__u.release());
523  get_deleter() = std::forward<deleter_type>(__u.get_deleter());
524  return *this;
525  }
526 
527  /** @brief Assignment from another type.
528  *
529  * @param __u The object to transfer ownership from, which owns a
530  * convertible pointer to an array object.
531  *
532  * Invokes the deleter first if this object owns a pointer.
533  */
534  template<typename _Up, typename _Ep>
535  typename
536  enable_if<__and_<__safe_conversion_up<_Up, _Ep>,
537  is_assignable<deleter_type&, _Ep&&>
538  >::value,
539  unique_ptr&>::type
541  {
542  reset(__u.release());
543  get_deleter() = std::forward<_Ep>(__u.get_deleter());
544  return *this;
545  }
546 
547  /// Reset the %unique_ptr to empty, invoking the deleter if necessary.
548  unique_ptr&
549  operator=(nullptr_t) noexcept
550  {
551  reset();
552  return *this;
553  }
554 
555  // Observers.
556 
557  /// Access an element of owned array.
558  typename std::add_lvalue_reference<element_type>::type
559  operator[](size_t __i) const
560  {
561  __glibcxx_assert(get() != pointer());
562  return get()[__i];
563  }
564 
565  /// Return the stored pointer.
566  pointer
567  get() const noexcept
568  { return std::get<0>(_M_t); }
569 
570  /// Return a reference to the stored deleter.
571  deleter_type&
572  get_deleter() noexcept
573  { return std::get<1>(_M_t); }
574 
575  /// Return a reference to the stored deleter.
576  const deleter_type&
577  get_deleter() const noexcept
578  { return std::get<1>(_M_t); }
579 
580  /// Return @c true if the stored pointer is not null.
581  explicit operator bool() const noexcept
582  { return get() == pointer() ? false : true; }
583 
584  // Modifiers.
585 
586  /// Release ownership of any stored pointer.
587  pointer
588  release() noexcept
589  {
590  pointer __p = get();
591  std::get<0>(_M_t) = pointer();
592  return __p;
593  }
594 
595  /** @brief Replace the stored pointer.
596  *
597  * @param __p The new pointer to store.
598  *
599  * The deleter will be invoked if a pointer is already owned.
600  */
601  template <typename _Up,
602  typename = _Require<
603  __or_<is_same<_Up, pointer>,
604  __and_<is_same<pointer, element_type*>,
606  is_convertible<
607  typename remove_pointer<_Up>::type(*)[],
608  element_type(*)[]
609  >
610  >
611  >
612  >>
613  void
614  reset(_Up __p) noexcept
615  {
616  pointer __ptr = __p;
617  using std::swap;
618  swap(std::get<0>(_M_t), __ptr);
619  if (__ptr != nullptr)
620  get_deleter()(__ptr);
621  }
622 
623  void reset(nullptr_t = nullptr) noexcept
624  {
625  reset(pointer());
626  }
627 
628  /// Exchange the pointer and deleter with another object.
629  void
630  swap(unique_ptr& __u) noexcept
631  {
632  using std::swap;
633  swap(_M_t, __u._M_t);
634  }
635 
636  // Disable copy from lvalue.
637  unique_ptr(const unique_ptr&) = delete;
638  unique_ptr& operator=(const unique_ptr&) = delete;
639  };
640 
641  template<typename _Tp, typename _Dp>
642  inline void
643  swap(unique_ptr<_Tp, _Dp>& __x,
644  unique_ptr<_Tp, _Dp>& __y) noexcept
645  { __x.swap(__y); }
646 
647  template<typename _Tp, typename _Dp,
648  typename _Up, typename _Ep>
649  inline bool
650  operator==(const unique_ptr<_Tp, _Dp>& __x,
651  const unique_ptr<_Up, _Ep>& __y)
652  { return __x.get() == __y.get(); }
653 
654  template<typename _Tp, typename _Dp>
655  inline bool
656  operator==(const unique_ptr<_Tp, _Dp>& __x, nullptr_t) noexcept
657  { return !__x; }
658 
659  template<typename _Tp, typename _Dp>
660  inline bool
661  operator==(nullptr_t, const unique_ptr<_Tp, _Dp>& __x) noexcept
662  { return !__x; }
663 
664  template<typename _Tp, typename _Dp,
665  typename _Up, typename _Ep>
666  inline bool
667  operator!=(const unique_ptr<_Tp, _Dp>& __x,
668  const unique_ptr<_Up, _Ep>& __y)
669  { return __x.get() != __y.get(); }
670 
671  template<typename _Tp, typename _Dp>
672  inline bool
673  operator!=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t) noexcept
674  { return (bool)__x; }
675 
676  template<typename _Tp, typename _Dp>
677  inline bool
678  operator!=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x) noexcept
679  { return (bool)__x; }
680 
681  template<typename _Tp, typename _Dp,
682  typename _Up, typename _Ep>
683  inline bool
684  operator<(const unique_ptr<_Tp, _Dp>& __x,
685  const unique_ptr<_Up, _Ep>& __y)
686  {
687  typedef typename
688  std::common_type<typename unique_ptr<_Tp, _Dp>::pointer,
689  typename unique_ptr<_Up, _Ep>::pointer>::type _CT;
690  return std::less<_CT>()(__x.get(), __y.get());
691  }
692 
693  template<typename _Tp, typename _Dp>
694  inline bool
695  operator<(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
697  nullptr); }
698 
699  template<typename _Tp, typename _Dp>
700  inline bool
701  operator<(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
703  __x.get()); }
704 
705  template<typename _Tp, typename _Dp,
706  typename _Up, typename _Ep>
707  inline bool
708  operator<=(const unique_ptr<_Tp, _Dp>& __x,
709  const unique_ptr<_Up, _Ep>& __y)
710  { return !(__y < __x); }
711 
712  template<typename _Tp, typename _Dp>
713  inline bool
714  operator<=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
715  { return !(nullptr < __x); }
716 
717  template<typename _Tp, typename _Dp>
718  inline bool
719  operator<=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
720  { return !(__x < nullptr); }
721 
722  template<typename _Tp, typename _Dp,
723  typename _Up, typename _Ep>
724  inline bool
725  operator>(const unique_ptr<_Tp, _Dp>& __x,
726  const unique_ptr<_Up, _Ep>& __y)
727  { return (__y < __x); }
728 
729  template<typename _Tp, typename _Dp>
730  inline bool
731  operator>(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
733  __x.get()); }
734 
735  template<typename _Tp, typename _Dp>
736  inline bool
737  operator>(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
739  nullptr); }
740 
741  template<typename _Tp, typename _Dp,
742  typename _Up, typename _Ep>
743  inline bool
744  operator>=(const unique_ptr<_Tp, _Dp>& __x,
745  const unique_ptr<_Up, _Ep>& __y)
746  { return !(__x < __y); }
747 
748  template<typename _Tp, typename _Dp>
749  inline bool
750  operator>=(const unique_ptr<_Tp, _Dp>& __x, nullptr_t)
751  { return !(__x < nullptr); }
752 
753  template<typename _Tp, typename _Dp>
754  inline bool
755  operator>=(nullptr_t, const unique_ptr<_Tp, _Dp>& __x)
756  { return !(nullptr < __x); }
757 
758  /// std::hash specialization for unique_ptr.
759  template<typename _Tp, typename _Dp>
760  struct hash<unique_ptr<_Tp, _Dp>>
761  : public __hash_base<size_t, unique_ptr<_Tp, _Dp>>
762  {
763  size_t
764  operator()(const unique_ptr<_Tp, _Dp>& __u) const noexcept
765  {
766  typedef unique_ptr<_Tp, _Dp> _UP;
767  return std::hash<typename _UP::pointer>()(__u.get());
768  }
769  };
770 
771 #if __cplusplus > 201103L
772 
773 #define __cpp_lib_make_unique 201304
774 
775  template<typename _Tp>
776  struct _MakeUniq
777  { typedef unique_ptr<_Tp> __single_object; };
778 
779  template<typename _Tp>
780  struct _MakeUniq<_Tp[]>
781  { typedef unique_ptr<_Tp[]> __array; };
782 
783  template<typename _Tp, size_t _Bound>
784  struct _MakeUniq<_Tp[_Bound]>
785  { struct __invalid_type { }; };
786 
787  /// std::make_unique for single objects
788  template<typename _Tp, typename... _Args>
789  inline typename _MakeUniq<_Tp>::__single_object
790  make_unique(_Args&&... __args)
791  { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
792 
793  /// std::make_unique for arrays of unknown bound
794  template<typename _Tp>
795  inline typename _MakeUniq<_Tp>::__array
796  make_unique(size_t __num)
797  { return unique_ptr<_Tp>(new remove_extent_t<_Tp>[__num]()); }
798 
799  /// Disable std::make_unique for arrays of known bound
800  template<typename _Tp, typename... _Args>
801  inline typename _MakeUniq<_Tp>::__invalid_type
802  make_unique(_Args&&...) = delete;
803 #endif
804 
805  // @} group pointer_abstractions
806 
807 _GLIBCXX_END_NAMESPACE_VERSION
808 } // namespace
809 
810 #endif /* _UNIQUE_PTR_H */
void swap(unique_ptr &__u) noexcept
Exchange the pointer and deleter with another object.
Definition: unique_ptr.h:352
pointer release() noexcept
Release ownership of any stored pointer.
Definition: unique_ptr.h:328
constexpr unique_ptr() noexcept
Default constructor, creates a unique_ptr that owns nothing.
Definition: unique_ptr.h:435
unique_ptr(pointer __p, typename conditional< is_reference< deleter_type >::value, deleter_type, const deleter_type & >::type __d) noexcept
Definition: unique_ptr.h:185
~unique_ptr()
Destructor, invokes the deleter if the stored pointer is not null.
Definition: unique_ptr.h:503
is_reference
Definition: type_traits:577
default_delete(const default_delete< _Up[]> &) noexcept
Converting constructor.
Definition: unique_ptr.h:101
void swap(unique_ptr &__u) noexcept
Exchange the pointer and deleter with another object.
Definition: unique_ptr.h:630
enable_if< is_convertible< _Up(*)[], _Tp(*)[]>::value >::type operator()(_Up *__ptr) const
Calls delete[] __ptr.
Definition: unique_ptr.h:106
unique_ptr(_Up __p, typename remove_reference< deleter_type >::type &&__d) noexcept
Definition: unique_ptr.h:483
deleter_type & get_deleter() noexcept
Return a reference to the stored deleter.
Definition: unique_ptr.h:312
default_delete(const default_delete< _Up > &) noexcept
Converting constructor.
Definition: unique_ptr.h:66
unique_ptr & operator=(unique_ptr &&__u) noexcept
Move assignment operator.
Definition: unique_ptr.h:252
Primary template of default_delete, used by unique_ptr.
Definition: unique_ptr.h:54
enable_if< __and_< __safe_conversion_up< _Up, _Ep >, is_assignable< deleter_type &, _Ep && > >::value, unique_ptr & >::type operator=(unique_ptr< _Up, _Ep > &&__u) noexcept
Assignment from another type.
Definition: unique_ptr.h:540
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
Definition: move.h:76
unique_ptr(pointer __p) noexcept
Definition: unique_ptr.h:170
unique_ptr(_Up __p) noexcept
Definition: unique_ptr.h:451
pointer get() const noexcept
Return the stored pointer.
Definition: unique_ptr.h:307
constexpr unique_ptr(nullptr_t) noexcept
Creates a unique_ptr that owns nothing.
Definition: unique_ptr.h:204
unique_ptr & operator=(unique_ptr &&__u) noexcept
Move assignment operator.
Definition: unique_ptr.h:520
unique_ptr & operator=(nullptr_t) noexcept
Reset the unique_ptr to empty, invoking the deleter if necessary.
Definition: unique_ptr.h:549
A simple smart pointer providing strict ownership semantics.
Definition: auto_ptr.h:87
void operator()(_Tp *__ptr) const
Calls delete __ptr.
Definition: unique_ptr.h:70
const deleter_type & get_deleter() const noexcept
Return a reference to the stored deleter.
Definition: unique_ptr.h:317
constexpr unique_ptr(nullptr_t) noexcept
Creates a unique_ptr that owns nothing.
Definition: unique_ptr.h:494
pointer operator->() const noexcept
Return the stored pointer.
Definition: unique_ptr.h:299
enable_if< __and_< __safe_conversion_up< _Up, _Ep >, is_assignable< deleter_type &, _Ep && > >::value, unique_ptr & >::type operator=(unique_ptr< _Up, _Ep > &&__u) noexcept
Assignment from another type.
Definition: unique_ptr.h:272
std::add_lvalue_reference< element_type >::type operator[](size_t __i) const
Access an element of owned array.
Definition: unique_ptr.h:559
is_array
Definition: type_traits:356
constexpr default_delete() noexcept=default
Default constructor.
unique_ptr(pointer __p, typename remove_reference< deleter_type >::type &&__d) noexcept
Definition: unique_ptr.h:197
unique_ptr & operator=(nullptr_t) noexcept
Reset the unique_ptr to empty, invoking the deleter if necessary.
Definition: unique_ptr.h:281
pointer release() noexcept
Release ownership of any stored pointer.
Definition: unique_ptr.h:588
is_pointer
Definition: type_traits:377
const deleter_type & get_deleter() const noexcept
Return a reference to the stored deleter.
Definition: unique_ptr.h:577
unique_ptr(unique_ptr &&__u) noexcept
Move constructor.
Definition: unique_ptr.h:490
~unique_ptr() noexcept
Destructor, invokes the deleter if the stored pointer is not null.
Definition: unique_ptr.h:235
One of the comparison functors.
Definition: stl_function.h:340
unique_ptr(unique_ptr< _Up, _Ep > &&__u) noexcept
Converting constructor from another type.
Definition: unique_ptr.h:223
is_void
Definition: type_traits:211
unique_ptr(unique_ptr &&__u) noexcept
Move constructor.
Definition: unique_ptr.h:209
20.7.1.2 unique_ptr for single objects.
Definition: unique_ptr.h:116
add_lvalue_reference< element_type >::type operator*() const
Dereference the stored pointer.
Definition: unique_ptr.h:291
_MakeUniq< _Tp >::__single_object make_unique(_Args &&...__args)
std::make_unique for single objects
Definition: unique_ptr.h:790
unique_ptr(_Up __p, typename conditional< is_reference< deleter_type >::value, deleter_type, const deleter_type & >::type __d) noexcept
Definition: unique_ptr.h:467
constexpr unique_ptr() noexcept
Default constructor, creates a unique_ptr that owns nothing.
Definition: unique_ptr.h:158
_Del * get_deleter(const __shared_ptr< _Tp, _Lp > &__p) noexcept
20.7.2.2.10 shared_ptr get_deleter
ISO C++ entities toplevel namespace is std.
void reset(_Up __p) noexcept
Replace the stored pointer.
Definition: unique_ptr.h:614
Primary class template hash.
Definition: system_error:134
void reset(pointer __p=pointer()) noexcept
Replace the stored pointer.
Definition: unique_ptr.h:342
deleter_type & get_deleter() noexcept
Return a reference to the stored deleter.
Definition: unique_ptr.h:572