Compare commits

...

13 Commits

Author SHA1 Message Date
Beman Dawes
6848b09e73 Release 1.43.0
[SVN r61817]
2010-05-06 13:21:09 +00:00
Peter Dimov
697f338510 Merge [61074]. Fixes #4067.
[SVN r61078]
2010-04-05 19:37:32 +00:00
Peter Dimov
f4386409d9 Merge [58275], [58306] to release.
[SVN r58380]
2009-12-14 17:44:19 +00:00
Peter Dimov
ba349679f3 Merge [58123], [58127], [58128] to release. Fixes #3666.
[SVN r58195]
2009-12-06 17:50:28 +00:00
Peter Dimov
a3b84f8586 Merge [58094] to release.
[SVN r58122]
2009-12-03 17:50:37 +00:00
Peter Dimov
b0fd8a6b08 Merge [57957] to release. Fixes #3570.
[SVN r58067]
2009-11-30 20:34:39 +00:00
Peter Dimov
4f5062004a Merge [57954], [57955] to release.
[SVN r58066]
2009-11-30 20:30:22 +00:00
Peter Dimov
f040bed751 Merge [57953] to release. Fixes #2681.
[SVN r58065]
2009-11-30 20:25:01 +00:00
Peter Dimov
2f8945a885 Merge [57951] to release. Fixes #3351.
[SVN r58064]
2009-11-30 20:20:52 +00:00
Peter Dimov
2bd0778778 Merge [57949] to release. Fixes #3678. Fixes #3341.
[SVN r58063]
2009-11-30 20:17:14 +00:00
Peter Dimov
eec640bfd7 Merge [57520] to release. Fixes #2962.
[SVN r57960]
2009-11-26 22:10:30 +00:00
Peter Dimov
754fd941ee Merge [57950], [57952] to release. Fixes #3404. Fixes #3456.
[SVN r57959]
2009-11-26 21:58:16 +00:00
Troy D. Straszheim
e94f64039d rm cmake from the release branch before it goes out broken. Policy dictates that you never commit to release, you commit to trunk and merge to release.
[SVN r56941]
2009-10-17 01:10:45 +00:00
22 changed files with 294 additions and 132 deletions

View File

@@ -1,36 +0,0 @@
#
# Copyright Troy D. Straszheim
#
# Distributed under the Boost Software License, Version 1.0.
# See http://www.boost.org/LICENSE_1_0.txt
#
#----------------------------------------------------------------------------
# This file was automatically generated from the original CMakeLists.txt file
# Add a variable to hold the headers for the library
set (lib_headers
enable_shared_from_this.hpp
pointer_cast.hpp
scoped_array.hpp
scoped_ptr.hpp
shared_array.hpp
shared_ptr.hpp
weak_ptr.hpp
)
# Add a library target to the build system
boost_library_project(
smart_ptr
# SRCDIRS
TESTDIRS test
HEADERS ${lib_headers}
# DOCDIRS
DESCRIPTION "Five smart pointer class templates."
MODULARIZED
AUTHORS "Greg Colvin"
"Beman Dawes <bdawes -at- acm.org>"
"Peter Dimov <pdimov -at- mmltd.net>"
"Darin Adler"
# MAINTAINERS
)

View File

@@ -29,20 +29,24 @@
and <STRONG>shared_ptr&lt;T const&gt;</STRONG>, depending on constness, to <STRONG>this</STRONG>.</P> and <STRONG>shared_ptr&lt;T const&gt;</STRONG>, depending on constness, to <STRONG>this</STRONG>.</P>
<h3><a name="Example">Example</a></h3> <h3><a name="Example">Example</a></h3>
<pre> <pre>
class Y: public enable_shared_from_this&lt;Y&gt; #include &lt;boost/enable_shared_from_this.hpp&gt;
#include &lt;boost/shared_ptr.hpp&gt;
#include &lt;cassert&gt;
class Y: public boost::enable_shared_from_this&lt;Y&gt;
{ {
public: public:
shared_ptr&lt;Y&gt; f() boost::shared_ptr&lt;Y&gt; f()
{ {
return shared_from_this(); return shared_from_this();
} }
} };
int main() int main()
{ {
shared_ptr&lt;Y&gt; p(new Y); boost::shared_ptr&lt;Y&gt; p(new Y);
shared_ptr&lt;Y&gt; q = p-&gt;f(); boost::shared_ptr&lt;Y&gt; q = p-&gt;f();
assert(p == q); assert(p == q);
assert(!(p &lt; q || q &lt; p)); // p and q must share ownership assert(!(p &lt; q || q &lt; p)); // p and q must share ownership
} }

