]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/smart_ptr/make_shared.hpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
5df6cee220c86c898022170b051fc24ea7ebb6ba
[canny.git] / stc / exp / ml_stc_linux_make_v1.0 / include / boost / smart_ptr / make_shared.hpp
1 #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED\r
2 #define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED\r
3 \r
4 //  make_shared.hpp\r
5 //\r
6 //  Copyright (c) 2007, 2008 Peter Dimov\r
7 //\r
8 //  Distributed under the Boost Software License, Version 1.0.\r
9 //  See accompanying file LICENSE_1_0.txt or copy at\r
10 //  http://www.boost.org/LICENSE_1_0.txt\r
11 //\r
12 //  See http://www.boost.org/libs/smart_ptr/make_shared.html\r
13 //  for documentation.\r
14 \r
15 #include <boost/config.hpp>\r
16 #include <boost/smart_ptr/shared_ptr.hpp>\r
17 #include <boost/type_traits/type_with_alignment.hpp>\r
18 #include <boost/type_traits/alignment_of.hpp>\r
19 #include <cstddef>\r
20 #include <new>\r
21 \r
22 namespace boost\r
23 {\r
24 \r
25 namespace detail\r
26 {\r
27 \r
28 template< std::size_t N, std::size_t A > struct sp_aligned_storage\r
29 {\r
30     union type\r
31     {\r
32         char data_[ N ];\r
33         typename boost::type_with_alignment< A >::type align_;\r
34     };\r
35 };\r
36 \r
37 template< class T > class sp_ms_deleter\r
38 {\r
39 private:\r
40 \r
41     typedef typename sp_aligned_storage< sizeof( T ), ::boost::alignment_of< T >::value >::type storage_type;\r
42 \r
43     bool initialized_;\r
44     storage_type storage_;\r
45 \r
46 private:\r
47 \r
48     void destroy()\r
49     {\r
50         if( initialized_ )\r
51         {\r
52             reinterpret_cast< T* >( storage_.data_ )->~T();\r
53             initialized_ = false;\r
54         }\r
55     }\r
56 \r
57 public:\r
58 \r
59     sp_ms_deleter(): initialized_( false )\r
60     {\r
61     }\r
62 \r
63     // optimization: do not copy storage_\r
64     sp_ms_deleter( sp_ms_deleter const & ): initialized_( false )\r
65     {\r
66     }\r
67 \r
68     ~sp_ms_deleter()\r
69     {\r
70         destroy();\r
71     }\r
72 \r
73     void operator()( T * )\r
74     {\r
75         destroy();\r
76     }\r
77 \r
78     void * address()\r
79     {\r
80         return storage_.data_;\r
81     }\r
82 \r
83     void set_initialized()\r
84     {\r
85         initialized_ = true;\r
86     }\r
87 };\r
88 \r
89 #if defined( BOOST_HAS_RVALUE_REFS )\r
90 template< class T > T&& forward( T &&t )\r
91 {\r
92     return t;\r
93 }\r
94 #endif\r
95 \r
96 } // namespace detail\r
97 \r
98 // Zero-argument versions\r
99 //\r
100 // Used even when variadic templates are available because of the new T() vs new T issue\r
101 \r
102 template< class T > boost::shared_ptr< T > make_shared()\r
103 {\r
104     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
105 \r
106     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
107 \r
108     void * pv = pd->address();\r
109 \r
110     ::new( pv ) T();\r
111     pd->set_initialized();\r
112 \r
113     T * pt2 = static_cast< T* >( pv );\r
114 \r
115     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
116     return boost::shared_ptr< T >( pt, pt2 );\r
117 }\r
118 \r
119 template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )\r
120 {\r
121     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
122 \r
123     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
124 \r
125     void * pv = pd->address();\r
126 \r
127     ::new( pv ) T();\r
128     pd->set_initialized();\r
129 \r
130     T * pt2 = static_cast< T* >( pv );\r
131 \r
132     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
133     return boost::shared_ptr< T >( pt, pt2 );\r
134 }\r
135 \r
136 #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )\r
137 \r
138 // Variadic templates, rvalue reference\r
139 \r
140 template< class T, class... Args > boost::shared_ptr< T > make_shared( Args && ... args )\r
141 {\r
142     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
143 \r
144     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
145 \r
146     void * pv = pd->address();\r
147 \r
148     ::new( pv ) T( detail::forward<Args>( args )... );\r
149     pd->set_initialized();\r
150 \r
151     T * pt2 = static_cast< T* >( pv );\r
152 \r
153     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
154     return boost::shared_ptr< T >( pt, pt2 );\r
155 }\r
156 \r
157 template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Args && ... args )\r
158 {\r
159     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
160 \r
161     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
162 \r
163     void * pv = pd->address();\r
164 \r
165     ::new( pv ) T( detail::forward<Args>( args )... );\r
166     pd->set_initialized();\r
167 \r
168     T * pt2 = static_cast< T* >( pv );\r
169 \r
170     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
171     return boost::shared_ptr< T >( pt, pt2 );\r
172 }\r
173 \r
174 #else\r
175 \r
176 // C++03 version\r
177 \r
178 template< class T, class A1 >\r
179 boost::shared_ptr< T > make_shared( A1 const & a1 )\r
180 {\r
181     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
182 \r
183     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
184 \r
185     void * pv = pd->address();\r
186 \r
187     ::new( pv ) T( a1 );\r
188     pd->set_initialized();\r
189 \r
190     T * pt2 = static_cast< T* >( pv );\r
191 \r
192     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
193     return boost::shared_ptr< T >( pt, pt2 );\r
194 }\r
195 \r
196 template< class T, class A, class A1 >\r
197 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )\r
198 {\r
199     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
200 \r
201     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
202 \r
203     void * pv = pd->address();\r
204 \r
205     ::new( pv ) T( a1 );\r
206     pd->set_initialized();\r
207 \r
208     T * pt2 = static_cast< T* >( pv );\r
209 \r
210     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
211     return boost::shared_ptr< T >( pt, pt2 );\r
212 }\r
213 \r
214 template< class T, class A1, class A2 >\r
215 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )\r
216 {\r
217     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
218 \r
219     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
220 \r
221     void * pv = pd->address();\r
222 \r
223     ::new( pv ) T( a1, a2 );\r
224     pd->set_initialized();\r
225 \r
226     T * pt2 = static_cast< T* >( pv );\r
227 \r
228     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
229     return boost::shared_ptr< T >( pt, pt2 );\r
230 }\r
231 \r
232 template< class T, class A, class A1, class A2 >\r
233 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2 )\r
234 {\r
235     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
236 \r
237     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
238 \r
239     void * pv = pd->address();\r
240 \r
241     ::new( pv ) T( a1, a2 );\r
242     pd->set_initialized();\r
243 \r
244     T * pt2 = static_cast< T* >( pv );\r
245 \r
246     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
247     return boost::shared_ptr< T >( pt, pt2 );\r
248 }\r
249 \r
250 template< class T, class A1, class A2, class A3 >\r
251 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )\r
252 {\r
253     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
254 \r
255     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
256 \r
257     void * pv = pd->address();\r
258 \r
259     ::new( pv ) T( a1, a2, a3 );\r
260     pd->set_initialized();\r
261 \r
262     T * pt2 = static_cast< T* >( pv );\r
263 \r
264     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
265     return boost::shared_ptr< T >( pt, pt2 );\r
266 }\r
267 \r
268 template< class T, class A, class A1, class A2, class A3 >\r
269 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )\r
270 {\r
271     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
272 \r
273     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
274 \r
275     void * pv = pd->address();\r
276 \r
277     ::new( pv ) T( a1, a2, a3 );\r
278     pd->set_initialized();\r
279 \r
280     T * pt2 = static_cast< T* >( pv );\r
281 \r
282     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
283     return boost::shared_ptr< T >( pt, pt2 );\r
284 }\r
285 \r
286 template< class T, class A1, class A2, class A3, class A4 >\r
287 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )\r
288 {\r
289     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
290 \r
291     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
292 \r
293     void * pv = pd->address();\r
294 \r
295     ::new( pv ) T( a1, a2, a3, a4 );\r
296     pd->set_initialized();\r
297 \r
298     T * pt2 = static_cast< T* >( pv );\r
299 \r
300     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
301     return boost::shared_ptr< T >( pt, pt2 );\r
302 }\r
303 \r
304 template< class T, class A, class A1, class A2, class A3, class A4 >\r
305 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )\r
306 {\r
307     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
308 \r
309     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
310 \r
311     void * pv = pd->address();\r
312 \r
313     ::new( pv ) T( a1, a2, a3, a4 );\r
314     pd->set_initialized();\r
315 \r
316     T * pt2 = static_cast< T* >( pv );\r
317 \r
318     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
319     return boost::shared_ptr< T >( pt, pt2 );\r
320 }\r
321 \r
322 template< class T, class A1, class A2, class A3, class A4, class A5 >\r
323 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )\r
324 {\r
325     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
326 \r
327     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
328 \r
329     void * pv = pd->address();\r
330 \r
331     ::new( pv ) T( a1, a2, a3, a4, a5 );\r
332     pd->set_initialized();\r
333 \r
334     T * pt2 = static_cast< T* >( pv );\r
335 \r
336     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
337     return boost::shared_ptr< T >( pt, pt2 );\r
338 }\r
339 \r
340 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >\r
341 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )\r
342 {\r
343     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
344 \r
345     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
346 \r
347     void * pv = pd->address();\r
348 \r
349     ::new( pv ) T( a1, a2, a3, a4, a5 );\r
350     pd->set_initialized();\r
351 \r
352     T * pt2 = static_cast< T* >( pv );\r
353 \r
354     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
355     return boost::shared_ptr< T >( pt, pt2 );\r
356 }\r
357 \r
358 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >\r
359 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )\r
360 {\r
361     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
362 \r
363     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
364 \r
365     void * pv = pd->address();\r
366 \r
367     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );\r
368     pd->set_initialized();\r
369 \r
370     T * pt2 = static_cast< T* >( pv );\r
371 \r
372     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
373     return boost::shared_ptr< T >( pt, pt2 );\r
374 }\r
375 \r
376 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >\r
377 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )\r
378 {\r
379     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
380 \r
381     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
382 \r
383     void * pv = pd->address();\r
384 \r
385     ::new( pv ) T( a1, a2, a3, a4, a5, a6 );\r
386     pd->set_initialized();\r
387 \r
388     T * pt2 = static_cast< T* >( pv );\r
389 \r
390     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
391     return boost::shared_ptr< T >( pt, pt2 );\r
392 }\r
393 \r
394 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >\r
395 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )\r
396 {\r
397     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
398 \r
399     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
400 \r
401     void * pv = pd->address();\r
402 \r
403     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );\r
404     pd->set_initialized();\r
405 \r
406     T * pt2 = static_cast< T* >( pv );\r
407 \r
408     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
409     return boost::shared_ptr< T >( pt, pt2 );\r
410 }\r
411 \r
412 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >\r
413 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )\r
414 {\r
415     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
416 \r
417     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
418 \r
419     void * pv = pd->address();\r
420 \r
421     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );\r
422     pd->set_initialized();\r
423 \r
424     T * pt2 = static_cast< T* >( pv );\r
425 \r
426     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
427     return boost::shared_ptr< T >( pt, pt2 );\r
428 }\r
429 \r
430 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >\r
431 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )\r
432 {\r
433     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
434 \r
435     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
436 \r
437     void * pv = pd->address();\r
438 \r
439     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );\r
440     pd->set_initialized();\r
441 \r
442     T * pt2 = static_cast< T* >( pv );\r
443 \r
444     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
445     return boost::shared_ptr< T >( pt, pt2 );\r
446 }\r
447 \r
448 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >\r
449 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8 )\r
450 {\r
451     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
452 \r
453     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
454 \r
455     void * pv = pd->address();\r
456 \r
457     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );\r
458     pd->set_initialized();\r
459 \r
460     T * pt2 = static_cast< T* >( pv );\r
461 \r
462     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
463     return boost::shared_ptr< T >( pt, pt2 );\r
464 }\r
465 \r
466 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >\r
467 boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )\r
468 {\r
469     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >() );\r
470 \r
471     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
472 \r
473     void * pv = pd->address();\r
474 \r
475     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );\r
476     pd->set_initialized();\r
477 \r
478     T * pt2 = static_cast< T* >( pv );\r
479 \r
480     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
481     return boost::shared_ptr< T >( pt, pt2 );\r
482 }\r
483 \r
484 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >\r
485 boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9 )\r
486 {\r
487     boost::shared_ptr< T > pt( static_cast< T* >( 0 ), detail::sp_ms_deleter< T >(), a );\r
488 \r
489     detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );\r
490 \r
491     void * pv = pd->address();\r
492 \r
493     ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );\r
494     pd->set_initialized();\r
495 \r
496     T * pt2 = static_cast< T* >( pv );\r
497 \r
498     boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );\r
499     return boost::shared_ptr< T >( pt, pt2 );\r
500 }\r
501 \r
502 #endif\r
503 \r
504 } // namespace boost\r
505 \r
506 #endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED\r