]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/smart_ptr/make_unique.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / smart_ptr / make_unique.hpp
CommitLineData
7c673cae 1/*
b32b8144
FG
2Copyright 2012-2015 Glen Joseph Fernandes
3(glenjofe@gmail.com)
7c673cae 4
b32b8144
FG
5Distributed 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
15namespace boost {
16namespace detail {
b32b8144 17
7c673cae
FG
18template<class T>
19struct up_if_object {
20 typedef std::unique_ptr<T> type;
21};
22
23template<class T>
24struct up_if_object<T[]> { };
25
26template<class T, std::size_t N>
27struct up_if_object<T[N]> { };
28
29template<class T>
30struct up_if_array { };
31
32template<class T>
33struct up_if_array<T[]> {
34 typedef std::unique_ptr<T[]> type;
35};
36
37template<class T>
38struct up_remove_reference {
39 typedef T type;
40};
41
42template<class T>
43struct up_remove_reference<T&> {
44 typedef T type;
45};
46
47template<class T>
48struct up_remove_reference<T&&> {
49 typedef T type;
50};
51
52template<class T>
53struct up_element { };
54
55template<class T>
56struct up_element<T[]> {
57 typedef T type;
58};
b32b8144 59
7c673cae
FG
60} /* detail */
61
62template<class T>
b32b8144
FG
63inline typename detail::up_if_object<T>::type
64make_unique()
7c673cae
FG
65{
66 return std::unique_ptr<T>(new T());
67}
68
69#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
70template<class T, class... Args>
71inline typename detail::up_if_object<T>::type
b32b8144 72make_unique(Args&&... args)
7c673cae
FG
73{
74 return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
75}
76#endif
77
78template<class T>
79inline typename detail::up_if_object<T>::type
b32b8144 80make_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
85template<class T>
b32b8144
FG
86inline typename detail::up_if_object<T>::type
87make_unique_noinit()
7c673cae
FG
88{
89 return std::unique_ptr<T>(new T);
90}
91
92template<class T>
b32b8144
FG
93inline typename detail::up_if_array<T>::type
94make_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
100template<class T>
101inline typename detail::up_if_array<T>::type
b32b8144 102make_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