View File

@@ -19,20 +19,66 @@
#if defined( BOOST_NO_TYPEID ) #if defined( BOOST_NO_TYPEID )
#include <boost/current_function.hpp>
#include <functional>
namespace boost namespace boost
{ {
namespace detail namespace detail
{ {
typedef void* sp_typeinfo; class sp_typeinfo
{
private:
sp_typeinfo( sp_typeinfo const& );
sp_typeinfo& operator=( sp_typeinfo const& );
char const * name_;
public:
explicit sp_typeinfo( char const * name ): name_( name )
{
}
bool operator==( sp_typeinfo const& rhs ) const
{
return this == &rhs;
}
bool operator!=( sp_typeinfo const& rhs ) const
{
return this != &rhs;
}
bool before( sp_typeinfo const& rhs ) const
{
return std::less< sp_typeinfo const* >()( this, &rhs );
}
char const* name() const
{
return name_;
}
};
template<class T> struct sp_typeid_ template<class T> struct sp_typeid_
{ {
static char v_; static sp_typeinfo ti_;
static char const * name()
{
return BOOST_CURRENT_FUNCTION;
}
}; };
template<class T> char sp_typeid_< T >::v_; template<class T> sp_typeinfo sp_typeid_< T >::ti_( sp_typeid_< T >::name() );
template<class T> struct sp_typeid_< T & >: sp_typeid_< T >
{
};
template<class T> struct sp_typeid_< T const >: sp_typeid_< T > template<class T> struct sp_typeid_< T const >: sp_typeid_< T >
{ {
@@ -50,7 +96,7 @@ template<class T> struct sp_typeid_< T const volatile >: sp_typeid_< T >
} // namespace boost } // namespace boost
#define BOOST_SP_TYPEID(T) (&boost::detail::sp_typeid_<T>::v_) #define BOOST_SP_TYPEID(T) (boost::detail::sp_typeid_<T>::ti_)
#else #else

View File

@@ -11,7 +11,7 @@
// //
// Defines enum boost::memory_order per the C++0x working draft // Defines enum boost::memory_order per the C++0x working draft
// //
// Copyright (c) 2008 Peter Dimov // Copyright (c) 2008, 2009 Peter Dimov
// //
// Distributed under the Boost Software License, Version 1.0. // Distributed under the Boost Software License, Version 1.0.
// See accompanying file LICENSE_1_0.txt or copy at // See accompanying file LICENSE_1_0.txt or copy at
@@ -21,13 +21,31 @@
namespace boost namespace boost
{ {
//
// Enum values are chosen so that code that needs to insert
// a trailing fence for acquire semantics can use a single
// test such as:
//
// if( mo & memory_order_acquire ) { ...fence... }
//
// For leading fences one can use:
//
// if( mo & memory_order_release ) { ...fence... }
//
// Architectures such as Alpha that need a fence on consume
// can use:
//
// if( mo & ( memory_order_acquire | memory_order_consume ) ) { ...fence... }
//
enum memory_order enum memory_order
{ {
memory_order_relaxed = 0, memory_order_relaxed = 0,
memory_order_acquire = 1, memory_order_acquire = 1,
memory_order_release = 2, memory_order_release = 2,
memory_order_acq_rel = 3, // acquire | release memory_order_acq_rel = 3, // acquire | release
memory_order_seq_cst = 7 // acq_rel | 4 memory_order_seq_cst = 7, // acq_rel | 4
memory_order_consume = 8
}; };
} // namespace boost } // namespace boost

View File

@@ -17,6 +17,7 @@
// http://www.boost.org/LICENSE_1_0.txt) // http://www.boost.org/LICENSE_1_0.txt)
// //
#include <boost/assert.hpp>
#include <pthread.h> #include <pthread.h>
namespace boost namespace boost
@@ -42,15 +43,15 @@ public:
// HPUX 10.20 / DCE has a nonstandard pthread_mutex_init // HPUX 10.20 / DCE has a nonstandard pthread_mutex_init
#if defined(__hpux) && defined(_DECTHREADS_) #if defined(__hpux) && defined(_DECTHREADS_)
pthread_mutex_init(&m_, pthread_mutexattr_default); BOOST_VERIFY( pthread_mutex_init( &m_, pthread_mutexattr_default ) == 0 );
#else #else
pthread_mutex_init(&m_, 0); BOOST_VERIFY( pthread_mutex_init( &m_, 0 ) == 0 );
#endif #endif
} }
~lightweight_mutex() ~lightweight_mutex()
{ {
pthread_mutex_destroy(&m_); BOOST_VERIFY( pthread_mutex_destroy( &m_ ) == 0 );
} }
class scoped_lock; class scoped_lock;
@@ -69,12 +70,12 @@ public:
scoped_lock(lightweight_mutex & m): m_(m.m_) scoped_lock(lightweight_mutex & m): m_(m.m_)
{ {
pthread_mutex_lock(&m_); BOOST_VERIFY( pthread_mutex_lock( &m_ ) == 0 );
} }
~scoped_lock() ~scoped_lock()
{ {
pthread_mutex_unlock(&m_); BOOST_VERIFY( pthread_mutex_unlock( &m_ ) == 0 );
} }
}; };
}; };

