annotate DEPENDENCIES/generic/include/boost/smart_ptr/make_shared_array.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 /*
Chris@101 2 * Copyright (c) 2012-2014 Glen Joseph Fernandes
Chris@16 3 * glenfe at live dot com
Chris@16 4 *
Chris@16 5 * Distributed under the Boost Software License,
Chris@16 6 * Version 1.0. (See accompanying file LICENSE_1_0.txt
Chris@16 7 * or copy at http://boost.org/LICENSE_1_0.txt)
Chris@16 8 */
Chris@16 9 #ifndef BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
Chris@16 10 #define BOOST_SMART_PTR_MAKE_SHARED_ARRAY_HPP
Chris@16 11
Chris@101 12 #include <boost/smart_ptr/detail/array_count_impl.hpp>
Chris@16 13 #include <boost/smart_ptr/detail/sp_if_array.hpp>
Chris@16 14
Chris@16 15 namespace boost {
Chris@101 16 template<class T>
Chris@16 17 inline typename boost::detail::sp_if_array<T>::type
Chris@16 18 make_shared(std::size_t size) {
Chris@16 19 typedef typename boost::detail::array_inner<T>::type T1;
Chris@16 20 typedef typename boost::detail::array_base<T1>::type T2;
Chris@101 21 typedef boost::detail::ms_allocator<T> A1;
Chris@101 22 typedef boost::detail::ms_in_allocator_tag D1;
Chris@101 23 std::size_t n1 = size * boost::detail::array_total<T1>::size;
Chris@16 24 T1* p1 = 0;
Chris@16 25 T2* p2 = 0;
Chris@101 26 D1 d1;
Chris@101 27 A1 a1(size, &p2);
Chris@101 28 shared_ptr<T> s1(p1, d1, a1);
Chris@101 29 A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
Chris@101 30 a2->set(0);
Chris@101 31 boost::detail::ms_init(p2, n1);
Chris@101 32 a2->set(p2);
Chris@16 33 p1 = reinterpret_cast<T1*>(p2);
Chris@101 34 return shared_ptr<T>(s1, p1);
Chris@16 35 }
Chris@101 36
Chris@101 37 template<class T>
Chris@101 38 inline typename boost::detail::sp_if_size_array<T>::type
Chris@101 39 make_shared() {
Chris@16 40 typedef typename boost::detail::array_inner<T>::type T1;
Chris@16 41 typedef typename boost::detail::array_base<T1>::type T2;
Chris@101 42 typedef boost::detail::ms_allocator<T> A1;
Chris@101 43 typedef boost::detail::ms_in_allocator_tag D1;
Chris@16 44 enum {
Chris@16 45 N = boost::detail::array_total<T>::size
Chris@16 46 };
Chris@16 47 T1* p1 = 0;
Chris@16 48 T2* p2 = 0;
Chris@101 49 D1 d1;
Chris@101 50 A1 a1(&p2);
Chris@101 51 shared_ptr<T> s1(p1, d1, a1);
Chris@101 52 A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
Chris@101 53 a2->set(0);
Chris@101 54 boost::detail::ms_init(p2, N);
Chris@101 55 a2->set(p2);
Chris@16 56 p1 = reinterpret_cast<T1*>(p2);
Chris@101 57 return shared_ptr<T>(s1, p1);
Chris@16 58 }
Chris@101 59
Chris@101 60 template<class T>
Chris@101 61 inline typename boost::detail::sp_if_array<T>::type
Chris@101 62 make_shared(std::size_t size,
Chris@101 63 const typename boost::detail::array_inner<T>::type& value) {
Chris@16 64 typedef typename boost::detail::array_inner<T>::type T1;
Chris@16 65 typedef typename boost::detail::array_base<T1>::type T2;
Chris@16 66 typedef const T2 T3;
Chris@101 67 typedef boost::detail::ms_allocator<T> A1;
Chris@101 68 typedef boost::detail::ms_in_allocator_tag D1;
Chris@16 69 enum {
Chris@101 70 M = boost::detail::array_total<T1>::size
Chris@16 71 };
Chris@101 72 std::size_t n1 = M * size;
Chris@16 73 T1* p1 = 0;
Chris@16 74 T2* p2 = 0;
Chris@101 75 T3* p3 = reinterpret_cast<T3*>(&value);
Chris@101 76 D1 d1;
Chris@101 77 A1 a1(size, &p2);
Chris@101 78 shared_ptr<T> s1(p1, d1, a1);
Chris@101 79 A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
Chris@101 80 a2->set(0);
Chris@101 81 boost::detail::ms_init<T2, M>(p2, n1, p3);
Chris@101 82 a2->set(p2);
Chris@16 83 p1 = reinterpret_cast<T1*>(p2);
Chris@101 84 return shared_ptr<T>(s1, p1);
Chris@16 85 }
Chris@101 86
Chris@101 87 template<class T>
Chris@101 88 inline typename boost::detail::sp_if_size_array<T>::type
Chris@101 89 make_shared(const typename boost::detail::array_inner<T>::type& value) {
Chris@16 90 typedef typename boost::detail::array_inner<T>::type T1;
Chris@16 91 typedef typename boost::detail::array_base<T1>::type T2;
Chris@16 92 typedef const T2 T3;
Chris@101 93 typedef boost::detail::ms_allocator<T> A1;
Chris@101 94 typedef boost::detail::ms_in_allocator_tag D1;
Chris@16 95 enum {
Chris@16 96 M = boost::detail::array_total<T1>::size,
Chris@16 97 N = boost::detail::array_total<T>::size
Chris@16 98 };
Chris@16 99 T1* p1 = 0;
Chris@16 100 T2* p2 = 0;
Chris@101 101 T3* p3 = reinterpret_cast<T3*>(&value);
Chris@101 102 D1 d1;
Chris@101 103 A1 a1(&p2);
Chris@101 104 shared_ptr<T> s1(p1, d1, a1);
Chris@101 105 A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
Chris@101 106 a2->set(0);
Chris@101 107 boost::detail::ms_init<T2, M>(p2, N, p3);
Chris@101 108 a2->set(p2);
Chris@16 109 p1 = reinterpret_cast<T1*>(p2);
Chris@101 110 return shared_ptr<T>(s1, p1);
Chris@16 111 }
Chris@101 112
Chris@101 113 template<class T>
Chris@16 114 inline typename boost::detail::sp_if_array<T>::type
Chris@101 115 make_shared_noinit(std::size_t size) {
Chris@16 116 typedef typename boost::detail::array_inner<T>::type T1;
Chris@16 117 typedef typename boost::detail::array_base<T1>::type T2;
Chris@101 118 typedef boost::detail::ms_allocator<T> A1;
Chris@101 119 typedef boost::detail::ms_in_allocator_tag D1;
Chris@101 120 std::size_t n1 = size * boost::detail::array_total<T1>::size;
Chris@16 121 T1* p1 = 0;
Chris@16 122 T2* p2 = 0;
Chris@101 123 D1 d1;
Chris@101 124 A1 a1(size, &p2);
Chris@101 125 shared_ptr<T> s1(p1, d1, a1);
Chris@101 126 A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
Chris@101 127 a2->set(0);
Chris@101 128 boost::detail::ms_noinit(p2, n1);
Chris@101 129 a2->set(p2);
Chris@16 130 p1 = reinterpret_cast<T1*>(p2);
Chris@101 131 return shared_ptr<T>(s1, p1);
Chris@16 132 }
Chris@101 133
Chris@101 134 template<class T>
Chris@101 135 inline typename boost::detail::sp_if_size_array<T>::type
Chris@101 136 make_shared_noinit() {
Chris@16 137 typedef typename boost::detail::array_inner<T>::type T1;
Chris@16 138 typedef typename boost::detail::array_base<T1>::type T2;
Chris@101 139 typedef boost::detail::ms_allocator<T> A1;
Chris@101 140 typedef boost::detail::ms_in_allocator_tag D1;
Chris@16 141 enum {
Chris@16 142 N = boost::detail::array_total<T>::size
Chris@16 143 };
Chris@16 144 T1* p1 = 0;
Chris@16 145 T2* p2 = 0;
Chris@101 146 D1 d1;
Chris@101 147 A1 a1(&p2);
Chris@101 148 shared_ptr<T> s1(p1, d1, a1);
Chris@101 149 A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
Chris@101 150 a2->set(0);
Chris@101 151 boost::detail::ms_noinit(p2, N);
Chris@101 152 a2->set(p2);
Chris@16 153 p1 = reinterpret_cast<T1*>(p2);
Chris@101 154 return shared_ptr<T>(s1, p1);
Chris@16 155 }
Chris@16 156 }
Chris@16 157
Chris@16 158 #endif