forked from boostorg/intrusive
Reduced compile-time dependencies, headers, and the use of Boost.Preprocessor, specially for hooks and iterators.
This commit is contained in:
@@ -10,6 +10,28 @@
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/intrusive/pointer_traits.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
struct CompleteSmartPtrStats
|
||||
{
|
||||
static unsigned static_cast_called;
|
||||
static unsigned dynamic_cast_called;
|
||||
static unsigned const_cast_called;
|
||||
static unsigned pointer_to_called;
|
||||
|
||||
static void reset_stats()
|
||||
{
|
||||
static_cast_called = 0;
|
||||
dynamic_cast_called = 0;
|
||||
const_cast_called = 0;
|
||||
pointer_to_called = 0;
|
||||
}
|
||||
};
|
||||
|
||||
unsigned CompleteSmartPtrStats::static_cast_called= 0;
|
||||
unsigned CompleteSmartPtrStats::dynamic_cast_called = 0;
|
||||
unsigned CompleteSmartPtrStats::const_cast_called = 0;
|
||||
unsigned CompleteSmartPtrStats::pointer_to_called = 0;
|
||||
|
||||
template<class T>
|
||||
class CompleteSmartPtr
|
||||
@@ -18,7 +40,6 @@ class CompleteSmartPtr
|
||||
friend class CompleteSmartPtr;
|
||||
|
||||
public:
|
||||
|
||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||
template <class U> using rebind = CompleteSmartPtr<U>;
|
||||
#else
|
||||
@@ -44,7 +65,7 @@ class CompleteSmartPtr
|
||||
{ this->ptr_ = c.ptr_; }
|
||||
|
||||
static CompleteSmartPtr pointer_to(T &r)
|
||||
{ return CompleteSmartPtr(r); }
|
||||
{ ++CompleteSmartPtrStats::pointer_to_called; return CompleteSmartPtr(r); }
|
||||
|
||||
T * operator->() const
|
||||
{ return ptr_; }
|
||||
@@ -54,15 +75,15 @@ class CompleteSmartPtr
|
||||
|
||||
template<class U>
|
||||
static CompleteSmartPtr static_cast_from(const CompleteSmartPtr<U> &uptr)
|
||||
{ return CompleteSmartPtr(*static_cast<element_type*>(uptr.ptr_)); }
|
||||
{ ++CompleteSmartPtrStats::static_cast_called; return CompleteSmartPtr(*static_cast<element_type*>(uptr.ptr_)); }
|
||||
|
||||
template<class U>
|
||||
static CompleteSmartPtr const_cast_from(const CompleteSmartPtr<U> &uptr)
|
||||
{ return CompleteSmartPtr(*const_cast<element_type*>(uptr.ptr_)); }
|
||||
{ ++CompleteSmartPtrStats::const_cast_called; return CompleteSmartPtr(*const_cast<element_type*>(uptr.ptr_)); }
|
||||
|
||||
template<class U>
|
||||
static CompleteSmartPtr dynamic_cast_from(const CompleteSmartPtr<U> &uptr)
|
||||
{ return CompleteSmartPtr(*dynamic_cast<element_type*>(uptr.ptr_)); }
|
||||
{ ++CompleteSmartPtrStats::dynamic_cast_called; return CompleteSmartPtr(*dynamic_cast<element_type*>(uptr.ptr_)); }
|
||||
|
||||
friend bool operator ==(const CompleteSmartPtr &l, const CompleteSmartPtr &r)
|
||||
{ return l.ptr_ == r.ptr_; }
|
||||
@@ -128,18 +149,10 @@ int main()
|
||||
BOOST_STATIC_ASSERT(( boost::intrusive::detail::is_same<boost::intrusive::pointer_traits
|
||||
<int*>::rebind_pointer<double>::type
|
||||
, double*>::value ));
|
||||
if(boost::intrusive::pointer_traits<int*>::pointer_to(dummy) != &dummy){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits<D*>::static_cast_from((B*)0)){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits<D*>::const_cast_from((const D*)0)){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits<DD*>::dynamic_cast_from((B*)0)){
|
||||
return 1;
|
||||
}
|
||||
BOOST_TEST(boost::intrusive::pointer_traits<int*>::pointer_to(dummy) == &dummy);
|
||||
BOOST_TEST(boost::intrusive::pointer_traits<D*>:: static_cast_from((B*)0) == 0);
|
||||
BOOST_TEST(boost::intrusive::pointer_traits<D*>:: const_cast_from((const D*)0) == 0);
|
||||
BOOST_TEST(boost::intrusive::pointer_traits<DD*>:: dynamic_cast_from((B*)0) == 0);
|
||||
|
||||
//Complete smart pointer
|
||||
BOOST_STATIC_ASSERT(( boost::intrusive::detail::is_same<boost::intrusive::pointer_traits
|
||||
@@ -151,22 +164,22 @@ int main()
|
||||
BOOST_STATIC_ASSERT(( boost::intrusive::detail::is_same<boost::intrusive::pointer_traits
|
||||
< CompleteSmartPtr<int> >::rebind_pointer<double>::type
|
||||
, CompleteSmartPtr<double> >::value ));
|
||||
if(boost::intrusive::pointer_traits< CompleteSmartPtr<int> >
|
||||
::pointer_to(dummy) != CompleteSmartPtr<int>(dummy)){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits< CompleteSmartPtr<D> >::
|
||||
static_cast_from(CompleteSmartPtr<B>()) != CompleteSmartPtr<D>()){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits< CompleteSmartPtr<D> >::
|
||||
const_cast_from(CompleteSmartPtr<const D>()) != CompleteSmartPtr<D>()){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits< CompleteSmartPtr<DD> >::
|
||||
dynamic_cast_from(CompleteSmartPtr<B>()) != CompleteSmartPtr<DD>()){
|
||||
return 1;
|
||||
}
|
||||
//pointer_to
|
||||
CompleteSmartPtrStats::reset_stats();
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< CompleteSmartPtr<int> >::pointer_to(dummy) == CompleteSmartPtr<int>(dummy));
|
||||
BOOST_TEST(CompleteSmartPtrStats::pointer_to_called == 1);
|
||||
//static_cast_from
|
||||
CompleteSmartPtrStats::reset_stats();
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< CompleteSmartPtr<D> >::static_cast_from(CompleteSmartPtr<B>()) == CompleteSmartPtr<D>());
|
||||
BOOST_TEST(CompleteSmartPtrStats::static_cast_called == 1);
|
||||
//const_cast_from
|
||||
CompleteSmartPtrStats::reset_stats();
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< CompleteSmartPtr<D> >::const_cast_from(CompleteSmartPtr<const D>()) == CompleteSmartPtr<D>());
|
||||
BOOST_TEST(CompleteSmartPtrStats::const_cast_called == 1);
|
||||
//dynamic_cast_from
|
||||
CompleteSmartPtrStats::reset_stats();
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< CompleteSmartPtr<DD> >::dynamic_cast_from(CompleteSmartPtr<B>()) == CompleteSmartPtr<DD>());
|
||||
BOOST_TEST(CompleteSmartPtrStats::dynamic_cast_called == 1);
|
||||
|
||||
//Simple smart pointer
|
||||
BOOST_STATIC_ASSERT(( boost::intrusive::detail::is_same<boost::intrusive::pointer_traits
|
||||
@@ -178,21 +191,11 @@ int main()
|
||||
BOOST_STATIC_ASSERT(( boost::intrusive::detail::is_same<boost::intrusive::pointer_traits
|
||||
< SimpleSmartPtr<int> >::rebind_pointer<double>::type
|
||||
, SimpleSmartPtr<double> >::value ));
|
||||
if(boost::intrusive::pointer_traits< SimpleSmartPtr<int> >
|
||||
::pointer_to(dummy) != SimpleSmartPtr<int>(&dummy)){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits< SimpleSmartPtr<D> >::
|
||||
static_cast_from(SimpleSmartPtr<B>()) != SimpleSmartPtr<D>()){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits< SimpleSmartPtr<D> >::
|
||||
const_cast_from(SimpleSmartPtr<const D>()) != SimpleSmartPtr<D>()){
|
||||
return 1;
|
||||
}
|
||||
if(boost::intrusive::pointer_traits< SimpleSmartPtr<DD> >::
|
||||
dynamic_cast_from(SimpleSmartPtr<B>()) != SimpleSmartPtr<DD>()){
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< SimpleSmartPtr<int> >::pointer_to(dummy) == SimpleSmartPtr<int>(&dummy));
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< SimpleSmartPtr<D> > ::static_cast_from(SimpleSmartPtr<B>()) == SimpleSmartPtr<D>());
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< SimpleSmartPtr<D> > ::const_cast_from(SimpleSmartPtr<const D>()) == SimpleSmartPtr<D>());
|
||||
BOOST_TEST(boost::intrusive::pointer_traits< SimpleSmartPtr<DD> >::dynamic_cast_from(SimpleSmartPtr<B>()) == SimpleSmartPtr<DD>());
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user