View File

@@ -74,8 +74,9 @@ template<unsigned size, unsigned align_> struct allocator_impl
static lightweight_mutex & mutex() static lightweight_mutex & mutex()
{ {
static lightweight_mutex m; static freeblock< sizeof( lightweight_mutex ), boost::alignment_of< lightweight_mutex >::value > fbm;
return m; static lightweight_mutex * pm = new( &fbm ) lightweight_mutex;
return *pm;
} }
static lightweight_mutex * mutex_init; static lightweight_mutex * mutex_init;

View File

@@ -25,7 +25,7 @@
# define BOOST_SP_NO_SP_CONVERTIBLE # define BOOST_SP_NO_SP_CONVERTIBLE
#endif #endif
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ <= 0x610 ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) && defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x630 )
# define BOOST_SP_NO_SP_CONVERTIBLE # define BOOST_SP_NO_SP_CONVERTIBLE
#endif #endif

View File

@@ -30,9 +30,9 @@ namespace detail
inline int32_t compare_and_swap( int32_t * dest_, int32_t compare_, int32_t swap_ ) inline int32_t compare_and_swap( int32_t * dest_, int32_t compare_, int32_t swap_ )
{ {
__asm__ __volatile__( "cas %0, %2, %1" __asm__ __volatile__( "cas [%1], %2, %0"
: "+m" (*dest_), "+r" (swap_) : "+r" (swap_)
: "r" (compare_) : "r" (dest_), "r" (compare_)
: "memory" ); : "memory" );
return swap_; return swap_;

View File

@@ -40,7 +40,7 @@
#undef BOOST_SP_HAS_SYNC #undef BOOST_SP_HAS_SYNC
#endif #endif
#if defined( __INTEL_COMPILER ) && !defined( __ia64__ ) #if defined( __INTEL_COMPILER ) && !defined( __ia64__ ) && ( __INTEL_COMPILER < 1100 )
#undef BOOST_SP_HAS_SYNC #undef BOOST_SP_HAS_SYNC
#endif #endif

View File

@@ -77,7 +77,7 @@ public:
template<class U> template<class U>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
intrusive_ptr( intrusive_ptr<U> const & rhs, typename detail::sp_enable_if_convertible<U,T>::type = detail::sp_empty() ) intrusive_ptr( intrusive_ptr<U> const & rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty() )
#else #else
@@ -122,7 +122,7 @@ public:
intrusive_ptr & operator=(intrusive_ptr && rhs) intrusive_ptr & operator=(intrusive_ptr && rhs)
{ {
this_type(std::move(rhs)).swap(*this); this_type( static_cast< intrusive_ptr && >( rhs ) ).swap(*this);
return *this; return *this;
} }

View File

@@ -86,10 +86,12 @@ public:
} }
}; };
template< class T > T forward( T t ) #if defined( BOOST_HAS_RVALUE_REFS )
template< class T > T&& forward( T &&t )
{ {
return t; return t;
} }
#endif
} // namespace detail } // namespace detail

