Added boost header
This commit is contained in:
84
test/external/boost/signals2/deconstruct_ptr.hpp
vendored
Normal file
84
test/external/boost/signals2/deconstruct_ptr.hpp
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
// DEPRECATED in favor of adl_postconstruct and adl_predestruct with
|
||||
// deconstruct<T>().
|
||||
// A factory function for creating a shared_ptr that enhances the plain
|
||||
// shared_ptr constructors by adding support for postconstructors
|
||||
// and predestructors through the boost::signals2::postconstructible and
|
||||
// boost::signals2::predestructible base classes.
|
||||
//
|
||||
// Copyright Frank Mori Hess 2007-2008.
|
||||
//
|
||||
// Use, modification and
|
||||
// distribution is subject to 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 BOOST_SIGNALS2_DECONSTRUCT_PTR_HPP
|
||||
#define BOOST_SIGNALS2_DECONSTRUCT_PTR_HPP
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/checked_delete.hpp>
|
||||
#include <boost/signals2/postconstructible.hpp>
|
||||
#include <boost/signals2/predestructible.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
namespace boost
|
||||
{
|
||||
namespace signals2
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
extern inline void do_postconstruct(const postconstructible *ptr)
|
||||
{
|
||||
postconstructible *nonconst_ptr = const_cast<postconstructible*>(ptr);
|
||||
nonconst_ptr->postconstruct();
|
||||
}
|
||||
extern inline void do_postconstruct(...)
|
||||
{
|
||||
}
|
||||
extern inline void do_predestruct(...)
|
||||
{
|
||||
}
|
||||
extern inline void do_predestruct(const predestructible *ptr)
|
||||
{
|
||||
try
|
||||
{
|
||||
predestructible *nonconst_ptr = const_cast<predestructible*>(ptr);
|
||||
nonconst_ptr->predestruct();
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
BOOST_ASSERT(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> class predestructing_deleter
|
||||
{
|
||||
public:
|
||||
void operator()(const T *ptr) const
|
||||
{
|
||||
detail::do_predestruct(ptr);
|
||||
checked_delete(ptr);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
shared_ptr<T> deconstruct_ptr(T *ptr)
|
||||
{
|
||||
if(ptr == 0) return shared_ptr<T>(ptr);
|
||||
shared_ptr<T> shared(ptr, boost::signals2::predestructing_deleter<T>());
|
||||
detail::do_postconstruct(ptr);
|
||||
return shared;
|
||||
}
|
||||
template<typename T, typename D>
|
||||
shared_ptr<T> deconstruct_ptr(T *ptr, D deleter)
|
||||
{
|
||||
shared_ptr<T> shared(ptr, deleter);
|
||||
if(ptr == 0) return shared;
|
||||
detail::do_postconstruct(ptr);
|
||||
return shared;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // BOOST_SIGNALS2_DECONSTRUCT_PTR_HPP
|
||||
Reference in New Issue
Block a user