102 lines
2.7 KiB
C++
102 lines
2.7 KiB
C++
|
// 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 PROXY_DWA2002615_HPP
|
||
|
# define PROXY_DWA2002615_HPP
|
||
|
# include <boost/python/detail/prefix.hpp>
|
||
|
# include <boost/python/object_core.hpp>
|
||
|
# include <boost/python/object_operators.hpp>
|
||
|
|
||
|
namespace boost { namespace python { namespace api {
|
||
|
|
||
|
template <class Policies>
|
||
|
class proxy : public object_operators<proxy<Policies> >
|
||
|
{
|
||
|
typedef typename Policies::key_type key_type;
|
||
|
|
||
|
# if !defined(BOOST_MSVC) || BOOST_MSVC >= 1300
|
||
|
typedef proxy const& assignment_self;
|
||
|
# else
|
||
|
typedef proxy assignment_self;
|
||
|
# endif
|
||
|
public:
|
||
|
proxy(object const& target, key_type const& key);
|
||
|
operator object() const;
|
||
|
|
||
|
// to support a[b] = c[d]
|
||
|
proxy const& operator=(assignment_self) const;
|
||
|
|
||
|
template <class T>
|
||
|
inline proxy const& operator=(T const& rhs) const
|
||
|
{
|
||
|
Policies::set(m_target, m_key, object(rhs));
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
public: // implementation detail
|
||
|
void del() const;
|
||
|
|
||
|
private:
|
||
|
object m_target;
|
||
|
key_type m_key;
|
||
|
};
|
||
|
|
||
|
|
||
|
template <class T>
|
||
|
inline void del(proxy<T> const& x)
|
||
|
{
|
||
|
x.del();
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// implementation
|
||
|
//
|
||
|
|
||
|
template <class Policies>
|
||
|
inline proxy<Policies>::proxy(object const& target, key_type const& key)
|
||
|
: m_target(target), m_key(key)
|
||
|
{}
|
||
|
|
||
|
template <class Policies>
|
||
|
inline proxy<Policies>::operator object() const
|
||
|
{
|
||
|
return Policies::get(m_target, m_key);
|
||
|
}
|
||
|
|
||
|
// to support a[b] = c[d]
|
||
|
template <class Policies>
|
||
|
inline proxy<Policies> const& proxy<Policies>::operator=(typename proxy::assignment_self rhs) const
|
||
|
{
|
||
|
return *this = python::object(rhs);
|
||
|
}
|
||
|
|
||
|
# define BOOST_PYTHON_PROXY_INPLACE(op) \
|
||
|
template <class Policies, class R> \
|
||
|
proxy<Policies> const& operator op(proxy<Policies> const& lhs, R const& rhs) \
|
||
|
{ \
|
||
|
object old(lhs); \
|
||
|
return lhs = (old op rhs); \
|
||
|
}
|
||
|
BOOST_PYTHON_PROXY_INPLACE(+=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(-=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(*=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(/=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(%=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(<<=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(>>=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(&=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(^=)
|
||
|
BOOST_PYTHON_PROXY_INPLACE(|=)
|
||
|
# undef BOOST_PYTHON_PROXY_INPLACE
|
||
|
|
||
|
template <class Policies>
|
||
|
inline void proxy<Policies>::del() const
|
||
|
{
|
||
|
Policies::del(m_target, m_key);
|
||
|
}
|
||
|
|
||
|
}}} // namespace boost::python::api
|
||
|
|
||
|
#endif // PROXY_DWA2002615_HPP
|