1 /*
2 Copyright 2012-2019 Glen Joseph Fernandes
3 (glenjofe@gmail.com)
4 
5 Distributed under the Boost Software License, Version 1.0.
6 (http://www.boost.org/LICENSE_1_0.txt)
7 */
8 #ifndef BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
9 #define BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
10 
11 #include <boost/core/default_allocator.hpp>
12 #include <boost/smart_ptr/allocate_shared_array.hpp>
13 
14 namespace boost {
15 
16 template<class T>
17 inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
make_shared()18 make_shared()
19 {
20     return boost::allocate_shared<T>(boost::default_allocator<typename
21         detail::sp_array_element<T>::type>());
22 }
23 
24 template<class T>
25 inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
make_shared(const typename remove_extent<T>::type & value)26 make_shared(const typename remove_extent<T>::type& value)
27 {
28     return boost::allocate_shared<T>(boost::default_allocator<typename
29         detail::sp_array_element<T>::type>(), value);
30 }
31 
32 template<class T>
33 inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
make_shared(std::size_t size)34 make_shared(std::size_t size)
35 {
36     return boost::allocate_shared<T>(boost::default_allocator<typename
37         detail::sp_array_element<T>::type>(), size);
38 }
39 
40 template<class T>
41 inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
make_shared(std::size_t size,const typename remove_extent<T>::type & value)42 make_shared(std::size_t size, const typename remove_extent<T>::type& value)
43 {
44     return boost::allocate_shared<T>(boost::default_allocator<typename
45         detail::sp_array_element<T>::type>(), size, value);
46 }
47 
48 template<class T>
49 inline typename enable_if_<is_bounded_array<T>::value, shared_ptr<T> >::type
make_shared_noinit()50 make_shared_noinit()
51 {
52     return boost::allocate_shared_noinit<T>(boost::default_allocator<typename
53         detail::sp_array_element<T>::type>());
54 }
55 
56 template<class T>
57 inline typename enable_if_<is_unbounded_array<T>::value, shared_ptr<T> >::type
make_shared_noinit(std::size_t size)58 make_shared_noinit(std::size_t size)
59 {
60     return boost::allocate_shared_noinit<T>(boost::default_allocator<typename
61         detail::sp_array_element<T>::type>(), size);
62 }
63 
64 } /* boost */
65 
66 #endif
67