Skip to content

Commit 72ccea5

Browse files
committed
Python std::unordered_map std::unordered_multimap improvements
- Fixes for -builtin - Fix missing iterator support
1 parent 603285e commit 72ccea5

File tree

3 files changed

+60
-16
lines changed

3 files changed

+60
-16
lines changed

Examples/test-suite/python/cpp11_hash_tables_runme.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ def swig_assert_equal(a, b):
66

77
for x in [cpp11_hash_tables.MapIntInt({1:7}),
88
cpp11_hash_tables.MultiMapIntInt({1:7}),
9-
# TODO: fix for -builtin
10-
# cpp11_hash_tables.UnorderedMapIntInt({1:7}),
11-
# cpp11_hash_tables.UnorderedMultiMapIntInt({1:7})
9+
cpp11_hash_tables.UnorderedMapIntInt({1:7}),
10+
cpp11_hash_tables.UnorderedMultiMapIntInt({1:7})
1211
]:
1312

1413
swig_assert_equal([(k, v) for k, v in x.iteritems()], [(1, 7)])
14+
swig_assert_equal(x.keys(), [1])
15+
swig_assert_equal(x.values(), [7])
16+
swig_assert_equal(x.items(), [(1, 7)])
17+
swig_assert_equal([k for k in x], [1])
18+
swig_assert_equal([i for i in x.iterkeys()], [1])
19+
swig_assert_equal([i for i in x.itervalues()], [7])
20+
swig_assert_equal([i for i in x.iteritems()], [(1, 7)])
1521

1622
swig_assert_equal(x[1], 7)
1723
swig_assert_equal(2 in x, False)
@@ -27,10 +33,7 @@ def swig_assert_equal(a, b):
2733
for x in [cpp11_hash_tables.MultiMapIntInt({1:7}),
2834
cpp11_hash_tables.UnorderedMultiMapIntInt({1:7})]:
2935
x[1] = 9
30-
# TODO: fix for -builtin
31-
# swig_assert_equal(sorted([v for k, v in x.iteritems()]), [7, 9])
32-
# Is this broken?...
33-
# swig_assert_equal(sorted([v for v in x[1]]), [7, 9])
36+
swig_assert_equal(sorted([v for k, v in x.iteritems()]), [7, 9])
3437

3538
for x in [cpp11_hash_tables.SetInt([1]),
3639
cpp11_hash_tables.MultiSetInt([1]),

Examples/test-suite/python/li_std_map_runme.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,20 @@
5050

5151
if mii[1] != 2:
5252
raise RuntimeError
53+
54+
if mii.keys() != [1]:
55+
raise RuntimeError("keys")
56+
if mii.values() != [2]:
57+
raise RuntimeError("values")
58+
if mii.items() != [(1, 2)]:
59+
raise RuntimeError("items")
60+
61+
if [k for k in mii] != [1]:
62+
raise RuntimeError("iteration")
63+
64+
if [i for i in mii.iterkeys()] != [1]:
65+
raise RuntimeError("iterkeys")
66+
if [i for i in mii.itervalues()] != [2]:
67+
raise RuntimeError("itervalues")
68+
if [i for i in mii.iteritems()] != [(1, 2)]:
69+
raise RuntimeError("iteritems")

Lib/python/std_unordered_map.i

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,39 @@
139139
%swig_container_methods(Map)
140140

141141
#if defined(SWIGPYTHON_BUILTIN)
142+
%feature("python:slot", "mp_length", functype="lenfunc") __len__;
143+
%feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__;
144+
%feature("python:slot", "tp_iter", functype="getiterfunc") key_iterator;
142145
%feature("python:slot", "sq_contains", functype="objobjproc") __contains__;
146+
147+
%extend {
148+
%newobject iterkeys(PyObject **PYTHON_SELF);
149+
swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) {
150+
return swig::make_output_key_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
151+
}
152+
153+
%newobject itervalues(PyObject **PYTHON_SELF);
154+
swig::SwigPyIterator* itervalues(PyObject **PYTHON_SELF) {
155+
return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
156+
}
157+
158+
%newobject iteritems(PyObject **PYTHON_SELF);
159+
swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) {
160+
return swig::make_output_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
161+
}
162+
}
163+
164+
#else
165+
%extend {
166+
%pythoncode %{def __iter__(self):
167+
return self.key_iterator()%}
168+
%pythoncode %{def iterkeys(self):
169+
return self.key_iterator()%}
170+
%pythoncode %{def itervalues(self):
171+
return self.value_iterator()%}
172+
%pythoncode %{def iteritems(self):
173+
return self.iterator()%}
174+
}
143175
#endif
144176

145177
%extend {
@@ -231,16 +263,8 @@
231263
swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) {
232264
return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
233265
}
234-
235-
%pythoncode %{def __iter__(self):
236-
return self.key_iterator()%}
237-
%pythoncode %{def iterkeys(self):
238-
return self.key_iterator()%}
239-
%pythoncode %{def itervalues(self):
240-
return self.value_iterator()%}
241-
%pythoncode %{def iteritems(self):
242-
return self.iterator()%}
243266
}
267+
244268
%enddef
245269

246270
%define %swig_unordered_map_methods(Map...)

0 commit comments

Comments
 (0)