Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef DESTROY_DWA2002221_HPP Chris@16: # define DESTROY_DWA2002221_HPP Chris@16: Chris@16: # include Chris@16: # include Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: # include Chris@16: # endif Chris@16: namespace boost { namespace python { namespace detail { Chris@16: Chris@16: template < Chris@16: bool array Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: , bool enum_ // vc7 has a problem destroying enums Chris@16: # endif Chris@16: > struct value_destroyer; Chris@16: Chris@16: template <> Chris@16: struct value_destroyer< Chris@16: false Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: , false Chris@16: # endif Chris@16: > Chris@16: { Chris@16: template Chris@16: static void execute(T const volatile* p) Chris@16: { Chris@16: p->~T(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct value_destroyer< Chris@16: true Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: , false Chris@16: # endif Chris@16: > Chris@16: { Chris@16: template Chris@16: static void execute(A*, T const volatile* const first) Chris@16: { Chris@16: for (T const volatile* p = first; p != first + sizeof(A)/sizeof(T); ++p) Chris@16: { Chris@16: value_destroyer< Chris@16: boost::is_array::value Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: , boost::is_enum::value Chris@16: # endif Chris@16: >::execute(p); Chris@16: } Chris@16: } Chris@16: Chris@16: template Chris@16: static void execute(T const volatile* p) Chris@16: { Chris@16: execute(p, *p); Chris@16: } Chris@16: }; Chris@16: Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: template <> Chris@16: struct value_destroyer Chris@16: { Chris@16: template Chris@16: static void execute(T const volatile*) Chris@16: { Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct value_destroyer Chris@16: { Chris@16: template Chris@16: static void execute(T const volatile*) Chris@16: { Chris@16: } Chris@16: }; Chris@16: # endif Chris@16: template Chris@16: inline void destroy_referent_impl(void* p, T& (*)()) Chris@16: { Chris@16: // note: cv-qualification needed for MSVC6 Chris@16: // must come *before* T for metrowerks Chris@16: value_destroyer< Chris@16: (boost::is_array::value) Chris@16: # if BOOST_WORKAROUND(BOOST_MSVC, == 1300) Chris@16: , (boost::is_enum::value) Chris@16: # endif Chris@16: >::execute((const volatile T*)p); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void destroy_referent(void* p, T(*)() = 0) Chris@16: { Chris@16: destroy_referent_impl(p, (T(*)())0); Chris@16: } Chris@16: Chris@16: }}} // namespace boost::python::detail Chris@16: Chris@16: #endif // DESTROY_DWA2002221_HPP