Chris@16
|
1 // Copyright David Abrahams 2002.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
3 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5 #ifndef OBJECT_SLICES_DWA2002615_HPP
|
Chris@16
|
6 # define OBJECT_SLICES_DWA2002615_HPP
|
Chris@16
|
7
|
Chris@16
|
8 # include <boost/python/detail/prefix.hpp>
|
Chris@16
|
9
|
Chris@16
|
10 # include <boost/python/proxy.hpp>
|
Chris@16
|
11 # include <boost/python/object_core.hpp>
|
Chris@16
|
12 # include <boost/python/object_protocol.hpp>
|
Chris@16
|
13 # include <boost/python/handle.hpp>
|
Chris@16
|
14 # include <utility>
|
Chris@16
|
15
|
Chris@16
|
16 namespace boost { namespace python { namespace api {
|
Chris@16
|
17
|
Chris@16
|
18 struct const_slice_policies
|
Chris@16
|
19 {
|
Chris@16
|
20 typedef std::pair<handle<>, handle<> > key_type;
|
Chris@16
|
21 static object get(object const& target, key_type const& key);
|
Chris@16
|
22 };
|
Chris@16
|
23
|
Chris@16
|
24 struct slice_policies : const_slice_policies
|
Chris@16
|
25 {
|
Chris@16
|
26 static object const& set(object const& target, key_type const& key, object const& value);
|
Chris@16
|
27 static void del(object const& target, key_type const& key);
|
Chris@16
|
28 };
|
Chris@16
|
29
|
Chris@16
|
30 template <class T, class U>
|
Chris@16
|
31 inline slice_policies::key_type slice_key(T x, U y)
|
Chris@16
|
32 {
|
Chris@16
|
33 return slice_policies::key_type(handle<>(x), handle<>(y));
|
Chris@16
|
34 }
|
Chris@16
|
35
|
Chris@16
|
36 //
|
Chris@16
|
37 // implementation
|
Chris@16
|
38 //
|
Chris@16
|
39 template <class U>
|
Chris@16
|
40 object_slice
|
Chris@16
|
41 object_operators<U>::slice(object_cref start, object_cref finish)
|
Chris@16
|
42 {
|
Chris@16
|
43 object_cref2 x = *static_cast<U*>(this);
|
Chris@16
|
44 return object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr())));
|
Chris@16
|
45 }
|
Chris@16
|
46
|
Chris@16
|
47 template <class U>
|
Chris@16
|
48 const_object_slice
|
Chris@16
|
49 object_operators<U>::slice(object_cref start, object_cref finish) const
|
Chris@16
|
50 {
|
Chris@16
|
51 object_cref2 x = *static_cast<U const*>(this);
|
Chris@16
|
52 return const_object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr())));
|
Chris@16
|
53 }
|
Chris@16
|
54
|
Chris@16
|
55 template <class U>
|
Chris@16
|
56 object_slice
|
Chris@16
|
57 object_operators<U>::slice(slice_nil, object_cref finish)
|
Chris@16
|
58 {
|
Chris@16
|
59 object_cref2 x = *static_cast<U*>(this);
|
Chris@16
|
60 return object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr())));
|
Chris@16
|
61 }
|
Chris@16
|
62
|
Chris@16
|
63 template <class U>
|
Chris@16
|
64 const_object_slice
|
Chris@16
|
65 object_operators<U>::slice(slice_nil, object_cref finish) const
|
Chris@16
|
66 {
|
Chris@16
|
67 object_cref2 x = *static_cast<U const*>(this);
|
Chris@16
|
68 return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr())));
|
Chris@16
|
69 }
|
Chris@16
|
70
|
Chris@16
|
71 template <class U>
|
Chris@16
|
72 object_slice
|
Chris@16
|
73 object_operators<U>::slice(slice_nil, slice_nil)
|
Chris@16
|
74 {
|
Chris@16
|
75 object_cref2 x = *static_cast<U*>(this);
|
Chris@16
|
76 return object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0)));
|
Chris@16
|
77 }
|
Chris@16
|
78
|
Chris@16
|
79 template <class U>
|
Chris@16
|
80 const_object_slice
|
Chris@16
|
81 object_operators<U>::slice(slice_nil, slice_nil) const
|
Chris@16
|
82 {
|
Chris@16
|
83 object_cref2 x = *static_cast<U const*>(this);
|
Chris@16
|
84 return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0)));
|
Chris@16
|
85 }
|
Chris@16
|
86
|
Chris@16
|
87 template <class U>
|
Chris@16
|
88 object_slice
|
Chris@16
|
89 object_operators<U>::slice(object_cref start, slice_nil)
|
Chris@16
|
90 {
|
Chris@16
|
91 object_cref2 x = *static_cast<U*>(this);
|
Chris@16
|
92 return object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0)));
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95 template <class U>
|
Chris@16
|
96 const_object_slice
|
Chris@16
|
97 object_operators<U>::slice(object_cref start, slice_nil) const
|
Chris@16
|
98 {
|
Chris@16
|
99 object_cref2 x = *static_cast<U const*>(this);
|
Chris@16
|
100 return const_object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0)));
|
Chris@16
|
101 }
|
Chris@16
|
102 # if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
|
Chris@16
|
103 template <class U>
|
Chris@16
|
104 template <class T, class V>
|
Chris@16
|
105 inline const_object_slice
|
Chris@16
|
106 object_operators<U>::slice(T const& start, V const& end) const
|
Chris@16
|
107 {
|
Chris@16
|
108 return this->slice(
|
Chris@16
|
109 typename slice_bound<T>::type(start)
|
Chris@16
|
110 , typename slice_bound<V>::type(end));
|
Chris@16
|
111 }
|
Chris@16
|
112
|
Chris@16
|
113 template <class U>
|
Chris@16
|
114 template <class T, class V>
|
Chris@16
|
115 inline object_slice
|
Chris@16
|
116 object_operators<U>::slice(T const& start, V const& end)
|
Chris@16
|
117 {
|
Chris@16
|
118 return this->slice(
|
Chris@16
|
119 typename slice_bound<T>::type(start)
|
Chris@16
|
120 , typename slice_bound<V>::type(end));
|
Chris@16
|
121 }
|
Chris@16
|
122 # endif
|
Chris@16
|
123
|
Chris@16
|
124
|
Chris@16
|
125 inline object const_slice_policies::get(object const& target, key_type const& key)
|
Chris@16
|
126 {
|
Chris@16
|
127 return getslice(target, key.first, key.second);
|
Chris@16
|
128 }
|
Chris@16
|
129
|
Chris@16
|
130 inline object const& slice_policies::set(
|
Chris@16
|
131 object const& target
|
Chris@16
|
132 , key_type const& key
|
Chris@16
|
133 , object const& value)
|
Chris@16
|
134 {
|
Chris@16
|
135 setslice(target, key.first, key.second, value);
|
Chris@16
|
136 return value;
|
Chris@16
|
137 }
|
Chris@16
|
138
|
Chris@16
|
139 inline void slice_policies::del(
|
Chris@16
|
140 object const& target
|
Chris@16
|
141 , key_type const& key)
|
Chris@16
|
142 {
|
Chris@16
|
143 delslice(target, key.first, key.second);
|
Chris@16
|
144 }
|
Chris@16
|
145
|
Chris@16
|
146 }}} // namespace boost::python::api
|
Chris@16
|
147
|
Chris@16
|
148 #endif // OBJECT_SLICES_DWA2002615_HPP
|