From 1cc65a47eb708d0569319481bda49ff8fe8ad247 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Sun, 6 Jan 2002 14:33:33 +0000 Subject: [PATCH] Added wrapper for PyObject* [SVN r12228] --- include/boost/python/converter/wrap.hpp | 29 +++++++++++++++++++--- include/boost/python/converter/wrapper.hpp | 2 ++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/include/boost/python/converter/wrap.hpp b/include/boost/python/converter/wrap.hpp index e26cf0f6..ec87f73d 100644 --- a/include/boost/python/converter/wrap.hpp +++ b/include/boost/python/converter/wrap.hpp @@ -16,6 +16,7 @@ namespace boost { namespace python { namespace converter { struct BOOST_PYTHON_DECL wrapper_base; +extern BOOST_PYTHON_DECL body& identity_wrapper; template struct wrapper; @@ -66,13 +67,33 @@ struct wrap_ : wrap_more_ ~wrap_(); }; + +// Specialization for PyObject* +template <> +struct wrap_more_ : wrap_base +{ + protected: + typedef PyObject* source_t; + + public: // member functions + wrap_more_(handle& prev) + : wrap_base(&identity_wrapper, prev) {} + + PyObject* operator()(source_t x) const { return x; } + + protected: // constructor for wrap_, below + wrap_more_() + : wrap_base(&identity_wrapper) {} + private: + friend class wrapper; +}; + // // implementations // - inline wrap_base::wrap_base(body* body, handle& prev) - : handle(body, prev), - m_target(0) + : handle(body, prev) + , m_target(0) { } @@ -119,7 +140,7 @@ template PyObject* wrap_more_::operator()(source_t x) const { return static_cast*>( - get_body())->do_conversion(*this, source_holder(x)); + this->get_body())->do_conversion(*this, source_holder(x)); } template diff --git a/include/boost/python/converter/wrapper.hpp b/include/boost/python/converter/wrapper.hpp index 49c32186..80afae46 100644 --- a/include/boost/python/converter/wrapper.hpp +++ b/include/boost/python/converter/wrapper.hpp @@ -27,6 +27,8 @@ struct BOOST_PYTHON_DECL wrapper_base : body virtual PyObject* do_conversion(wrap_base const&, source_holder_base const&) const = 0; }; +extern BOOST_PYTHON_DECL body& identity_wrapper; + template struct wrapper : wrapper_base {