os/ossrv/ossrv_pub/boost_apis/boost/python/detail/destroy.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright David Abrahams 2002.
     2 // Distributed under the Boost Software License, Version 1.0. (See
     3 // accompanying file LICENSE_1_0.txt or copy at
     4 // http://www.boost.org/LICENSE_1_0.txt)
     5 #ifndef DESTROY_DWA2002221_HPP
     6 # define DESTROY_DWA2002221_HPP
     7 
     8 # include <boost/type_traits/is_array.hpp>
     9 # include <boost/detail/workaround.hpp>
    10 # if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
    11 #  include <boost/type_traits/is_enum.hpp>
    12 # endif 
    13 namespace boost { namespace python { namespace detail { 
    14 
    15 template <
    16     bool array
    17 # if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
    18   , bool enum_  // vc7 has a problem destroying enums
    19 # endif 
    20     > struct value_destroyer;
    21     
    22 template <>
    23 struct value_destroyer<
    24     false
    25 # if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
    26   , false
    27 # endif 
    28     >
    29 {
    30     template <class T>
    31     static void execute(T const volatile* p)
    32     {
    33         p->T::~T();
    34     }
    35 };
    36 
    37 template <>
    38 struct value_destroyer<
    39     true
    40 # if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
    41   , false
    42 # endif 
    43     >
    44 {
    45     template <class A, class T>
    46     static void execute(A*, T const volatile* const first)
    47     {
    48         for (T const volatile* p = first; p != first + sizeof(A)/sizeof(T); ++p)
    49         {
    50             value_destroyer<
    51                 boost::is_array<T>::value
    52 # if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
    53               , boost::is_enum<T>::value
    54 # endif 
    55             >::execute(p);
    56         }
    57     }
    58     
    59     template <class T>
    60     static void execute(T const volatile* p)
    61     {
    62         execute(p, *p);
    63     }
    64 };
    65 
    66 # if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
    67 template <>
    68 struct value_destroyer<true,true>
    69 {
    70     template <class T>
    71     static void execute(T const volatile*)
    72     {
    73     }
    74 };
    75 
    76 template <>
    77 struct value_destroyer<false,true>
    78 {
    79     template <class T>
    80     static void execute(T const volatile*)
    81     {
    82     }
    83 };
    84 # endif 
    85 template <class T>
    86 inline void destroy_referent_impl(void* p, T& (*)())
    87 {
    88     // note: cv-qualification needed for MSVC6
    89     // must come *before* T for metrowerks
    90     value_destroyer<
    91          (boost::is_array<T>::value)
    92 # if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
    93        , (boost::is_enum<T>::value)
    94 # endif 
    95     >::execute((const volatile T*)p);
    96 }
    97 
    98 template <class T>
    99 inline void destroy_referent(void* p, T(*)() = 0)
   100 {
   101     destroy_referent_impl(p, (T(*)())0);
   102 }
   103 
   104 }}} // namespace boost::python::detail
   105 
   106 #endif // DESTROY_DWA2002221_HPP