]>
Commit | Line | Data |
---|---|---|
7c673cae | 1 | /* |
b32b8144 FG |
2 | Copyright 2012-2015 Glen Joseph Fernandes |
3 | (glenjofe@gmail.com) | |
7c673cae | 4 | |
b32b8144 FG |
5 | Distributed under the Boost Software License, Version 1.0. |
6 | (http://www.boost.org/LICENSE_1_0.txt) | |
7c673cae FG |
7 | */ |
8 | #ifndef BOOST_SMART_PTR_MAKE_UNIQUE_HPP | |
9 | #define BOOST_SMART_PTR_MAKE_UNIQUE_HPP | |
10 | ||
11 | #include <boost/config.hpp> | |
12 | #include <memory> | |
13 | #include <utility> | |
14 | ||
15 | namespace boost { | |
16 | namespace detail { | |
b32b8144 | 17 | |
7c673cae FG |
18 | template<class T> |
19 | struct up_if_object { | |
20 | typedef std::unique_ptr<T> type; | |
21 | }; | |
22 | ||
23 | template<class T> | |
24 | struct up_if_object<T[]> { }; | |
25 | ||
26 | template<class T, std::size_t N> | |
27 | struct up_if_object<T[N]> { }; | |
28 | ||
29 | template<class T> | |
30 | struct up_if_array { }; | |
31 | ||
32 | template<class T> | |
33 | struct up_if_array<T[]> { | |
34 | typedef std::unique_ptr<T[]> type; | |
35 | }; | |
36 | ||
37 | template<class T> | |
38 | struct up_remove_reference { | |
39 | typedef T type; | |
40 | }; | |
41 | ||
42 | template<class T> | |
43 | struct up_remove_reference<T&> { | |
44 | typedef T type; | |
45 | }; | |
46 | ||
47 | template<class T> | |
48 | struct up_remove_reference<T&&> { | |
49 | typedef T type; | |
50 | }; | |
51 | ||
52 | template<class T> | |
53 | struct up_element { }; | |
54 | ||
55 | template<class T> | |
56 | struct up_element<T[]> { | |
57 | typedef T type; | |
58 | }; | |
b32b8144 | 59 | |
7c673cae FG |
60 | } /* detail */ |
61 | ||
62 | template<class T> | |
b32b8144 FG |
63 | inline typename detail::up_if_object<T>::type |
64 | make_unique() | |
7c673cae FG |
65 | { |
66 | return std::unique_ptr<T>(new T()); | |
67 | } | |
68 | ||
69 | #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) | |
70 | template<class T, class... Args> | |
71 | inline typename detail::up_if_object<T>::type | |
b32b8144 | 72 | make_unique(Args&&... args) |
7c673cae FG |
73 | { |
74 | return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); | |
75 | } | |
76 | #endif | |
77 | ||
78 | template<class T> | |
79 | inline typename detail::up_if_object<T>::type | |
b32b8144 | 80 | make_unique(typename detail::up_remove_reference<T>::type&& value) |
7c673cae FG |
81 | { |
82 | return std::unique_ptr<T>(new T(std::move(value))); | |
83 | } | |
84 | ||
85 | template<class T> | |
b32b8144 FG |
86 | inline typename detail::up_if_object<T>::type |
87 | make_unique_noinit() | |
7c673cae FG |
88 | { |
89 | return std::unique_ptr<T>(new T); | |
90 | } | |
91 | ||
92 | template<class T> | |
b32b8144 FG |
93 | inline typename detail::up_if_array<T>::type |
94 | make_unique(std::size_t size) | |
7c673cae | 95 | { |
b32b8144 FG |
96 | return std::unique_ptr<T>(new typename |
97 | detail::up_element<T>::type[size]()); | |
7c673cae FG |
98 | } |
99 | ||
100 | template<class T> | |
101 | inline typename detail::up_if_array<T>::type | |
b32b8144 | 102 | make_unique_noinit(std::size_t size) |
7c673cae | 103 | { |
b32b8144 FG |
104 | return std::unique_ptr<T>(new typename |
105 | detail::up_element<T>::type[size]); | |
7c673cae | 106 | } |
b32b8144 | 107 | |
7c673cae FG |
108 | } /* boost */ |
109 | ||
110 | #endif |