Ticket #12351: 0001-boost-make_shared-use-Constructor-Forwarding-on-C-03.patch
File 0001-boost-make_shared-use-Constructor-Forwarding-on-C-03.patch, 35.2 KB (added by , 6 years ago) |
---|
-
include/boost/smart_ptr/make_shared_object.hpp
From de38a735ea7793f9c7e747e49e3ce3900b92ab46 Mon Sep 17 00:00:00 2001 From: Giel van Schijndel <me@mortis.eu> Date: Sun, 24 Jul 2016 14:38:21 +0200 Subject: [PATCH] boost::make_shared: use Constructor Forwarding on C++03 Use Boost.Move's move emulation and documented Constructor Forwarding technique to provide (partial) constructor forwarding on compilers that don't support r-value references. This allows constructing types taking movable-but-not-copyable types as constructor arguments. Additionally it's generally more efficient for movable-and-copyable types, but that's just a nice-to-have. --- include/boost/smart_ptr/make_shared_object.hpp | 570 ++++++------------------- 1 file changed, 120 insertions(+), 450 deletions(-) diff --git a/include/boost/smart_ptr/make_shared_object.hpp b/include/boost/smart_ptr/make_shared_object.hpp index 62372fa..3bc78ee 100644
a b 13 13 // for documentation. 14 14 15 15 #include <boost/config.hpp> 16 #include <boost/move/core.hpp> 17 #include <boost/move/utility_core.hpp> 16 18 #include <boost/smart_ptr/shared_ptr.hpp> 17 19 #include <boost/smart_ptr/detail/sp_forward.hpp> 18 20 #include <boost/type_traits/type_with_alignment.hpp> … … template< class T, class A > typename boost::detail::sp_if_not_array< T >::type 338 340 return boost::shared_ptr< T >( pt, pt2 ); 339 341 } 340 342 341 #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) 342 343 // For example MSVC 10.0 343 // C++03 version 344 344 345 345 template< class T, class A1 > 346 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 &&a1 )346 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1 ) 347 347 { 348 348 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 349 349 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 ) 352 352 void * pv = pd->address(); 353 353 354 354 ::new( pv ) T( 355 boost:: detail::sp_forward<A1>( a1 )355 boost::forward<A1>( a1 ) 356 356 ); 357 357 358 358 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1 ) 364 364 } 365 365 366 366 template< class T, class A, class A1 > 367 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 &&a1 )367 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1 ) 368 368 { 369 369 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 370 370 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 372 372 373 373 void * pv = pd->address(); 374 374 375 ::new( pv ) T( 376 boost:: detail::sp_forward<A1>( a1 )375 ::new( pv ) T( 376 boost::forward<A1>( a1 ) 377 377 ); 378 378 379 379 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 385 385 } 386 386 387 387 template< class T, class A1, class A2 > 388 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 &&a2 )388 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 ) 389 389 { 390 390 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 391 391 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 394 394 void * pv = pd->address(); 395 395 396 396 ::new( pv ) T( 397 boost:: detail::sp_forward<A1>( a1 ),398 boost:: detail::sp_forward<A2>( a2 )397 boost::forward<A1>( a1 ), 398 boost::forward<A2>( a2 ) 399 399 ); 400 400 401 401 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 407 407 } 408 408 409 409 template< class T, class A, class A1, class A2 > 410 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 &&a2 )410 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2 ) 411 411 { 412 412 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 413 413 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 415 415 416 416 void * pv = pd->address(); 417 417 418 ::new( pv ) T( 419 boost:: detail::sp_forward<A1>( a1 ),420 boost:: detail::sp_forward<A2>( a2 )418 ::new( pv ) T( 419 boost::forward<A1>( a1 ), 420 boost::forward<A2>( a2 ) 421 421 ); 422 422 423 423 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 429 429 } 430 430 431 431 template< class T, class A1, class A2, class A3 > 432 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 &&a3 )432 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 ) 433 433 { 434 434 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 435 435 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 438 438 void * pv = pd->address(); 439 439 440 440 ::new( pv ) T( 441 boost:: detail::sp_forward<A1>( a1 ),442 boost:: detail::sp_forward<A2>( a2 ),443 boost:: detail::sp_forward<A3>( a3 )441 boost::forward<A1>( a1 ), 442 boost::forward<A2>( a2 ), 443 boost::forward<A3>( a3 ) 444 444 ); 445 445 446 446 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 452 452 } 453 453 454 454 template< class T, class A, class A1, class A2, class A3 > 455 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 &&a3 )455 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3 ) 456 456 { 457 457 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 458 458 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 460 460 461 461 void * pv = pd->address(); 462 462 463 ::new( pv ) T( 464 boost:: detail::sp_forward<A1>( a1 ),465 boost:: detail::sp_forward<A2>( a2 ),466 boost:: detail::sp_forward<A3>( a3 )463 ::new( pv ) T( 464 boost::forward<A1>( a1 ), 465 boost::forward<A2>( a2 ), 466 boost::forward<A3>( a3 ) 467 467 ); 468 468 469 469 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 475 475 } 476 476 477 477 template< class T, class A1, class A2, class A3, class A4 > 478 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 &&a4 )478 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 ) 479 479 { 480 480 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 481 481 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 484 484 void * pv = pd->address(); 485 485 486 486 ::new( pv ) T( 487 boost:: detail::sp_forward<A1>( a1 ),488 boost:: detail::sp_forward<A2>( a2 ),489 boost:: detail::sp_forward<A3>( a3 ),490 boost:: detail::sp_forward<A4>( a4 )487 boost::forward<A1>( a1 ), 488 boost::forward<A2>( a2 ), 489 boost::forward<A3>( a3 ), 490 boost::forward<A4>( a4 ) 491 491 ); 492 492 493 493 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 499 499 } 500 500 501 501 template< class T, class A, class A1, class A2, class A3, class A4 > 502 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 &&a4 )502 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4 ) 503 503 { 504 504 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 505 505 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 507 507 508 508 void * pv = pd->address(); 509 509 510 ::new( pv ) T( 511 boost:: detail::sp_forward<A1>( a1 ),512 boost:: detail::sp_forward<A2>( a2 ),513 boost:: detail::sp_forward<A3>( a3 ),514 boost:: detail::sp_forward<A4>( a4 )510 ::new( pv ) T( 511 boost::forward<A1>( a1 ), 512 boost::forward<A2>( a2 ), 513 boost::forward<A3>( a3 ), 514 boost::forward<A4>( a4 ) 515 515 ); 516 516 517 517 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 523 523 } 524 524 525 525 template< class T, class A1, class A2, class A3, class A4, class A5 > 526 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 &&a5 )526 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 ) 527 527 { 528 528 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 529 529 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 532 532 void * pv = pd->address(); 533 533 534 534 ::new( pv ) T( 535 boost:: detail::sp_forward<A1>( a1 ),536 boost:: detail::sp_forward<A2>( a2 ),537 boost:: detail::sp_forward<A3>( a3 ),538 boost:: detail::sp_forward<A4>( a4 ),539 boost:: detail::sp_forward<A5>( a5 )535 boost::forward<A1>( a1 ), 536 boost::forward<A2>( a2 ), 537 boost::forward<A3>( a3 ), 538 boost::forward<A4>( a4 ), 539 boost::forward<A5>( a5 ) 540 540 ); 541 541 542 542 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 548 548 } 549 549 550 550 template< class T, class A, class A1, class A2, class A3, class A4, class A5 > 551 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 &&a5 )551 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5 ) 552 552 { 553 553 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 554 554 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 556 556 557 557 void * pv = pd->address(); 558 558 559 ::new( pv ) T( 560 boost:: detail::sp_forward<A1>( a1 ),561 boost:: detail::sp_forward<A2>( a2 ),562 boost:: detail::sp_forward<A3>( a3 ),563 boost:: detail::sp_forward<A4>( a4 ),564 boost:: detail::sp_forward<A5>( a5 )559 ::new( pv ) T( 560 boost::forward<A1>( a1 ), 561 boost::forward<A2>( a2 ), 562 boost::forward<A3>( a3 ), 563 boost::forward<A4>( a4 ), 564 boost::forward<A5>( a5 ) 565 565 ); 566 566 567 567 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 573 573 } 574 574 575 575 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 > 576 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 &&a6 )576 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 ) 577 577 { 578 578 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 579 579 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 582 582 void * pv = pd->address(); 583 583 584 584 ::new( pv ) T( 585 boost:: detail::sp_forward<A1>( a1 ),586 boost:: detail::sp_forward<A2>( a2 ),587 boost:: detail::sp_forward<A3>( a3 ),588 boost:: detail::sp_forward<A4>( a4 ),589 boost:: detail::sp_forward<A5>( a5 ),590 boost:: detail::sp_forward<A6>( a6 )585 boost::forward<A1>( a1 ), 586 boost::forward<A2>( a2 ), 587 boost::forward<A3>( a3 ), 588 boost::forward<A4>( a4 ), 589 boost::forward<A5>( a5 ), 590 boost::forward<A6>( a6 ) 591 591 ); 592 592 593 593 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 599 599 } 600 600 601 601 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 > 602 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 &&a6 )602 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6 ) 603 603 { 604 604 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 605 605 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 607 607 608 608 void * pv = pd->address(); 609 609 610 ::new( pv ) T( 611 boost:: detail::sp_forward<A1>( a1 ),612 boost:: detail::sp_forward<A2>( a2 ),613 boost:: detail::sp_forward<A3>( a3 ),614 boost:: detail::sp_forward<A4>( a4 ),615 boost:: detail::sp_forward<A5>( a5 ),616 boost:: detail::sp_forward<A6>( a6 )610 ::new( pv ) T( 611 boost::forward<A1>( a1 ), 612 boost::forward<A2>( a2 ), 613 boost::forward<A3>( a3 ), 614 boost::forward<A4>( a4 ), 615 boost::forward<A5>( a5 ), 616 boost::forward<A6>( a6 ) 617 617 ); 618 618 619 619 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 625 625 } 626 626 627 627 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > 628 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 &&a7 )628 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 ) 629 629 { 630 630 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 631 631 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 634 634 void * pv = pd->address(); 635 635 636 636 ::new( pv ) T( 637 boost:: detail::sp_forward<A1>( a1 ),638 boost:: detail::sp_forward<A2>( a2 ),639 boost:: detail::sp_forward<A3>( a3 ),640 boost:: detail::sp_forward<A4>( a4 ),641 boost:: detail::sp_forward<A5>( a5 ),642 boost:: detail::sp_forward<A6>( a6 ),643 boost:: detail::sp_forward<A7>( a7 )637 boost::forward<A1>( a1 ), 638 boost::forward<A2>( a2 ), 639 boost::forward<A3>( a3 ), 640 boost::forward<A4>( a4 ), 641 boost::forward<A5>( a5 ), 642 boost::forward<A6>( a6 ), 643 boost::forward<A7>( a7 ) 644 644 ); 645 645 646 646 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 652 652 } 653 653 654 654 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 > 655 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 &&a7 )655 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7 ) 656 656 { 657 657 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 658 658 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 660 660 661 661 void * pv = pd->address(); 662 662 663 ::new( pv ) T( 664 boost:: detail::sp_forward<A1>( a1 ),665 boost:: detail::sp_forward<A2>( a2 ),666 boost:: detail::sp_forward<A3>( a3 ),667 boost:: detail::sp_forward<A4>( a4 ),668 boost:: detail::sp_forward<A5>( a5 ),669 boost:: detail::sp_forward<A6>( a6 ),670 boost:: detail::sp_forward<A7>( a7 )663 ::new( pv ) T( 664 boost::forward<A1>( a1 ), 665 boost::forward<A2>( a2 ), 666 boost::forward<A3>( a3 ), 667 boost::forward<A4>( a4 ), 668 boost::forward<A5>( a5 ), 669 boost::forward<A6>( a6 ), 670 boost::forward<A7>( a7 ) 671 671 ); 672 672 673 673 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 679 679 } 680 680 681 681 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > 682 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 &&a8 )682 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 ) 683 683 { 684 684 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 685 685 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 688 688 void * pv = pd->address(); 689 689 690 690 ::new( pv ) T( 691 boost:: detail::sp_forward<A1>( a1 ),692 boost:: detail::sp_forward<A2>( a2 ),693 boost:: detail::sp_forward<A3>( a3 ),694 boost:: detail::sp_forward<A4>( a4 ),695 boost:: detail::sp_forward<A5>( a5 ),696 boost:: detail::sp_forward<A6>( a6 ),697 boost:: detail::sp_forward<A7>( a7 ),698 boost:: detail::sp_forward<A8>( a8 )691 boost::forward<A1>( a1 ), 692 boost::forward<A2>( a2 ), 693 boost::forward<A3>( a3 ), 694 boost::forward<A4>( a4 ), 695 boost::forward<A5>( a5 ), 696 boost::forward<A6>( a6 ), 697 boost::forward<A7>( a7 ), 698 boost::forward<A8>( a8 ) 699 699 ); 700 700 701 701 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 707 707 } 708 708 709 709 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > 710 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 &&a8 )710 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8 ) 711 711 { 712 712 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 713 713 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 715 715 716 716 void * pv = pd->address(); 717 717 718 ::new( pv ) T( 719 boost:: detail::sp_forward<A1>( a1 ),720 boost:: detail::sp_forward<A2>( a2 ),721 boost:: detail::sp_forward<A3>( a3 ),722 boost:: detail::sp_forward<A4>( a4 ),723 boost:: detail::sp_forward<A5>( a5 ),724 boost:: detail::sp_forward<A6>( a6 ),725 boost:: detail::sp_forward<A7>( a7 ),726 boost:: detail::sp_forward<A8>( a8 )718 ::new( pv ) T( 719 boost::forward<A1>( a1 ), 720 boost::forward<A2>( a2 ), 721 boost::forward<A3>( a3 ), 722 boost::forward<A4>( a4 ), 723 boost::forward<A5>( a5 ), 724 boost::forward<A6>( a6 ), 725 boost::forward<A7>( a7 ), 726 boost::forward<A8>( a8 ) 727 727 ); 728 728 729 729 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 735 735 } 736 736 737 737 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > 738 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 &&a9 )738 typename boost::detail::sp_if_not_array< T >::type make_shared( BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 ) 739 739 { 740 740 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) ); 741 741 … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 744 744 void * pv = pd->address(); 745 745 746 746 ::new( pv ) T( 747 boost:: detail::sp_forward<A1>( a1 ),748 boost:: detail::sp_forward<A2>( a2 ),749 boost:: detail::sp_forward<A3>( a3 ),750 boost:: detail::sp_forward<A4>( a4 ),751 boost:: detail::sp_forward<A5>( a5 ),752 boost:: detail::sp_forward<A6>( a6 ),753 boost:: detail::sp_forward<A7>( a7 ),754 boost:: detail::sp_forward<A8>( a8 ),755 boost:: detail::sp_forward<A9>( a9 )747 boost::forward<A1>( a1 ), 748 boost::forward<A2>( a2 ), 749 boost::forward<A3>( a3 ), 750 boost::forward<A4>( a4 ), 751 boost::forward<A5>( a5 ), 752 boost::forward<A6>( a6 ), 753 boost::forward<A7>( a7 ), 754 boost::forward<A8>( a8 ), 755 boost::forward<A9>( a9 ) 756 756 ); 757 757 758 758 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type make_shared( A1 && a1, A2 && 764 764 } 765 765 766 766 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 > 767 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 && a1, A2 && a2, A3 && a3, A4 && a4, A5 && a5, A6 && a6, A7 && a7, A8 && a8, A9 &&a9 )767 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2, BOOST_FWD_REF(A3) a3, BOOST_FWD_REF(A4) a4, BOOST_FWD_REF(A5) a5, BOOST_FWD_REF(A6) a6, BOOST_FWD_REF(A7) a7, BOOST_FWD_REF(A8) a8, BOOST_FWD_REF(A9) a9 ) 768 768 { 769 769 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a ); 770 770 … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 772 772 773 773 void * pv = pd->address(); 774 774 775 ::new( pv ) T( 776 boost:: detail::sp_forward<A1>( a1 ),777 boost:: detail::sp_forward<A2>( a2 ),778 boost:: detail::sp_forward<A3>( a3 ),779 boost:: detail::sp_forward<A4>( a4 ),780 boost:: detail::sp_forward<A5>( a5 ),781 boost:: detail::sp_forward<A6>( a6 ),782 boost:: detail::sp_forward<A7>( a7 ),783 boost:: detail::sp_forward<A8>( a8 ),784 boost:: detail::sp_forward<A9>( a9 )775 ::new( pv ) T( 776 boost::forward<A1>( a1 ), 777 boost::forward<A2>( a2 ), 778 boost::forward<A3>( a3 ), 779 boost::forward<A4>( a4 ), 780 boost::forward<A5>( a5 ), 781 boost::forward<A6>( a6 ), 782 boost::forward<A7>( a7 ), 783 boost::forward<A8>( a8 ), 784 boost::forward<A9>( a9 ) 785 785 ); 786 786 787 787 pd->set_initialized(); … … typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, 792 792 return boost::shared_ptr< T >( pt, pt2 ); 793 793 } 794 794 795 #else // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )796 797 // C++03 version798 799 template< class T, class A1 >800 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1 )801 {802 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );803 804 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );805 806 void * pv = pd->address();807 808 ::new( pv ) T( a1 );809 pd->set_initialized();810 811 T * pt2 = static_cast< T* >( pv );812 813 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );814 return boost::shared_ptr< T >( pt, pt2 );815 }816 817 template< class T, class A, class A1 >818 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1 )819 {820 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );821 822 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );823 824 void * pv = pd->address();825 826 ::new( pv ) T( a1 );827 pd->set_initialized();828 829 T * pt2 = static_cast< T* >( pv );830 831 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );832 return boost::shared_ptr< T >( pt, pt2 );833 }834 835 template< class T, class A1, class A2 >836 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2 )837 {838 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );839 840 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );841 842 void * pv = pd->address();843 844 ::new( pv ) T( a1, a2 );845 pd->set_initialized();846 847 T * pt2 = static_cast< T* >( pv );848 849 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );850 return boost::shared_ptr< T >( pt, pt2 );851 }852 853 template< class T, class A, class A1, class A2 >854 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2 )855 {856 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );857 858 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );859 860 void * pv = pd->address();861 862 ::new( pv ) T( a1, a2 );863 pd->set_initialized();864 865 T * pt2 = static_cast< T* >( pv );866 867 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );868 return boost::shared_ptr< T >( pt, pt2 );869 }870 871 template< class T, class A1, class A2, class A3 >872 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3 )873 {874 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );875 876 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );877 878 void * pv = pd->address();879 880 ::new( pv ) T( a1, a2, a3 );881 pd->set_initialized();882 883 T * pt2 = static_cast< T* >( pv );884 885 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );886 return boost::shared_ptr< T >( pt, pt2 );887 }888 889 template< class T, class A, class A1, class A2, class A3 >890 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3 )891 {892 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );893 894 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );895 896 void * pv = pd->address();897 898 ::new( pv ) T( a1, a2, a3 );899 pd->set_initialized();900 901 T * pt2 = static_cast< T* >( pv );902 903 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );904 return boost::shared_ptr< T >( pt, pt2 );905 }906 907 template< class T, class A1, class A2, class A3, class A4 >908 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )909 {910 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );911 912 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );913 914 void * pv = pd->address();915 916 ::new( pv ) T( a1, a2, a3, a4 );917 pd->set_initialized();918 919 T * pt2 = static_cast< T* >( pv );920 921 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );922 return boost::shared_ptr< T >( pt, pt2 );923 }924 925 template< class T, class A, class A1, class A2, class A3, class A4 >926 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4 )927 {928 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );929 930 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );931 932 void * pv = pd->address();933 934 ::new( pv ) T( a1, a2, a3, a4 );935 pd->set_initialized();936 937 T * pt2 = static_cast< T* >( pv );938 939 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );940 return boost::shared_ptr< T >( pt, pt2 );941 }942 943 template< class T, class A1, class A2, class A3, class A4, class A5 >944 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )945 {946 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );947 948 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );949 950 void * pv = pd->address();951 952 ::new( pv ) T( a1, a2, a3, a4, a5 );953 pd->set_initialized();954 955 T * pt2 = static_cast< T* >( pv );956 957 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );958 return boost::shared_ptr< T >( pt, pt2 );959 }960 961 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >962 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5 )963 {964 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );965 966 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );967 968 void * pv = pd->address();969 970 ::new( pv ) T( a1, a2, a3, a4, a5 );971 pd->set_initialized();972 973 T * pt2 = static_cast< T* >( pv );974 975 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );976 return boost::shared_ptr< T >( pt, pt2 );977 }978 979 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >980 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )981 {982 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );983 984 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );985 986 void * pv = pd->address();987 988 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );989 pd->set_initialized();990 991 T * pt2 = static_cast< T* >( pv );992 993 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );994 return boost::shared_ptr< T >( pt, pt2 );995 }996 997 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >998 typename boost::detail::sp_if_not_array< T >::type allocate_shared( A const & a, A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6 )999 {1000 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );1001 1002 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );1003 1004 void * pv = pd->address();1005 1006 ::new( pv ) T( a1, a2, a3, a4, a5, a6 );1007 pd->set_initialized();1008 1009 T * pt2 = static_cast< T* >( pv );1010 1011 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );1012 return boost::shared_ptr< T >( pt, pt2 );1013 }1014 1015 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >1016 typename boost::detail::sp_if_not_array< T >::type make_shared( A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7 )1017 {1018 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );1019 1020 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );1021 1022 void * pv = pd->address();1023 1024 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );1025 pd->set_initialized();1026 1027 T * pt2 = static_cast< T* >( pv );1028 1029 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );1030 return boost::shared_ptr< T >( pt, pt2 );1031 }1032 1033 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >1034 typename boost::detail::sp_if_not_array< T >::type 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 )1035 {1036 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );1037 1038 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );1039 1040 void * pv = pd->address();1041 1042 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );1043 pd->set_initialized();1044 1045 T * pt2 = static_cast< T* >( pv );1046 1047 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );1048 return boost::shared_ptr< T >( pt, pt2 );1049 }1050 1051 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >1052 typename boost::detail::sp_if_not_array< T >::type 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 )1053 {1054 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );1055 1056 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );1057 1058 void * pv = pd->address();1059 1060 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );1061 pd->set_initialized();1062 1063 T * pt2 = static_cast< T* >( pv );1064 1065 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );1066 return boost::shared_ptr< T >( pt, pt2 );1067 }1068 1069 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >1070 typename boost::detail::sp_if_not_array< T >::type 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 )1071 {1072 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );1073 1074 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );1075 1076 void * pv = pd->address();1077 1078 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );1079 pd->set_initialized();1080 1081 T * pt2 = static_cast< T* >( pv );1082 1083 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );1084 return boost::shared_ptr< T >( pt, pt2 );1085 }1086 1087 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >1088 typename boost::detail::sp_if_not_array< T >::type 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 )1089 {1090 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ) );1091 1092 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );1093 1094 void * pv = pd->address();1095 1096 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );1097 pd->set_initialized();1098 1099 T * pt2 = static_cast< T* >( pv );1100 1101 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );1102 return boost::shared_ptr< T >( pt, pt2 );1103 }1104 1105 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >1106 typename boost::detail::sp_if_not_array< T >::type 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 )1107 {1108 boost::shared_ptr< T > pt( static_cast< T* >( 0 ), BOOST_SP_MSD( T ), a );1109 1110 boost::detail::sp_ms_deleter< T > * pd = static_cast<boost::detail::sp_ms_deleter< T > *>( pt._internal_get_untyped_deleter() );1111 1112 void * pv = pd->address();1113 1114 ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );1115 pd->set_initialized();1116 1117 T * pt2 = static_cast< T* >( pv );1118 1119 boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );1120 return boost::shared_ptr< T >( pt, pt2 );1121 }1122 1123 #endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )1124 1125 795 #endif // !defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) && !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) 1126 796 1127 797 #undef BOOST_SP_MSD