Both enable_error_info.hpp and enable_current_exception.hpp now do not depend on intrusive_ptr or any other Boost lib.

[SVN r48482]
This commit is contained in:
Emil Dotchevski
2008-08-31 01:39:00 +00:00
parent f2b14ffa98
commit f12d40765b
9 changed files with 200 additions and 58 deletions

View File

@ -6,8 +6,6 @@
#ifndef UUID_DBA0D90C930911DCBA7B675A56D89593
#define UUID_DBA0D90C930911DCBA7B675A56D89593
#include <boost/detail/workaround.hpp>
namespace
boost
{
@ -36,12 +34,7 @@ boost
protected:
#if BOOST_WORKAROUND( __GNUC__, BOOST_TESTED_AT(4) )
virtual //Disable bogus GCC warning.
#endif
#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) )
virtual //Disable bogus msvc warning.
#endif
virtual
~counted_base() throw()
{
}

View File

@ -0,0 +1,79 @@
//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
//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)
#ifndef UUID_490EADC876F011DDA2F00A4756D89593
#define UUID_490EADC876F011DDA2F00A4756D89593
namespace
boost
{
namespace
exception_detail
{
template <class T>
class
refcount_ptr
{
public:
refcount_ptr():
px_(0)
{
}
~refcount_ptr()
{
release();
}
refcount_ptr( refcount_ptr const & x ):
px_(x.px_)
{
add_ref();
}
refcount_ptr &
operator=( refcount_ptr const & x )
{
adopt(x.px_);
return *this;
}
void
adopt( T * px )
{
release();
px_=px;
add_ref();
}
T *
get() const
{
return px_;
}
private:
T * px_;
void
add_ref()
{
if( px_ )
intrusive_ptr_add_ref(px_);
}
void
release()
{
if( px_ )
intrusive_ptr_release(px_);
}
};
}
}
#endif

View File

@ -7,8 +7,6 @@
#define UUID_0C5D492E909711DCB658AD4556D89593
#include <boost/exception/exception.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/config.hpp>
#include <stddef.h>
namespace
@ -57,43 +55,21 @@ boost
typedef error_info_injector<T> type;
};
#if BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x582))
template <class T>
struct
sizeof_dispatch
{
BOOST_STATIC_CONSTANT(int, value = sizeof(dispatch((T*)0)) );
};
template <class T>
struct
enable_error_info_return_type
{
typedef typename enable_error_info_helper<T,sizeof_dispatch<T>::value>::type type;
};
#else
template <class T>
struct
enable_error_info_return_type
{
typedef typename enable_error_info_helper<T,sizeof(dispatch((T*)0))>::type type;
};
#endif
}
template <class T>
inline
#if !BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x582))
typename
#endif
exception_detail::enable_error_info_return_type<T>::type
enable_error_info( T const & x )
{
return
#if !BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x582))
typename
#endif
exception_detail::enable_error_info_return_type<T>::type(x);
return typename exception_detail::enable_error_info_return_type<T>::type(x);
}
}

View File

@ -7,7 +7,7 @@
#define UUID_274DA366004E11DCB1DDFE2E56D89593
#include <boost/exception/detail/counted_base.hpp>
#include <boost/intrusive_ptr.hpp>
#include <boost/exception/detail/refcount_ptr.hpp>
namespace
boost
@ -61,28 +61,16 @@ boost
{
}
#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) )
//Force class exception to be abstract.
//Otherwise, MSVC bug allows throw exception(), even though the copy constructor is protected.
virtual ~exception() throw()=0;
#else
#if BOOST_WORKAROUND( __GNUC__, BOOST_TESTED_AT(4) )
virtual //Disable bogus GCC warning.
#endif
~exception() throw()
{
}
#endif
char const *
_diagnostic_information() const throw()
{
if( data_ )
if( exception_detail::error_info_container * c=data_.get() )
try
{
char const * w = data_->diagnostic_information();
BOOST_ASSERT(w!=0);
return w;
if( char const * w = c->diagnostic_information() )
return w;
}
catch(...)
{
@ -97,16 +85,14 @@ boost
template <class ErrorInfo>
friend shared_ptr<typename ErrorInfo::value_type const> exception_detail::get_data( exception const & );
mutable intrusive_ptr<exception_detail::error_info_container> data_;
mutable exception_detail::refcount_ptr<exception_detail::error_info_container> data_;
};
#if BOOST_WORKAROUND( BOOST_MSVC, BOOST_TESTED_AT(1500) ) //See above.
inline
exception::
~exception() throw()
{
}
#endif
}
#endif

View File

@ -22,8 +22,8 @@ boost
shared_ptr<typename ErrorInfo::value_type const>
get_data( exception const & x )
{
if( x.data_ )
if( shared_ptr<exception_detail::error_info_base const> eib = x.data_->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) )
if( exception_detail::error_info_container * c=x.data_.get() )
if( shared_ptr<exception_detail::error_info_base const> eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) )
{
#ifndef BOOST_NO_RTTI
BOOST_ASSERT( 0!=dynamic_cast<ErrorInfo const *>(eib.get()) );

View File

@ -126,7 +126,7 @@ boost
private:
friend class boost::exception;
friend class boost::exception;
typedef std::map< type_info_, shared_ptr<error_info_base const> > error_info_map;
error_info_map info_;
@ -151,9 +151,10 @@ boost
void
set_data( exception const * e, shared_ptr<exception_detail::error_info_base const> const & x, exception_detail::type_info_ const & typeid_ )
{
if( !e->data_ )
e->data_ = intrusive_ptr<exception_detail::error_info_container>(new exception_detail::error_info_container_impl);
e->data_->set(x,typeid_);
exception_detail::error_info_container * c;
if( !(c=e->data_.get()) )
e->data_.adopt(c=new exception_detail::error_info_container_impl);
c->set(x,typeid_);
}
}

View File

@ -9,6 +9,7 @@
#include <boost/exception/enable_current_exception.hpp>
#include <boost/exception/detail/type_info.hpp>
#include <boost/detail/atomic_count.hpp>
#include <boost/intrusive_ptr.hpp>
#include <stdexcept>
#include <new>