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