View File

@@ -228,7 +228,7 @@ public:
template<class Y> template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
shared_ptr( shared_ptr<Y> const & r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() ) shared_ptr( shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
#else #else
@@ -353,7 +353,7 @@ public:
template<class Y> template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
shared_ptr( shared_ptr<Y> && r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() ) shared_ptr( shared_ptr<Y> && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
#else #else
@@ -368,14 +368,14 @@ public:
shared_ptr & operator=( shared_ptr && r ) // never throws shared_ptr & operator=( shared_ptr && r ) // never throws
{ {
this_type( std::move( r ) ).swap( *this ); this_type( static_cast< shared_ptr && >( r ) ).swap( *this );
return *this; return *this;
} }
template<class Y> template<class Y>
shared_ptr & operator=( shared_ptr<Y> && r ) // never throws shared_ptr & operator=( shared_ptr<Y> && r ) // never throws
{ {
this_type( std::move( r ) ).swap( *this ); this_type( static_cast< shared_ptr<Y> && >( r ) ).swap( *this );
return *this; return *this;
} }
@@ -448,7 +448,7 @@ public:
return pn < rhs.pn; return pn < rhs.pn;
} }
void * _internal_get_deleter( detail::sp_typeinfo const & ti ) const void * _internal_get_deleter( boost::detail::sp_typeinfo const & ti ) const
{ {
return pn.get_deleter( ti ); return pn.get_deleter( ti );
} }

View File

