Python std::unordered_map std::unordered_multimap improvements
- Fixes for -builtin - Fix missing iterator support
This commit is contained in:
parent
603285ecb6
commit
72ccea5080
3 changed files with 60 additions and 16 deletions
|
|
@ -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]),
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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...)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue