Reduced compile-time dependencies, headers, and the use of Boost.Preprocessor, specially for hooks and iterators.

This commit is contained in:
Ion Gaztañaga
2014-12-08 15:48:08 +01:00
parent adda517544
commit a4f0c0c7b3
19 changed files with 428 additions and 398 deletions
+53 -50
View File
@@ -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();
}