@@ -63,7 +63,7 @@ public:
template<class Y> template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
weak_ptr( weak_ptr<Y> const & r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() ) weak_ptr( weak_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
#else #else
@@ -79,20 +79,20 @@ public:
template<class Y> template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
weak_ptr( weak_ptr<Y> && r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() ) weak_ptr( weak_ptr<Y> && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
#else #else
weak_ptr( weak_ptr<Y> && r ) weak_ptr( weak_ptr<Y> && r )
#endif #endif
: px(r.lock().get()), pn(std::move(r.pn)) // never throws : px( r.lock().get() ), pn( static_cast< boost::detail::weak_count && >( r.pn ) ) // never throws
{ {
r.px = 0; r.px = 0;
} }
// for better efficiency in the T == Y case // for better efficiency in the T == Y case
weak_ptr( weak_ptr && r ): px( r.px ), pn(std::move(r.pn)) // never throws weak_ptr( weak_ptr && r ): px( r.px ), pn( static_cast< boost::detail::weak_count && >( r.pn ) ) // never throws
{ {
r.px = 0; r.px = 0;
} }
@@ -100,7 +100,7 @@ public:
// for better efficiency in the T == Y case // for better efficiency in the T == Y case
weak_ptr & operator=( weak_ptr && r ) // never throws weak_ptr & operator=( weak_ptr && r ) // never throws
{ {
this_type( std::move( r ) ).swap( *this ); this_type( static_cast< weak_ptr && >( r ) ).swap( *this );
return *this; return *this;
} }
@@ -110,7 +110,7 @@ public:
template<class Y> template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE ) #if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
weak_ptr( shared_ptr<Y> const & r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() ) weak_ptr( shared_ptr<Y> const & r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )
#else #else
@@ -136,7 +136,7 @@ public:
template<class Y> template<class Y>
weak_ptr & operator=( weak_ptr<Y> && r ) weak_ptr & operator=( weak_ptr<Y> && r )
{ {
this_type( std::move( r ) ).swap( *this ); this_type( static_cast< weak_ptr<Y> && >( r ) ).swap( *this );
return *this; return *this;
} }

View File

@@ -1 +0,0 @@
boost_module(smart_ptr DEPENDS utility)

View File

@@ -1,56 +0,0 @@
#
# Copyright Troy D. Straszheim
#
# Distributed under the Boost Software License, Version 1.0.
# See http://www.boost.org/LICENSE_1_0.txt
#
boost_additional_test_dependencies(tokenizer BOOST_DEPENDS test intrusive)
boost_test_run(smart_ptr_test)
boost_test_run(shared_ptr_basic_test)
boost_test_run(shared_ptr_test)
boost_test_run(weak_ptr_test)
boost_test_run(shared_from_this_test)
boost_test_run(get_deleter_test)
boost_test_run(intrusive_ptr_test)
boost_test_run(atomic_count_test)
boost_test_run(lw_mutex_test)
boost_test_compile_fail(shared_ptr_assign_fail)
boost_test_compile_fail(shared_ptr_delete_fail)
boost_test_compile_fail(shared_ptr_compare_fail)
boost_test_run(shared_ptr_alloc2_test)
boost_test_run(pointer_cast_test)
boost_test_compile(pointer_to_other_test)
boost_test_run(auto_ptr_rv_test)
boost_test_run(shared_ptr_alias_test)
boost_test_run(shared_ptr_rv_test)
boost_test_run(shared_ptr_move_test)
boost_test_compile_fail(shared_ptr_pv_fail)
boost_test_run(sp_unary_addr_test)
boost_test_compile_fail(scoped_ptr_eq_fail)
boost_test_compile_fail(scoped_array_eq_fail)
boost_test_run(esft_regtest)
boost_test_run(yield_k_test)
message(STATUS "!!!> yield_k_test multhreaded")
boost_test_run(spinlock_test)
boost_test_run(spinlock_try_test)
message(STATUS "!!!> spinlock_try_test multithreaded")
boost_test_run(spinlock_pool_test)
boost_test_run(make_shared_test)
boost_test_run(sp_convertible_test)
boost_test_run(wp_convertible_test)
boost_test_run(ip_convertible_test)
boost_test_run(allocate_shared_test)
boost_test_run(sp_atomic_test)
boost_test_run(esft_void_test)
boost_test_run(esft_second_ptr_test)
boost_test_run(make_shared_esft_test)
boost_test_run(allocate_shared_esft_test)
boost_test_run(sp_recursive_assign_test)
boost_test_run(sp_recursive_assign2_test)
boost_test_run(sp_recursive_assign_rv_test)
boost_test_run(sp_recursive_assign2_rv_test)
boost_test_compile_fail(auto_ptr_lv_fail)
boost_test_run(atomic_count_test2)

View File

@@ -45,6 +45,7 @@ import testing ;
[ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ] [ run spinlock_try_test.cpp : : : <threading>multi : spinlock_try_test.mt ]
[ run spinlock_pool_test.cpp ] [ run spinlock_pool_test.cpp ]
[ run make_shared_test.cpp ] [ run make_shared_test.cpp ]
[ run make_shared_perfect_forwarding_test.cpp ]
[ run sp_convertible_test.cpp ] [ run sp_convertible_test.cpp ]
[ run wp_convertible_test.cpp ] [ run wp_convertible_test.cpp ]
[ run ip_convertible_test.cpp ] [ run ip_convertible_test.cpp ]
@@ -61,5 +62,6 @@ import testing ;
[ run esft_constructor_test.cpp ] [ run esft_constructor_test.cpp ]
[ compile-fail auto_ptr_lv_fail.cpp ] [ compile-fail auto_ptr_lv_fail.cpp ]
[ run atomic_count_test2.cpp ] [ run atomic_count_test2.cpp ]
[ run sp_typeinfo_test.cpp ]
; ;
} }

