Ticket #2126: make_shared.hpp.diff

File make_shared.hpp.diff, 11.2 KB (added by Andrey.Semashev@…, 14 years ago)

The proposed fix

  • make_shared.hpp

     
    9898
    9999    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    100100
    101     void * pv = pd->address();
     101    T * pv = static_cast< T * >(pd->address());
    102102
    103103    new( pv ) T();
    104104    pd->set_initialized();
    105105
    106     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     106    boost::shared_ptr< T > p( pt, pv );
     107    boost::sp_accept_owner( &p, pv );
     108    return p;
    107109}
    108110
    109111template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
     
    112114
    113115    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    114116
    115     void * pv = pd->address();
     117    T * pv = static_cast< T * >(pd->address());
    116118
    117119    new( pv ) T();
    118120    pd->set_initialized();
    119121
    120     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     122    boost::shared_ptr< T > p( pt, pv );
     123    boost::sp_accept_owner( &p, pv );
     124    return p;
    121125}
    122126
    123127#if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )
     
    130134
    131135    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    132136
    133     void * pv = pd->address();
     137    T * pv = static_cast< T * >(pd->address());
    134138
    135139    new( pv ) T( detail::forward<Args>( args )... );
    136140    pd->set_initialized();
    137141
    138     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     142    boost::shared_ptr< T > p( pt, pv );
     143    boost::sp_accept_owner( &p, pv );
     144    return p;
    139145}
    140146
    141147template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Args && ... args )
     
    144150
    145151    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    146152
    147     void * pv = pd->address();
     153    T * pv = static_cast< T * >(pd->address());
    148154
    149155    new( pv ) T( detail::forward<Args>( args )... );
    150156    pd->set_initialized();
    151157
    152     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     158    boost::shared_ptr< T > p( pt, pv );
     159    boost::sp_accept_owner( &p, pv );
     160    return p;
    153161}
    154162
    155163#else
     
    163171
    164172    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    165173
    166     void * pv = pd->address();
     174    T * pv = static_cast< T * >(pd->address());
    167175
    168176    new( pv ) T( a1 );
    169177    pd->set_initialized();
    170178
    171     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     179    boost::shared_ptr< T > p( pt, pv );
     180    boost::sp_accept_owner( &p, pv );
     181    return p;
    172182}
    173183
    174184template< class T, class A, class A1 >
     
    178188
    179189    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    180190
    181     void * pv = pd->address();
     191    T * pv = static_cast< T * >(pd->address());
    182192
    183193    new( pv ) T( a1 );
    184194    pd->set_initialized();
    185195
    186     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     196    boost::shared_ptr< T > p( pt, pv );
     197    boost::sp_accept_owner( &p, pv );
     198    return p;
    187199}
    188200
    189201template< class T, class A1, class A2 >
     
    193205
    194206    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    195207
    196     void * pv = pd->address();
     208    T * pv = static_cast< T * >(pd->address());
    197209
    198210    new( pv ) T( a1, a2 );
    199211    pd->set_initialized();
    200212
    201     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     213    boost::shared_ptr< T > p( pt, pv );
     214    boost::sp_accept_owner( &p, pv );
     215    return p;
    202216}
    203217
    204218template< class T, class A, class A1, class A2 >
     
    208222
    209223    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    210224
    211     void * pv = pd->address();
     225    T * pv = static_cast< T * >(pd->address());
    212226
    213227    new( pv ) T( a1, a2 );
    214228    pd->set_initialized();
    215229
    216     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     230    boost::shared_ptr< T > p( pt, pv );
     231    boost::sp_accept_owner( &p, pv );
     232    return p;
    217233}
    218234
    219235template< class T, class A1, class A2, class A3 >
     
    223239
    224240    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    225241
    226     void * pv = pd->address();
     242    T * pv = static_cast< T * >(pd->address());
    227243
    228244    new( pv ) T( a1, a2, a3 );
    229245    pd->set_initialized();
    230246
    231     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     247    boost::shared_ptr< T > p( pt, pv );
     248    boost::sp_accept_owner( &p, pv );
     249    return p;
    232250}
    233251
    234252template< class T, class A, class A1, class A2, class A3 >
     
    238256
    239257    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    240258
    241     void * pv = pd->address();
     259    T * pv = static_cast< T * >(pd->address());
    242260
    243261    new( pv ) T( a1, a2, a3 );
    244262    pd->set_initialized();
    245263
    246     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     264    boost::shared_ptr< T > p( pt, pv );
     265    boost::sp_accept_owner( &p, pv );
     266    return p;
    247267}
    248268
    249269template< class T, class A1, class A2, class A3, class A4 >
     
    253273
    254274    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    255275
    256     void * pv = pd->address();
     276    T * pv = static_cast< T * >(pd->address());
    257277
    258278    new( pv ) T( a1, a2, a3, a4 );
    259279    pd->set_initialized();
    260280
    261     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     281    boost::shared_ptr< T > p( pt, pv );
     282    boost::sp_accept_owner( &p, pv );
     283    return p;
    262284}
    263285
    264286template< class T, class A, class A1, class A2, class A3, class A4 >
     
    268290
    269291    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    270292
    271     void * pv = pd->address();
     293    T * pv = static_cast< T * >(pd->address());
    272294
    273295    new( pv ) T( a1, a2, a3, a4 );
    274296    pd->set_initialized();
    275297
    276     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     298    boost::shared_ptr< T > p( pt, pv );
     299    boost::sp_accept_owner( &p, pv );
     300    return p;
    277301}
    278302
    279303template< class T, class A1, class A2, class A3, class A4, class A5 >
     
    283307
    284308    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    285309
    286     void * pv = pd->address();
     310    T * pv = static_cast< T * >(pd->address());
    287311
    288312    new( pv ) T( a1, a2, a3, a4, a5 );
    289313    pd->set_initialized();
    290314
    291     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     315    boost::shared_ptr< T > p( pt, pv );
     316    boost::sp_accept_owner( &p, pv );
     317    return p;
    292318}
    293319
    294320template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
     
    298324
    299325    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    300326
    301     void * pv = pd->address();
     327    T * pv = static_cast< T * >(pd->address());
    302328
    303329    new( pv ) T( a1, a2, a3, a4, a5 );
    304330    pd->set_initialized();
    305331
    306     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     332    boost::shared_ptr< T > p( pt, pv );
     333    boost::sp_accept_owner( &p, pv );
     334    return p;
    307335}
    308336
    309337template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
     
    313341
    314342    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    315343
    316     void * pv = pd->address();
     344    T * pv = static_cast< T * >(pd->address());
    317345
    318346    new( pv ) T( a1, a2, a3, a4, a5, a6 );
    319347    pd->set_initialized();
    320348
    321     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     349    boost::shared_ptr< T > p( pt, pv );
     350    boost::sp_accept_owner( &p, pv );
     351    return p;
    322352}
    323353
    324354template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
     
    328358
    329359    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    330360
    331     void * pv = pd->address();
     361    T * pv = static_cast< T * >(pd->address());
    332362
    333363    new( pv ) T( a1, a2, a3, a4, a5, a6 );
    334364    pd->set_initialized();
    335365
    336     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     366    boost::shared_ptr< T > p( pt, pv );
     367    boost::sp_accept_owner( &p, pv );
     368    return p;
    337369}
    338370
    339371template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
     
    343375
    344376    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    345377
    346     void * pv = pd->address();
     378    T * pv = static_cast< T * >(pd->address());
    347379
    348380    new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
    349381    pd->set_initialized();
    350382
    351     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     383    boost::shared_ptr< T > p( pt, pv );
     384    boost::sp_accept_owner( &p, pv );
     385    return p;
    352386}
    353387
    354388template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
     
    358392
    359393    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    360394
    361     void * pv = pd->address();
     395    T * pv = static_cast< T * >(pd->address());
    362396
    363397    new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
    364398    pd->set_initialized();
    365399
    366     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     400    boost::shared_ptr< T > p( pt, pv );
     401    boost::sp_accept_owner( &p, pv );
     402    return p;
    367403}
    368404
    369405template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
     
    373409
    374410    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    375411
    376     void * pv = pd->address();
     412    T * pv = static_cast< T * >(pd->address());
    377413
    378414    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
    379415    pd->set_initialized();
    380416
    381     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     417    boost::shared_ptr< T > p( pt, pv );
     418    boost::sp_accept_owner( &p, pv );
     419    return p;
    382420}
    383421
    384422template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
     
    388426
    389427    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    390428
    391     void * pv = pd->address();
     429    T * pv = static_cast< T * >(pd->address());
    392430
    393431    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
    394432    pd->set_initialized();
    395433
    396     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     434    boost::shared_ptr< T > p( pt, pv );
     435    boost::sp_accept_owner( &p, pv );
     436    return p;
    397437}
    398438
    399439template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
     
    403443
    404444    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    405445
    406     void * pv = pd->address();
     446    T * pv = static_cast< T * >(pd->address());
    407447
    408448    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
    409449    pd->set_initialized();
    410450
    411     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     451    boost::shared_ptr< T > p( pt, pv );
     452    boost::sp_accept_owner( &p, pv );
     453    return p;
    412454}
    413455
    414456template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
     
    418460
    419461    detail::sp_ms_deleter< T > * pd = boost::get_deleter< detail::sp_ms_deleter< T > >( pt );
    420462
    421     void * pv = pd->address();
     463    T * pv = static_cast< T * >(pd->address());
    422464
    423465    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
    424466    pd->set_initialized();
    425467
    426     return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
     468    boost::shared_ptr< T > p( pt, pv );
     469    boost::sp_accept_owner( &p, pv );
     470    return p;
    427471}
    428472
    429473#endif