Chris@16: // Copyright David Abrahams 2002. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: #ifndef PROXY_DWA2002615_HPP Chris@16: # define PROXY_DWA2002615_HPP Chris@16: # include Chris@16: # include Chris@16: # include Chris@16: Chris@16: namespace boost { namespace python { namespace api { Chris@16: Chris@16: template Chris@16: class proxy : public object_operators > Chris@16: { Chris@16: typedef typename Policies::key_type key_type; Chris@16: Chris@16: # if !defined(BOOST_MSVC) || BOOST_MSVC >= 1300 Chris@16: typedef proxy const& assignment_self; Chris@16: # else Chris@16: typedef proxy assignment_self; Chris@16: # endif Chris@16: public: Chris@16: proxy(object const& target, key_type const& key); Chris@16: operator object() const; Chris@16: Chris@16: // to support a[b] = c[d] Chris@16: proxy const& operator=(assignment_self) const; Chris@16: Chris@16: template Chris@16: inline proxy const& operator=(T const& rhs) const Chris@16: { Chris@16: Policies::set(m_target, m_key, object(rhs)); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: public: // implementation detail Chris@16: void del() const; Chris@16: Chris@16: private: Chris@16: object m_target; Chris@16: key_type m_key; Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: inline void del(proxy const& x) Chris@16: { Chris@16: x.del(); Chris@16: } Chris@16: Chris@16: // Chris@16: // implementation Chris@16: // Chris@16: Chris@16: template Chris@16: inline proxy::proxy(object const& target, key_type const& key) Chris@16: : m_target(target), m_key(key) Chris@16: {} Chris@16: Chris@16: template Chris@16: inline proxy::operator object() const Chris@16: { Chris@16: return Policies::get(m_target, m_key); Chris@16: } Chris@16: Chris@16: // to support a[b] = c[d] Chris@16: template Chris@16: inline proxy const& proxy::operator=(typename proxy::assignment_self rhs) const Chris@16: { Chris@16: return *this = python::object(rhs); Chris@16: } Chris@16: Chris@16: # define BOOST_PYTHON_PROXY_INPLACE(op) \ Chris@16: template \ Chris@16: proxy const& operator op(proxy const& lhs, R const& rhs) \ Chris@16: { \ Chris@16: object old(lhs); \ Chris@16: return lhs = (old op rhs); \ Chris@16: } Chris@16: BOOST_PYTHON_PROXY_INPLACE(+=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(-=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(*=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(/=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(%=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(<<=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(>>=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(&=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(^=) Chris@16: BOOST_PYTHON_PROXY_INPLACE(|=) Chris@16: # undef BOOST_PYTHON_PROXY_INPLACE Chris@16: Chris@16: template Chris@16: inline void proxy::del() const Chris@16: { Chris@16: Policies::del(m_target, m_key); Chris@16: } Chris@16: Chris@16: }}} // namespace boost::python::api Chris@16: Chris@16: #endif // PROXY_DWA2002615_HPP