View File

@@ -0,0 +1,98 @@
// make_shared_perfect_forwarding_test.cpp - a test of make_shared
// perfect forwarding of constructor arguments when using a C++0x
// compiler.
//
// Copyright 2009 Frank Mori Hess
//
// Distributed under the Boost Software License, Version 1.0.
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt
#include <boost/detail/lightweight_test.hpp>
#include <boost/make_shared.hpp>
#include <boost/shared_ptr.hpp>
#ifndef BOOST_HAS_RVALUE_REFS
int main()
{
return 0;
}
#else // BOOST_HAS_RVALUE_REFS
class myarg
{
public:
myarg()
{}
private:
myarg(myarg && other)
{}
myarg& operator=(myarg && other)
{
return *this;
}
myarg(const myarg & other)
{}
myarg& operator=(const myarg & other)
{
return *this;
}
};
class X
{
public:
enum constructor_id
{
move_constructor,
const_ref_constructor,
ref_constructor
};
X(myarg &&arg): constructed_by_(move_constructor)
{}
X(const myarg &arg): constructed_by_(const_ref_constructor)
{}
X(myarg &arg): constructed_by_(ref_constructor)
{}
constructor_id constructed_by_;
};
struct Y
{
Y(int &value): ref(value)
{}
int &ref;
};
int main()
{
{
myarg a;
boost::shared_ptr< X > x = boost::make_shared< X >(a);
BOOST_TEST( x->constructed_by_ == X::ref_constructor);
}
{
const myarg ca;
boost::shared_ptr< X > x = boost::make_shared< X >(ca);
BOOST_TEST( x->constructed_by_ == X::const_ref_constructor);
}
{
boost::shared_ptr< X > x = boost::make_shared< X >(myarg());
BOOST_TEST( x->constructed_by_ == X::move_constructor);
}
{
int value = 1;
boost::shared_ptr< Y > y = boost::make_shared< Y >(value);
BOOST_TEST( y->ref == 1 && value == y->ref );
++y->ref;
BOOST_TEST( value == y->ref );
}
return boost::report_errors();
}
#endif // BOOST_HAS_RVALUE_REFS

View File

@@ -9,6 +9,8 @@
// http://www.boost.org/LICENSE_1_0.txt) // http://www.boost.org/LICENSE_1_0.txt)
// //
#include <boost/config.hpp>
#include <boost/pointer_cast.hpp> #include <boost/pointer_cast.hpp>
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
@@ -58,6 +60,8 @@ class derived_derived
// And now some simple check functions // And now some simple check functions
#if !defined( BOOST_NO_RTTI )
template <class BasePtr> template <class BasePtr>
bool check_dynamic_pointer_cast(const BasePtr &ptr) bool check_dynamic_pointer_cast(const BasePtr &ptr)
{ {
@@ -74,6 +78,8 @@ bool check_dynamic_pointer_cast(const BasePtr &ptr)
dynamic_cast<derived_derived*>(boost::get_pointer(ptr)); dynamic_cast<derived_derived*>(boost::get_pointer(ptr));
} }
#endif
template <class BasePtr> template <class BasePtr>
bool check_static_pointer_cast(const BasePtr &ptr) bool check_static_pointer_cast(const BasePtr &ptr)
{ {
@@ -107,7 +113,9 @@ int main()
boost::shared_ptr<base> ptr(new derived); boost::shared_ptr<base> ptr(new derived);
#if !defined( BOOST_NO_RTTI )
BOOST_TEST( check_dynamic_pointer_cast( ptr ) ); BOOST_TEST( check_dynamic_pointer_cast( ptr ) );
#endif
BOOST_TEST( check_static_pointer_cast( ptr ) ); BOOST_TEST( check_static_pointer_cast( ptr ) );
BOOST_TEST( check_const_pointer_cast( ptr ) ); BOOST_TEST( check_const_pointer_cast( ptr ) );
} }
@@ -117,7 +125,9 @@ int main()
boost::scoped_ptr<base> ptr(new derived); boost::scoped_ptr<base> ptr(new derived);
#if !defined( BOOST_NO_RTTI )
BOOST_TEST( check_dynamic_pointer_cast( ptr.get() ) ); BOOST_TEST( check_dynamic_pointer_cast( ptr.get() ) );
#endif
BOOST_TEST( check_static_pointer_cast( ptr.get() ) ); BOOST_TEST( check_static_pointer_cast( ptr.get() ) );
BOOST_TEST( check_const_pointer_cast( ptr.get() ) ); BOOST_TEST( check_const_pointer_cast( ptr.get() ) );
} }

