| #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 |