]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Copyright David Abrahams 2002. |
2 | // Distributed under the Boost Software License, Version 1.0. (See | |
3 | // accompanying file LICENSE_1_0.txt or copy at | |
4 | // http://www.boost.org/LICENSE_1_0.txt) | |
5 | #ifndef LIST_DWA2002627_HPP | |
6 | # define LIST_DWA2002627_HPP | |
7 | ||
8 | # include <boost/python/detail/prefix.hpp> | |
9 | ||
10 | # include <boost/python/object.hpp> | |
11 | # include <boost/python/converter/pytype_object_mgr_traits.hpp> | |
12 | # include <boost/python/ssize_t.hpp> | |
13 | ||
14 | namespace boost { namespace python { | |
15 | ||
16 | namespace detail | |
17 | { | |
18 | struct BOOST_PYTHON_DECL list_base : object | |
19 | { | |
20 | void append(object_cref); // append object to end | |
21 | ||
22 | ssize_t count(object_cref value) const; // return number of occurrences of value | |
23 | ||
24 | void extend(object_cref sequence); // extend list by appending sequence elements | |
25 | ||
26 | long index(object_cref value) const; // return index of first occurrence of value | |
27 | ||
28 | void insert(ssize_t index, object_cref); // insert object before index | |
29 | void insert(object const& index, object_cref); | |
30 | ||
31 | object pop(); // remove and return item at index (default last) | |
32 | object pop(ssize_t index); | |
33 | object pop(object const& index); | |
34 | ||
35 | void remove(object_cref value); // remove first occurrence of value | |
36 | ||
37 | void reverse(); // reverse *IN PLACE* | |
38 | ||
39 | void sort(); // sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1 | |
40 | #if PY_VERSION_HEX >= 0x03000000 | |
41 | void sort(args_proxy const &args, | |
42 | kwds_proxy const &kwds); | |
43 | #else | |
44 | void sort(object_cref cmpfunc); | |
45 | #endif | |
46 | ||
47 | protected: | |
48 | list_base(); // new list | |
49 | explicit list_base(object_cref sequence); // new list initialized from sequence's items | |
50 | ||
51 | BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(list_base, object) | |
52 | private: | |
53 | static detail::new_non_null_reference call(object const&); | |
54 | }; | |
55 | } | |
56 | ||
57 | class list : public detail::list_base | |
58 | { | |
59 | typedef detail::list_base base; | |
60 | public: | |
61 | list() {} // new list | |
62 | ||
63 | template <class T> | |
64 | explicit list(T const& sequence) | |
65 | : base(object(sequence)) | |
66 | { | |
67 | } | |
68 | ||
69 | template <class T> | |
70 | void append(T const& x) | |
71 | { | |
72 | base::append(object(x)); | |
73 | } | |
74 | ||
75 | template <class T> | |
76 | long count(T const& value) const | |
77 | { | |
78 | return base::count(object(value)); | |
79 | } | |
80 | ||
81 | template <class T> | |
82 | void extend(T const& x) | |
83 | { | |
84 | base::extend(object(x)); | |
85 | } | |
86 | ||
87 | template <class T> | |
88 | long index(T const& x) const | |
89 | { | |
90 | return base::index(object(x)); | |
91 | } | |
92 | ||
93 | template <class T> | |
94 | void insert(ssize_t index, T const& x) // insert object before index | |
95 | { | |
96 | base::insert(index, object(x)); | |
97 | } | |
98 | ||
99 | template <class T> | |
100 | void insert(object const& index, T const& x) // insert object before index | |
101 | { | |
102 | base::insert(index, object(x)); | |
103 | } | |
104 | ||
105 | object pop() { return base::pop(); } | |
106 | object pop(ssize_t index) { return base::pop(index); } | |
107 | ||
108 | template <class T> | |
109 | object pop(T const& index) | |
110 | { | |
111 | return base::pop(object(index)); | |
112 | } | |
113 | ||
114 | template <class T> | |
115 | void remove(T const& value) | |
116 | { | |
117 | base::remove(object(value)); | |
118 | } | |
119 | ||
120 | #if PY_VERSION_HEX <= 0x03000000 | |
121 | void sort() { base::sort(); } | |
122 | ||
123 | template <class T> | |
124 | void sort(T const& value) | |
125 | { | |
126 | base::sort(object(value)); | |
127 | } | |
128 | #endif | |
129 | ||
130 | public: // implementation detail -- for internal use only | |
131 | BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(list, base) | |
132 | }; | |
133 | ||
134 | // | |
135 | // Converter Specializations | |
136 | // | |
137 | namespace converter | |
138 | { | |
139 | template <> | |
140 | struct object_manager_traits<list> | |
141 | : pytype_object_manager_traits<&PyList_Type,list> | |
142 | { | |
143 | }; | |
144 | } | |
145 | ||
146 | }} // namespace boost::python | |
147 | ||
148 | #endif // LIST_DWA2002627_HPP |