View File

@@ -63,10 +63,12 @@ void test()
px->f(); px->f();
#if !defined( BOOST_NO_RTTI )
boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px); boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px);
BOOST_TEST(py.get() == py2.get()); BOOST_TEST(py.get() == py2.get());
BOOST_TEST(!(py < py2 || py2 < py)); BOOST_TEST(!(py < py2 || py2 < py));
BOOST_TEST(py.use_count() == 3); BOOST_TEST(py.use_count() == 3);
#endif
} }
catch( boost::bad_weak_ptr const& ) catch( boost::bad_weak_ptr const& )
{ {

View File

@@ -188,6 +188,7 @@ int main()
test_eq(p, q); test_eq(p, q);
} }
#if !defined( BOOST_NO_RTTI )
shared_ptr<Y> p3 = dynamic_pointer_cast<Y>(p); shared_ptr<Y> p3 = dynamic_pointer_cast<Y>(p);
shared_ptr<Y> p4 = dynamic_pointer_cast<Y>(p2); shared_ptr<Y> p4 = dynamic_pointer_cast<Y>(p2);
@@ -201,6 +202,7 @@ int main()
test_is_Y(p3); test_is_Y(p3);
test_eq2(p, p3); test_eq2(p, p3);
test_ne2(p2, p4); test_ne2(p2, p4);
#endif
shared_ptr<void> p5(p); shared_ptr<void> p5(p);
@@ -214,13 +216,17 @@ int main()
p.reset(); p.reset();
p2.reset(); p2.reset();
#if !defined( BOOST_NO_RTTI )
p3.reset(); p3.reset();
p4.reset(); p4.reset();
#endif
test_is_zero(p); test_is_zero(p);
test_is_zero(p2); test_is_zero(p2);
#if !defined( BOOST_NO_RTTI )
test_is_zero(p3); test_is_zero(p3);
test_is_zero(p4); test_is_zero(p4);
#endif
BOOST_TEST(p5.use_count() == 1); BOOST_TEST(p5.use_count() == 1);
@@ -250,6 +256,7 @@ int main()
test_is_nonzero(wp2.lock()); test_is_nonzero(wp2.lock());
} }
#if !defined( BOOST_NO_RTTI )
weak_ptr<Y> wp3 = dynamic_pointer_cast<Y>(wp2.lock()); weak_ptr<Y> wp3 = dynamic_pointer_cast<Y>(wp2.lock());
BOOST_TEST(wp3.use_count() == 1); BOOST_TEST(wp3.use_count() == 1);
@@ -259,12 +266,15 @@ int main()
BOOST_TEST(wp4.use_count() == 1); BOOST_TEST(wp4.use_count() == 1);
test_shared(wp2, wp4); test_shared(wp2, wp4);
#endif
wp1 = p2; wp1 = p2;
test_is_zero(wp1.lock()); test_is_zero(wp1.lock());
#if !defined( BOOST_NO_RTTI )
wp1 = p4; wp1 = p4;
wp1 = wp3; wp1 = wp3;
#endif
wp1 = wp2; wp1 = wp2;
BOOST_TEST(wp1.use_count() == 1); BOOST_TEST(wp1.use_count() == 1);
@@ -279,7 +289,9 @@ int main()
BOOST_TEST(wp1.use_count() == 0); BOOST_TEST(wp1.use_count() == 0);
BOOST_TEST(wp2.use_count() == 0); BOOST_TEST(wp2.use_count() == 0);
#if !defined( BOOST_NO_RTTI )
BOOST_TEST(wp3.use_count() == 0); BOOST_TEST(wp3.use_count() == 0);
#endif
// Test operator< stability for std::set< weak_ptr<> > // Test operator< stability for std::set< weak_ptr<> >
// Thanks to Joe Gottman for pointing this out // Thanks to Joe Gottman for pointing this out

