// 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 ARG_FROM_PYTHON_DWA2002128_HPP

# define ARG_FROM_PYTHON_DWA2002128_HPP



# include <boost/python/detail/prefix.hpp>

# include <boost/python/converter/arg_from_python.hpp>

# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \

    || BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800))

# include <boost/type_traits/remove_cv.hpp>

#endif



namespace boost { namespace python { 



template <class T>

struct arg_from_python

    : converter::select_arg_from_python<

# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \

    || BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800))

          typename boost::remove_cv<T>::type

# else

          T

# endif 

      >::type

{

    typedef typename converter::select_arg_from_python<

# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \

    || BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(800))

          typename boost::remove_cv<T>::type

# else

          T

# endif 

        >::type base;

    

    arg_from_python(PyObject*);

};



// specialization for PyObject*

template <>

struct arg_from_python<PyObject*>

{

    typedef PyObject* result_type;

    

    arg_from_python(PyObject* p) : m_source(p) {}

    bool convertible() const { return true; }

    PyObject* operator()() const { return m_source; }

 private:

    PyObject* m_source;

};



template <>

struct arg_from_python<PyObject* const&>

{

    typedef PyObject* const& result_type;

    

    arg_from_python(PyObject* p) : m_source(p) {}

    bool convertible() const { return true; }

    PyObject*const& operator()() const { return m_source; }

 private:

    PyObject* m_source;

};



//

// implementations

//

template <class T>

inline arg_from_python<T>::arg_from_python(PyObject* source)

    : base(source)

{

}



}} // namespace boost::python



#endif // ARG_FROM_PYTHON_DWA2002128_HPP

