Python std::unordered_map std::unordered_multimap improvements

- Fixes for -builtin
- Fix missing iterator support
This commit is contained in:
William S Fulton 2018-09-23 08:55:01 +01:00
commit 72ccea5080
3 changed files with 60 additions and 16 deletions

View file

@ -6,12 +6,18 @@ def swig_assert_equal(a, b):
for x in [cpp11_hash_tables.MapIntInt({1:7}),
cpp11_hash_tables.MultiMapIntInt({1:7}),
# TODO: fix for -builtin
# cpp11_hash_tables.UnorderedMapIntInt({1:7}),
# cpp11_hash_tables.UnorderedMultiMapIntInt({1:7})
cpp11_hash_tables.UnorderedMapIntInt({1:7}),
cpp11_hash_tables.UnorderedMultiMapIntInt({1:7})
]:
swig_assert_equal([(k, v) for k, v in x.iteritems()], [(1, 7)])
swig_assert_equal(x.keys(), [1])
swig_assert_equal(x.values(), [7])
swig_assert_equal(x.items(), [(1, 7)])
swig_assert_equal([k for k in x], [1])
swig_assert_equal([i for i in x.iterkeys()], [1])
swig_assert_equal([i for i in x.itervalues()], [7])
swig_assert_equal([i for i in x.iteritems()], [(1, 7)])
swig_assert_equal(x[1], 7)
swig_assert_equal(2 in x, False)
@ -27,10 +33,7 @@ for x in [cpp11_hash_tables.MapIntInt({1:7}),
for x in [cpp11_hash_tables.MultiMapIntInt({1:7}),
cpp11_hash_tables.UnorderedMultiMapIntInt({1:7})]:
x[1] = 9
# TODO: fix for -builtin
# swig_assert_equal(sorted([v for k, v in x.iteritems()]), [7, 9])
# Is this broken?...
# swig_assert_equal(sorted([v for v in x[1]]), [7, 9])
swig_assert_equal(sorted([v for k, v in x.iteritems()]), [7, 9])
for x in [cpp11_hash_tables.SetInt([1]),
cpp11_hash_tables.MultiSetInt([1]),

View file

@ -50,3 +50,20 @@ mii[1] = 2
if mii[1] != 2:
raise RuntimeError
if mii.keys() != [1]:
raise RuntimeError("keys")
if mii.values() != [2]:
raise RuntimeError("values")
if mii.items() != [(1, 2)]:
raise RuntimeError("items")
if [k for k in mii] != [1]:
raise RuntimeError("iteration")
if [i for i in mii.iterkeys()] != [1]:
raise RuntimeError("iterkeys")
if [i for i in mii.itervalues()] != [2]:
raise RuntimeError("itervalues")
if [i for i in mii.iteritems()] != [(1, 2)]:
raise RuntimeError("iteritems")

View file

@ -139,7 +139,39 @@
%swig_container_methods(Map)
#if defined(SWIGPYTHON_BUILTIN)
%feature("python:slot", "mp_length", functype="lenfunc") __len__;
%feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__;
%feature("python:slot", "tp_iter", functype="getiterfunc") key_iterator;
%feature("python:slot", "sq_contains", functype="objobjproc") __contains__;
%extend {
%newobject iterkeys(PyObject **PYTHON_SELF);
swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) {
return swig::make_output_key_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
}
%newobject itervalues(PyObject **PYTHON_SELF);
swig::SwigPyIterator* itervalues(PyObject **PYTHON_SELF) {
return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
}
%newobject iteritems(PyObject **PYTHON_SELF);
swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) {
return swig::make_output_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
}
}
#else
%extend {
%pythoncode %{def __iter__(self):
return self.key_iterator()%}
%pythoncode %{def iterkeys(self):
return self.key_iterator()%}
%pythoncode %{def itervalues(self):
return self.value_iterator()%}
%pythoncode %{def iteritems(self):
return self.iterator()%}
}
#endif
%extend {
@ -231,16 +263,8 @@
swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) {
return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
}
%pythoncode %{def __iter__(self):
return self.key_iterator()%}
%pythoncode %{def iterkeys(self):
return self.key_iterator()%}
%pythoncode %{def itervalues(self):
return self.value_iterator()%}
%pythoncode %{def iteritems(self):
return self.iterator()%}
}
%enddef
%define %swig_unordered_map_methods(Map...)