sl@0: // Copyright David Abrahams 2002.
sl@0: // Distributed under the Boost Software License, Version 1.0. (See
sl@0: // accompanying file LICENSE_1_0.txt or copy at
sl@0: // http://www.boost.org/LICENSE_1_0.txt)
sl@0: #ifndef BACK_REFERENCE_DWA2002510_HPP
sl@0: # define BACK_REFERENCE_DWA2002510_HPP
sl@0: 
sl@0: # include <boost/python/detail/prefix.hpp>
sl@0: 
sl@0: # include <boost/python/object_fwd.hpp>
sl@0: # include <boost/python/detail/dependent.hpp>
sl@0: # include <boost/python/detail/raw_pyobject.hpp>
sl@0: 
sl@0: namespace boost { namespace python { 
sl@0: 
sl@0: template <class T>
sl@0: struct back_reference
sl@0: {
sl@0:  private: // types
sl@0:     typedef typename detail::dependent<object,T>::type source_t;
sl@0:  public:
sl@0:     typedef T type;
sl@0:     
sl@0:     back_reference(PyObject*, T);
sl@0:     source_t const& source() const;
sl@0:     T get() const;
sl@0:  private:
sl@0:     source_t m_source;
sl@0:     T m_value;
sl@0: };
sl@0: 
sl@0: # ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
sl@0: template<typename T>
sl@0: class is_back_reference
sl@0: {
sl@0:  public:
sl@0:     BOOST_STATIC_CONSTANT(bool, value = false); 
sl@0: };
sl@0: 
sl@0: template<typename T>
sl@0: class is_back_reference<back_reference<T> >
sl@0: {
sl@0:  public:
sl@0:     BOOST_STATIC_CONSTANT(bool, value = true);
sl@0: };
sl@0: 
sl@0: # else // no partial specialization
sl@0: 
sl@0: }} // namespace boost::python
sl@0: 
sl@0: #include <boost/type.hpp>
sl@0: 
sl@0: namespace boost { namespace python {
sl@0: 
sl@0: namespace detail
sl@0: {
sl@0:   typedef char (&yes_back_reference_t)[1];
sl@0:   typedef char (&no_back_reference_t)[2];
sl@0:       
sl@0:   no_back_reference_t is_back_reference_test(...);
sl@0: 
sl@0:   template<typename T>
sl@0:   yes_back_reference_t is_back_reference_test(boost::type< back_reference<T> >);
sl@0: }
sl@0: 
sl@0: template<typename T>
sl@0: class is_back_reference
sl@0: {
sl@0:  public:
sl@0:     BOOST_STATIC_CONSTANT(
sl@0:         bool, value = (
sl@0:             sizeof(detail::is_back_reference_test(boost::type<T>()))
sl@0:             == sizeof(detail::yes_back_reference_t)));
sl@0: };
sl@0: 
sl@0: # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
sl@0: 
sl@0: //
sl@0: // implementations
sl@0: //
sl@0: template <class T>
sl@0: back_reference<T>::back_reference(PyObject* p, T x)
sl@0:     : m_source(detail::borrowed_reference(p))
sl@0:       , m_value(x)
sl@0: {
sl@0: }
sl@0: 
sl@0: template <class T>
sl@0: typename back_reference<T>::source_t const& back_reference<T>::source() const
sl@0: {
sl@0:     return m_source;
sl@0: }
sl@0: 
sl@0: template <class T>
sl@0: T back_reference<T>::get() const
sl@0: {
sl@0:     return m_value;
sl@0: }
sl@0: 
sl@0: }} // namespace boost::python
sl@0: 
sl@0: #endif // BACK_REFERENCE_DWA2002510_HPP