// Copyright David Abrahams 2002. | |
// 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 DESTROY_DWA2002221_HPP | |
# define DESTROY_DWA2002221_HPP | |
# include <boost/type_traits/is_array.hpp> | |
# include <boost/detail/workaround.hpp> | |
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) | |
# include <boost/type_traits/is_enum.hpp> | |
# endif | |
namespace boost { namespace python { namespace detail { | |
template < | |
bool array | |
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) | |
, bool enum_ // vc7 has a problem destroying enums | |
# endif | |
> struct value_destroyer; | |
template <> | |
struct value_destroyer< | |
false | |
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) | |
, false | |
# endif | |
> | |
{ | |
template <class T> | |
static void execute(T const volatile* p) | |
{ | |
p->~T(); | |
} | |
}; | |
template <> | |
struct value_destroyer< | |
true | |
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) | |
, false | |
# endif | |
> | |
{ | |
template <class A, class T> | |
static void execute(A*, T const volatile* const first) | |
{ | |
for (T const volatile* p = first; p != first + sizeof(A)/sizeof(T); ++p) | |
{ | |
value_destroyer< | |
boost::is_array<T>::value | |
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) | |
, boost::is_enum<T>::value | |
# endif | |
>::execute(p); | |
} | |
} | |
template <class T> | |
static void execute(T const volatile* p) | |
{ | |
execute(p, *p); | |
} | |
}; | |
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) | |
template <> | |
struct value_destroyer<true,true> | |
{ | |
template <class T> | |
static void execute(T const volatile*) | |
{ | |
} | |
}; | |
template <> | |
struct value_destroyer<false,true> | |
{ | |
template <class T> | |
static void execute(T const volatile*) | |
{ | |
} | |
}; | |
# endif | |
template <class T> | |
inline void destroy_referent_impl(void* p, T& (*)()) | |
{ | |
// note: cv-qualification needed for MSVC6 | |
// must come *before* T for metrowerks | |
value_destroyer< | |
(boost::is_array<T>::value) | |
# if BOOST_WORKAROUND(BOOST_MSVC, == 1300) | |
, (boost::is_enum<T>::value) | |
# endif | |
>::execute((const volatile T*)p); | |
} | |
template <class T> | |
inline void destroy_referent(void* p, T(*)() = 0) | |
{ | |
destroy_referent_impl(p, (T(*)())0); | |
} | |
}}} // namespace boost::python::detail | |
#endif // DESTROY_DWA2002221_HPP |