2 Copyright 2017 Glen Joseph Fernandes
5 Distributed under the Boost Software License, Version 1.0.
6 (http://www.boost.org/LICENSE_1_0.txt)
8 #include <boost/config.hpp>
9 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
10 !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
11 #include <boost/align/is_aligned.hpp>
12 #include <boost/core/lightweight_test.hpp>
13 #include <boost/smart_ptr/make_local_shared.hpp>
14 #include <boost/smart_ptr/weak_ptr.hpp>
15 #include <boost/type_traits/alignment_of.hpp>
17 template<class T
= void>
23 typedef creator
<U
> other
;
29 creator(const creator
<U
>&) { }
31 T
* allocate(std::size_t size
) {
32 return static_cast<T
*>(::operator new(sizeof(T
) * size
));
35 void deallocate(T
* ptr
, std::size_t) {
36 ::operator delete(ptr
);
40 template<class T
, class U
>
42 operator==(const creator
<T
>&, const creator
<U
>&)
47 template<class T
, class U
>
49 operator!=(const creator
<T
>&, const creator
<U
>&)
56 static unsigned instances
;
67 void set(long double value
) {
71 long double get() const {
77 type
& operator=(const type
&);
82 unsigned type::instances
= 0;
87 boost::local_shared_ptr
<int[]> result
=
88 boost::allocate_local_shared_noinit
<int[]>(creator
<int>(), 3);
89 BOOST_TEST(result
.get() != 0);
90 BOOST_TEST(result
.local_use_count() == 1);
91 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
92 boost::alignment_of
<int>::value
));
95 boost::local_shared_ptr
<int[3]> result
=
96 boost::allocate_local_shared_noinit
<int[3]>(creator
<int>());
97 BOOST_TEST(result
.get() != 0);
98 BOOST_TEST(result
.local_use_count() == 1);
99 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
100 boost::alignment_of
<int>::value
));
103 boost::local_shared_ptr
<int[][2]> result
=
104 boost::allocate_local_shared_noinit
<int[][2]>(creator
<>(), 2);
105 BOOST_TEST(result
.get() != 0);
106 BOOST_TEST(result
.local_use_count() == 1);
107 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
108 boost::alignment_of
<int>::value
));
111 boost::local_shared_ptr
<int[2][2]> result
=
112 boost::allocate_local_shared_noinit
<int[2][2]>(creator
<>());
113 BOOST_TEST(result
.get() != 0);
114 BOOST_TEST(result
.local_use_count() == 1);
115 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
116 boost::alignment_of
<int>::value
));
119 boost::local_shared_ptr
<const int[]> result
=
120 boost::allocate_local_shared_noinit
<const int[]>(creator
<>(), 3);
121 BOOST_TEST(result
.get() != 0);
122 BOOST_TEST(result
.local_use_count() == 1);
123 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
124 boost::alignment_of
<int>::value
));
127 boost::local_shared_ptr
<const int[3]> result
=
128 boost::allocate_local_shared_noinit
<const int[3]>(creator
<>());
129 BOOST_TEST(result
.get() != 0);
130 BOOST_TEST(result
.local_use_count() == 1);
131 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
132 boost::alignment_of
<int>::value
));
135 boost::local_shared_ptr
<const int[][2]> result
=
136 boost::allocate_local_shared_noinit
<const int[][2]>(creator
<>(), 2);
137 BOOST_TEST(result
.get() != 0);
138 BOOST_TEST(result
.local_use_count() == 1);
139 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
140 boost::alignment_of
<int>::value
));
143 boost::local_shared_ptr
<const int[2][2]> result
=
144 boost::allocate_local_shared_noinit
<const int[2][2]>(creator
<>());
145 BOOST_TEST(result
.get() != 0);
146 BOOST_TEST(result
.local_use_count() == 1);
147 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
148 boost::alignment_of
<int>::value
));
151 boost::local_shared_ptr
<type
[]> result
=
152 boost::allocate_local_shared_noinit
<type
[]>(creator
<type
>(), 3);
153 BOOST_TEST(result
.get() != 0);
154 BOOST_TEST(result
.local_use_count() == 1);
155 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
156 boost::alignment_of
<type
>::value
));
157 BOOST_TEST(type::instances
== 3);
158 boost::weak_ptr
<type
[]> other
= result
;
160 BOOST_TEST(type::instances
== 0);
163 boost::local_shared_ptr
<type
[3]> result
=
164 boost::allocate_local_shared_noinit
<type
[3]>(creator
<type
>());
165 BOOST_TEST(result
.get() != 0);
166 BOOST_TEST(result
.local_use_count() == 1);
167 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
168 boost::alignment_of
<type
>::value
));
169 BOOST_TEST(type::instances
== 3);
170 boost::weak_ptr
<type
[3]> other
= result
;
172 BOOST_TEST(type::instances
== 0);
175 boost::local_shared_ptr
<type
[][2]> result
=
176 boost::allocate_local_shared_noinit
<type
[][2]>(creator
<>(), 2);
177 BOOST_TEST(result
.get() != 0);
178 BOOST_TEST(result
.local_use_count() == 1);
179 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
180 boost::alignment_of
<type
>::value
));
181 BOOST_TEST(type::instances
== 4);
182 boost::weak_ptr
<type
[][2]> other
= result
;
184 BOOST_TEST(type::instances
== 0);
187 boost::local_shared_ptr
<type
[2][2]> result
=
188 boost::allocate_local_shared_noinit
<type
[2][2]>(creator
<>());
189 BOOST_TEST(result
.get() != 0);
190 BOOST_TEST(result
.local_use_count() == 1);
191 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
192 boost::alignment_of
<type
>::value
));
193 BOOST_TEST(type::instances
== 4);
194 boost::weak_ptr
<type
[2][2]> other
= result
;
196 BOOST_TEST(type::instances
== 0);
199 boost::local_shared_ptr
<const type
[]> result
=
200 boost::allocate_local_shared_noinit
<const type
[]>(creator
<>(), 3);
201 BOOST_TEST(result
.get() != 0);
202 BOOST_TEST(result
.local_use_count() == 1);
203 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
204 boost::alignment_of
<type
>::value
));
205 BOOST_TEST(type::instances
== 3);
206 boost::weak_ptr
<const type
[]> other
= result
;
208 BOOST_TEST(type::instances
== 0);
211 boost::local_shared_ptr
<const type
[3]> result
=
212 boost::allocate_local_shared_noinit
<const type
[3]>(creator
<>());
213 BOOST_TEST(result
.get() != 0);
214 BOOST_TEST(result
.local_use_count() == 1);
215 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
216 boost::alignment_of
<type
>::value
));
217 BOOST_TEST(type::instances
== 3);
218 boost::weak_ptr
<const type
[3]> other
= result
;
220 BOOST_TEST(type::instances
== 0);
223 boost::local_shared_ptr
<const type
[][2]> result
=
224 boost::allocate_local_shared_noinit
<const
225 type
[][2]>(creator
<>(), 2);
226 BOOST_TEST(result
.get() != 0);
227 BOOST_TEST(result
.local_use_count() == 1);
228 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
229 boost::alignment_of
<type
>::value
));
230 BOOST_TEST(type::instances
== 4);
231 boost::weak_ptr
<const type
[][2]> other
= result
;
233 BOOST_TEST(type::instances
== 0);
236 boost::local_shared_ptr
<const type
[2][2]> result
=
237 boost::allocate_local_shared_noinit
<const type
[2][2]>(creator
<>());
238 BOOST_TEST(result
.get() != 0);
239 BOOST_TEST(result
.local_use_count() == 1);
240 BOOST_TEST(boost::alignment::is_aligned(result
.get(),
241 boost::alignment_of
<type
>::value
));
242 BOOST_TEST(type::instances
== 4);
243 boost::weak_ptr
<const type
[2][2]> other
= result
;
245 BOOST_TEST(type::instances
== 0);
247 return boost::report_errors();