diff options
Diffstat (limited to 'boost/python/other.hpp')
-rw-r--r-- | boost/python/other.hpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/boost/python/other.hpp b/boost/python/other.hpp new file mode 100644 index 0000000000..eeece99b7d --- /dev/null +++ b/boost/python/other.hpp @@ -0,0 +1,114 @@ +#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 |