147 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			147 lines
		
	
	
		
			4.1 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 OBJECT_SLICES_DWA2002615_HPP | ||
|  | # define OBJECT_SLICES_DWA2002615_HPP | ||
|  | 
 | ||
|  | # include <boost/python/detail/prefix.hpp> | ||
|  | 
 | ||
|  | # include <boost/python/proxy.hpp> | ||
|  | # include <boost/python/object_core.hpp> | ||
|  | # include <boost/python/object_protocol.hpp> | ||
|  | # include <boost/python/handle.hpp> | ||
|  | # include <utility> | ||
|  | 
 | ||
|  | namespace boost { namespace python { namespace api { | ||
|  | 
 | ||
|  | struct const_slice_policies | ||
|  | { | ||
|  |     typedef std::pair<handle<>, handle<> > key_type; | ||
|  |     static object get(object const& target, key_type const& key); | ||
|  | }; | ||
|  |    | ||
|  | struct slice_policies : const_slice_policies | ||
|  | { | ||
|  |     static object const& set(object const& target, key_type const& key, object const& value); | ||
|  |     static void del(object const& target, key_type const& key); | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T, class U> | ||
|  | inline slice_policies::key_type slice_key(T x, U y) | ||
|  | { | ||
|  |     return slice_policies::key_type(handle<>(x), handle<>(y)); | ||
|  | } | ||
|  |      | ||
|  | // | ||
|  | // implementation | ||
|  | // | ||
|  | template <class U> | ||
|  | object_slice | ||
|  | object_operators<U>::slice(object_cref start, object_cref finish) | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U*>(this); | ||
|  |     return object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr()))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | const_object_slice | ||
|  | object_operators<U>::slice(object_cref start, object_cref finish) const | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U const*>(this); | ||
|  |     return const_object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr()))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | object_slice | ||
|  | object_operators<U>::slice(slice_nil, object_cref finish) | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U*>(this); | ||
|  |     return object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr()))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | const_object_slice | ||
|  | object_operators<U>::slice(slice_nil, object_cref finish) const | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U const*>(this); | ||
|  |     return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr()))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | object_slice | ||
|  | object_operators<U>::slice(slice_nil, slice_nil) | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U*>(this); | ||
|  |     return object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | const_object_slice | ||
|  | object_operators<U>::slice(slice_nil, slice_nil) const | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U const*>(this); | ||
|  |     return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | object_slice | ||
|  | object_operators<U>::slice(object_cref start, slice_nil) | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U*>(this); | ||
|  |     return object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | const_object_slice | ||
|  | object_operators<U>::slice(object_cref start, slice_nil) const | ||
|  | { | ||
|  |     object_cref2 x = *static_cast<U const*>(this); | ||
|  |     return const_object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0))); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | template <class T, class V> | ||
|  | inline const_object_slice | ||
|  | object_operators<U>::slice(T const& start, V const& end) const | ||
|  | { | ||
|  |     return this->slice( | ||
|  |         typename slice_bound<T>::type(start) | ||
|  |         , typename slice_bound<V>::type(end)); | ||
|  | } | ||
|  | 
 | ||
|  | template <class U> | ||
|  | template <class T, class V> | ||
|  | inline object_slice | ||
|  | object_operators<U>::slice(T const& start, V const& end) | ||
|  | { | ||
|  |     return this->slice( | ||
|  |         typename slice_bound<T>::type(start) | ||
|  |         , typename slice_bound<V>::type(end)); | ||
|  | } | ||
|  | 
 | ||
|  | inline object const_slice_policies::get(object const& target, key_type const& key) | ||
|  | { | ||
|  |     return getslice(target, key.first, key.second); | ||
|  | } | ||
|  | 
 | ||
|  | inline object const& slice_policies::set( | ||
|  |     object const& target | ||
|  |     , key_type const& key | ||
|  |     , object const& value) | ||
|  | { | ||
|  |     setslice(target, key.first, key.second, value); | ||
|  |     return value; | ||
|  | } | ||
|  | 
 | ||
|  | inline void slice_policies::del( | ||
|  |     object const& target | ||
|  |     , key_type const& key) | ||
|  | { | ||
|  |     delslice(target, key.first, key.second); | ||
|  | } | ||
|  | 
 | ||
|  | }}} // namespace boost::python::api | ||
|  | 
 | ||
|  | #endif // OBJECT_SLICES_DWA2002615_HPP |