]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/smart_ptr/include/boost/smart_ptr/make_unique.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / smart_ptr / include / boost / smart_ptr / make_unique.hpp
CommitLineData
7c673cae
FG
1/*
2(c) 2014-2015 Glen Joseph Fernandes
3<glenjofe -at- gmail.com>
4
5Distributed under the Boost Software
6License, Version 1.0.
7http://boost.org/LICENSE_1_0.txt
8*/
9#ifndef BOOST_SMART_PTR_MAKE_UNIQUE_HPP
10#define BOOST_SMART_PTR_MAKE_UNIQUE_HPP
11
12#include <boost/config.hpp>
13#include <memory>
14#include <utility>
15
16namespace boost {
17namespace detail {
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};
59} /* detail */
60
61template<class T>
62inline typename detail::up_if_object<T>::type make_unique()
63{
64 return std::unique_ptr<T>(new T());
65}
66
67#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
68template<class T, class... Args>
69inline typename detail::up_if_object<T>::type
70 make_unique(Args&&... args)
71{
72 return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
73}
74#endif
75
76template<class T>
77inline typename detail::up_if_object<T>::type
78 make_unique(typename detail::up_remove_reference<T>::type&& value)
79{
80 return std::unique_ptr<T>(new T(std::move(value)));
81}
82
83template<class T>
84inline typename detail::up_if_object<T>::type make_unique_noinit()
85{
86 return std::unique_ptr<T>(new T);
87}
88
89template<class T>
90inline typename detail::up_if_array<T>::type make_unique(std::size_t n)
91{
92 return std::unique_ptr<T>(new
93 typename detail::up_element<T>::type[n]());
94}
95
96template<class T>
97inline typename detail::up_if_array<T>::type
98 make_unique_noinit(std::size_t n)
99{
100 return std::unique_ptr<T>(new
101 typename detail::up_element<T>::type[n]);
102}
103} /* boost */
104
105#endif