123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- // 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)
- #ifndef BACK_REFERENCE_DWA2002510_HPP
- # define BACK_REFERENCE_DWA2002510_HPP
- # include <boost/python/detail/prefix.hpp>
- # include <boost/python/object_fwd.hpp>
- # include <boost/python/detail/dependent.hpp>
- # include <boost/python/detail/raw_pyobject.hpp>
- namespace boost { namespace python {
- template <class T>
- struct back_reference
- {
- private: // types
- typedef typename detail::dependent<object,T>::type source_t;
- public:
- typedef T type;
-
- back_reference(PyObject*, T);
- source_t const& source() const;
- T get() const;
- private:
- source_t m_source;
- T m_value;
- };
- # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- template<typename T>
- class is_back_reference
- {
- public:
- BOOST_STATIC_CONSTANT(bool, value = false);
- };
- template<typename T>
- class is_back_reference<back_reference<T> >
- {
- public:
- BOOST_STATIC_CONSTANT(bool, value = true);
- };
- # else // no partial specialization
- }} // namespace boost::python
- #include <boost/type.hpp>
- namespace boost { namespace python {
- namespace detail
- {
- typedef char (&yes_back_reference_t)[1];
- typedef char (&no_back_reference_t)[2];
-
- no_back_reference_t is_back_reference_test(...);
- template<typename T>
- yes_back_reference_t is_back_reference_test(boost::type< back_reference<T> >);
- }
- template<typename T>
- class is_back_reference
- {
- public:
- BOOST_STATIC_CONSTANT(
- bool, value = (
- sizeof(detail::is_back_reference_test(boost::type<T>()))
- == sizeof(detail::yes_back_reference_t)));
- };
- # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
- //
- // implementations
- //
- template <class T>
- back_reference<T>::back_reference(PyObject* p, T x)
- : m_source(detail::borrowed_reference(p))
- , m_value(x)
- {
- }
- template <class T>
- typename back_reference<T>::source_t const& back_reference<T>::source() const
- {
- return m_source;
- }
- template <class T>
- T back_reference<T>::get() const
- {
- return m_value;
- }
- }} // namespace boost::python
- #endif // BACK_REFERENCE_DWA2002510_HPP
|