View File

@@ -2462,6 +2462,8 @@ void test()
} // namespace n_const_cast } // namespace n_const_cast
#if !defined( BOOST_NO_RTTI )
namespace n_dynamic_cast namespace n_dynamic_cast
{ {
@@ -2527,6 +2529,8 @@ void test()
} // namespace n_dynamic_cast } // namespace n_dynamic_cast
#endif
namespace n_map namespace n_map
{ {
@@ -3200,10 +3204,12 @@ void test()
BOOST_TEST(px.get() != 0); BOOST_TEST(px.get() != 0);
BOOST_TEST(py.use_count() == 2); BOOST_TEST(py.use_count() == 2);
#if !defined( BOOST_NO_RTTI )
boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px); boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px);
BOOST_TEST(py.get() == py2.get()); BOOST_TEST(py.get() == py2.get());
BOOST_TEST(!(py < py2 || py2 < py)); BOOST_TEST(!(py < py2 || py2 < py));
BOOST_TEST(py.use_count() == 3); BOOST_TEST(py.use_count() == 3);
#endif
} }
} // namespace n_spt_shared_from_this } // namespace n_spt_shared_from_this
@@ -3229,7 +3235,9 @@ int main()
n_comparison::test(); n_comparison::test();
n_static_cast::test(); n_static_cast::test();
n_const_cast::test(); n_const_cast::test();
#if !defined( BOOST_NO_RTTI )
n_dynamic_cast::test(); n_dynamic_cast::test();
#endif
n_map::test(); n_map::test();

51
test/sp_typeinfo_test.cpp Normal file
View File

@@ -0,0 +1,51 @@
//
// sp_typeinfo_test.cpp
//
// Copyright (c) 2009 Peter Dimov
//
// Distributed under the Boost Software License, Version 1.0.
// See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt
//
#include <boost/detail/sp_typeinfo.hpp>
#include <boost/detail/lightweight_test.hpp>
#include <iostream>
int main()
{
BOOST_TEST( BOOST_SP_TYPEID( int ) == BOOST_SP_TYPEID( int ) );
BOOST_TEST( BOOST_SP_TYPEID( int ) != BOOST_SP_TYPEID( long ) );
BOOST_TEST( BOOST_SP_TYPEID( int ) != BOOST_SP_TYPEID( void ) );
boost::detail::sp_typeinfo const & ti = BOOST_SP_TYPEID( int );
boost::detail::sp_typeinfo const * pti = &BOOST_SP_TYPEID( int );
BOOST_TEST( *pti == ti );
BOOST_TEST( ti == ti );
BOOST_TEST( !( ti != ti ) );
BOOST_TEST( !ti.before( ti ) );
char const * nti = ti.name();
std::cout << nti << std::endl;
boost::detail::sp_typeinfo const & tv = BOOST_SP_TYPEID( void );
boost::detail::sp_typeinfo const * ptv = &BOOST_SP_TYPEID( void );
BOOST_TEST( *ptv == tv );
BOOST_TEST( tv == tv );
BOOST_TEST( !( tv != tv ) );
BOOST_TEST( !tv.before( tv ) );
char const * ntv = tv.name();
std::cout << ntv << std::endl;
BOOST_TEST( ti != tv );
BOOST_TEST( !( ti == tv ) );
BOOST_TEST( ti.before( tv ) != tv.before( ti ) );
return boost::report_errors();
}