98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// 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;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    typedef proxy const& assignment_self;
							 | 
						||
| 
								 | 
							
								 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
							 |