#ifndef OTHER_DWA20020601_HPP | |
# define OTHER_DWA20020601_HPP | |
# include <boost/python/detail/prefix.hpp> | |
// 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) | |
# if _MSC_VER+0 >= 1020 | |
# pragma once | |
# endif | |
# include <boost/config.hpp> | |
namespace boost { namespace python { | |
template<class T> struct other | |
{ | |
typedef T type; | |
}; | |
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | |
namespace detail | |
{ | |
template<typename T> | |
class is_other | |
{ | |
public: | |
BOOST_STATIC_CONSTANT(bool, value = false); | |
}; | |
template<typename T> | |
class is_other<other<T> > | |
{ | |
public: | |
BOOST_STATIC_CONSTANT(bool, value = true); | |
}; | |
template<typename T> | |
class unwrap_other | |
{ | |
public: | |
typedef T type; | |
}; | |
template<typename T> | |
class unwrap_other<other<T> > | |
{ | |
public: | |
typedef T type; | |
}; | |
} | |
# else // no partial specialization | |
}} // namespace boost::python | |
#include <boost/type.hpp> | |
namespace boost { namespace python { | |
namespace detail | |
{ | |
typedef char (&yes_other_t)[1]; | |
typedef char (&no_other_t)[2]; | |
no_other_t is_other_test(...); | |
template<typename T> | |
yes_other_t is_other_test(type< other<T> >); | |
template<bool wrapped> | |
struct other_unwrapper | |
{ | |
template <class T> | |
struct apply | |
{ | |
typedef T type; | |
}; | |
}; | |
template<> | |
struct other_unwrapper<true> | |
{ | |
template <class T> | |
struct apply | |
{ | |
typedef typename T::type type; | |
}; | |
}; | |
template<typename T> | |
class is_other | |
{ | |
public: | |
BOOST_STATIC_CONSTANT( | |
bool, value = ( | |
sizeof(detail::is_other_test(type<T>())) | |
== sizeof(detail::yes_other_t))); | |
}; | |
template <typename T> | |
class unwrap_other | |
: public detail::other_unwrapper< | |
is_other<T>::value | |
>::template apply<T> | |
{}; | |
} | |
# endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | |
}} // namespace boost::python | |
#endif // #ifndef OTHER_DWA20020601_HPP |