Merge branch 'tamuratak-fix_python_unordered_2'

* tamuratak-fix_python_unordered_2:
  [python] add %swig_sequence_iterator_with_making_function and          make %swig_sequence_iterator forward to it.          add %swig_sequence_forward_iterator too.
  [python] make SwigPyIteratorClosed_T and SwigPyIteratorOpen_T          inherit from forward iterator classes.
  [python] fix std unordered containers
This commit is contained in:
William S Fulton 2017-04-25 07:55:21 +01:00
commit 430f20a533
6 changed files with 97 additions and 58 deletions

View file

@ -655,6 +655,14 @@ namespace swig
} }
%define %swig_sequence_iterator(Sequence...) %define %swig_sequence_iterator(Sequence...)
%swig_sequence_iterator_with_making_function(swig::make_output_iterator,Sequence...)
%enddef
%define %swig_sequence_forward_iterator(Sequence...)
%swig_sequence_iterator_with_making_function(swig::make_output_forward_iterator,Sequence...)
%enddef
%define %swig_sequence_iterator_with_making_function(Make_output_iterator,Sequence...)
#if defined(SWIG_EXPORT_ITERATOR_METHODS) #if defined(SWIG_EXPORT_ITERATOR_METHODS)
class iterator; class iterator;
class reverse_iterator; class reverse_iterator;
@ -663,15 +671,15 @@ namespace swig
%typemap(out,noblock=1,fragment="SwigPySequence_Cont") %typemap(out,noblock=1,fragment="SwigPySequence_Cont")
iterator, reverse_iterator, const_iterator, const_reverse_iterator { iterator, reverse_iterator, const_iterator, const_reverse_iterator {
$result = SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), $result = SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &)),
swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN);
} }
%typemap(out,noblock=1,fragment="SwigPySequence_Cont") %typemap(out,noblock=1,fragment="SwigPySequence_Cont")
std::pair<iterator, iterator>, std::pair<const_iterator, const_iterator> { std::pair<iterator, iterator>, std::pair<const_iterator, const_iterator> {
$result = PyTuple_New(2); $result = PyTuple_New(2);
PyTuple_SetItem($result,0,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), PyTuple_SetItem($result,0,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).first),
swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN));
PyTuple_SetItem($result,1,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).second), PyTuple_SetItem($result,1,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).second),
swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN));
} }
@ -680,7 +688,7 @@ namespace swig
%typemap(out,noblock=1,fragment="SwigPyPairBoolOutputIterator") %typemap(out,noblock=1,fragment="SwigPyPairBoolOutputIterator")
std::pair<iterator, bool>, std::pair<const_iterator, bool> { std::pair<iterator, bool>, std::pair<const_iterator, bool> {
$result = PyTuple_New(2); $result = PyTuple_New(2);
PyTuple_SetItem($result,0,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), PyTuple_SetItem($result,0,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).first),
swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN));
PyTuple_SetItem($result,1,SWIG_From(bool)(%static_cast($1,const $type &).second)); PyTuple_SetItem($result,1,SWIG_From(bool)(%static_cast($1,const $type &).second));
} }
@ -715,7 +723,7 @@ namespace swig
%newobject iterator(PyObject **PYTHON_SELF); %newobject iterator(PyObject **PYTHON_SELF);
%extend { %extend {
swig::SwigPyIterator* iterator(PyObject **PYTHON_SELF) { swig::SwigPyIterator* iterator(PyObject **PYTHON_SELF) {
return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); return Make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
} }
#if defined(SWIGPYTHON_BUILTIN) #if defined(SWIGPYTHON_BUILTIN)

View file

@ -198,16 +198,16 @@ namespace swig {
template<typename OutIterator, template<typename OutIterator,
typename ValueType = typename std::iterator_traits<OutIterator>::value_type, typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
typename FromOper = from_oper<ValueType> > typename FromOper = from_oper<ValueType> >
class SwigPyIteratorOpen_T : public SwigPyIterator_T<OutIterator> class SwigPyForwardIteratorOpen_T : public SwigPyIterator_T<OutIterator>
{ {
public: public:
FromOper from; FromOper from;
typedef OutIterator out_iterator; typedef OutIterator out_iterator;
typedef ValueType value_type; typedef ValueType value_type;
typedef SwigPyIterator_T<out_iterator> base; typedef SwigPyIterator_T<out_iterator> base;
typedef SwigPyIteratorOpen_T<OutIterator, ValueType, FromOper> self_type; typedef SwigPyForwardIteratorOpen_T<OutIterator, ValueType, FromOper> self_type;
SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq) SwigPyForwardIteratorOpen_T(out_iterator curr, PyObject *seq)
: SwigPyIterator_T<OutIterator>(curr, seq) : SwigPyIterator_T<OutIterator>(curr, seq)
{ {
} }
@ -229,6 +229,25 @@ namespace swig {
return this; return this;
} }
};
template<typename OutIterator,
typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
typename FromOper = from_oper<ValueType> >
class SwigPyIteratorOpen_T : public SwigPyForwardIteratorOpen_T<OutIterator, ValueType, FromOper>
{
public:
FromOper from;
typedef OutIterator out_iterator;
typedef ValueType value_type;
typedef SwigPyIterator_T<out_iterator> base;
typedef SwigPyIteratorOpen_T<OutIterator, ValueType, FromOper> self_type;
SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq)
: SwigPyForwardIteratorOpen_T<OutIterator>(curr, seq)
{
}
SwigPyIterator *decr(size_t n = 1) SwigPyIterator *decr(size_t n = 1)
{ {
while (n--) { while (n--) {
@ -241,16 +260,16 @@ namespace swig {
template<typename OutIterator, template<typename OutIterator,
typename ValueType = typename std::iterator_traits<OutIterator>::value_type, typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
typename FromOper = from_oper<ValueType> > typename FromOper = from_oper<ValueType> >
class SwigPyIteratorClosed_T : public SwigPyIterator_T<OutIterator> class SwigPyForwardIteratorClosed_T : public SwigPyIterator_T<OutIterator>
{ {
public: public:
FromOper from; FromOper from;
typedef OutIterator out_iterator; typedef OutIterator out_iterator;
typedef ValueType value_type; typedef ValueType value_type;
typedef SwigPyIterator_T<out_iterator> base; typedef SwigPyIterator_T<out_iterator> base;
typedef SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> self_type; typedef SwigPyForwardIteratorClosed_T<OutIterator, ValueType, FromOper> self_type;
SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) SwigPyForwardIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq)
: SwigPyIterator_T<OutIterator>(curr, seq), begin(first), end(last) : SwigPyIterator_T<OutIterator>(curr, seq), begin(first), end(last)
{ {
} }
@ -280,10 +299,33 @@ namespace swig {
return this; return this;
} }
protected:
out_iterator begin;
out_iterator end;
};
template<typename OutIterator,
typename ValueType = typename std::iterator_traits<OutIterator>::value_type,
typename FromOper = from_oper<ValueType> >
class SwigPyIteratorClosed_T : public SwigPyForwardIteratorClosed_T<OutIterator,ValueType,FromOper>
{
public:
FromOper from;
typedef OutIterator out_iterator;
typedef ValueType value_type;
typedef SwigPyIterator_T<out_iterator> base;
typedef SwigPyForwardIteratorClosed_T<OutIterator, ValueType, FromOper> base0;
typedef SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> self_type;
SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq)
: SwigPyForwardIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq)
{
}
SwigPyIterator *decr(size_t n = 1) SwigPyIterator *decr(size_t n = 1)
{ {
while (n--) { while (n--) {
if (base::current == begin) { if (base::current == base0::begin) {
throw stop_iteration(); throw stop_iteration();
} else { } else {
--base::current; --base::current;
@ -291,12 +333,16 @@ namespace swig {
} }
return this; return this;
} }
private:
out_iterator begin;
out_iterator end;
}; };
template<typename OutIter>
inline SwigPyIterator*
make_output_forward_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0)
{
return new SwigPyForwardIteratorClosed_T<OutIter>(current, begin, end, seq);
}
template<typename OutIter> template<typename OutIter>
inline SwigPyIterator* inline SwigPyIterator*
make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0)
@ -304,6 +350,13 @@ namespace swig {
return new SwigPyIteratorClosed_T<OutIter>(current, begin, end, seq); return new SwigPyIteratorClosed_T<OutIter>(current, begin, end, seq);
} }
template<typename OutIter>
inline SwigPyIterator*
make_output_forward_iterator(const OutIter& current, PyObject *seq = 0)
{
return new SwigPyForwardIteratorOpen_T<OutIter>(current, seq);
}
template<typename OutIter> template<typename OutIter>
inline SwigPyIterator* inline SwigPyIterator*
make_output_iterator(const OutIter& current, PyObject *seq = 0) make_output_iterator(const OutIter& current, PyObject *seq = 0)

View file

@ -2,7 +2,7 @@
Unordered Maps Unordered Maps
*/ */
%fragment("StdMapTraits","header",fragment="StdSequenceTraits") %fragment("StdUnorderedMapTraits","header",fragment="StdSequenceTraits")
{ {
namespace swig { namespace swig {
template <class SwigPySeq, class K, class T > template <class SwigPySeq, class K, class T >
@ -74,33 +74,11 @@
} }
}; };
template <class ValueType>
struct from_key_oper
{
typedef const ValueType& argument_type;
typedef PyObject *result_type;
result_type operator()(argument_type v) const
{
return swig::from(v.first);
}
};
template <class ValueType>
struct from_value_oper
{
typedef const ValueType& argument_type;
typedef PyObject *result_type;
result_type operator()(argument_type v) const
{
return swig::from(v.second);
}
};
template<class OutIterator, class FromOper, class ValueType = typename OutIterator::value_type> template<class OutIterator, class FromOper, class ValueType = typename OutIterator::value_type>
struct SwigPyMapIterator_T : SwigPyIteratorClosed_T<OutIterator, ValueType, FromOper> struct SwigPyMapForwardIterator_T : SwigPyForwardIteratorClosed_T<OutIterator, ValueType, FromOper>
{ {
SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) SwigPyMapForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
: SwigPyIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq) : SwigPyForwardIteratorClosed_T<OutIterator,ValueType,FromOper>(curr, first, last, seq)
{ {
} }
}; };
@ -108,27 +86,27 @@
template<class OutIterator, template<class OutIterator,
class FromOper = from_key_oper<typename OutIterator::value_type> > class FromOper = from_key_oper<typename OutIterator::value_type> >
struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T<OutIterator, FromOper> struct SwigPyMapKeyForwardIterator_T : SwigPyMapForwardIterator_T<OutIterator, FromOper>
{ {
SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) SwigPyMapKeyForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
: SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq) : SwigPyMapForwardIterator_T<OutIterator, FromOper>(curr, first, last, seq)
{ {
} }
}; };
template<typename OutIter> template<typename OutIter>
inline SwigPyIterator* inline SwigPyIterator*
make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) make_output_key_forward_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
{ {
return new SwigPyMapKeyIterator_T<OutIter>(current, begin, end, seq); return new SwigPyMapKeyForwardIterator_T<OutIter>(current, begin, end, seq);
} }
template<class OutIterator, template<class OutIterator,
class FromOper = from_value_oper<typename OutIterator::value_type> > class FromOper = from_value_oper<typename OutIterator::value_type> >
struct SwigPyMapValueITerator_T : SwigPyMapIterator_T<OutIterator, FromOper> struct SwigPyMapValueForwardIterator_T : SwigPyMapForwardIterator_T<OutIterator, FromOper>
{ {
SwigPyMapValueITerator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) SwigPyMapValueForwardIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq)
: SwigPyMapIterator_T<OutIterator, FromOper>(curr, first, last, seq) : SwigPyMapForwardIterator_T<OutIterator, FromOper>(curr, first, last, seq)
{ {
} }
}; };
@ -136,15 +114,15 @@
template<typename OutIter> template<typename OutIter>
inline SwigPyIterator* inline SwigPyIterator*
make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) make_output_value_forward_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0)
{ {
return new SwigPyMapValueITerator_T<OutIter>(current, begin, end, seq); return new SwigPyMapValueForwardIterator_T<OutIter>(current, begin, end, seq);
} }
} }
} }
%define %swig_unordered_map_common(Map...) %define %swig_unordered_map_common(Map...)
%swig_sequence_iterator(Map); %swig_sequence_forward_iterator(Map);
%swig_container_methods(Map) %swig_container_methods(Map)
%extend { %extend {
@ -227,12 +205,12 @@
%newobject key_iterator(PyObject **PYTHON_SELF); %newobject key_iterator(PyObject **PYTHON_SELF);
swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) { swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) {
return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); return swig::make_output_key_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
} }
%newobject value_iterator(PyObject **PYTHON_SELF); %newobject value_iterator(PyObject **PYTHON_SELF);
swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) { swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) {
return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); return swig::make_output_value_forward_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
} }
%pythoncode %{def __iter__(self): %pythoncode %{def __iter__(self):

View file

@ -74,7 +74,7 @@
} }
%define %swig_unordered_multimap_methods(Type...) %define %swig_unordered_multimap_methods(Type...)
%swig_map_common(Type); %swig_unordered_map_common(Type);
%extend { %extend {
void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) {
self->insert(Type::value_type(key,x)); self->insert(Type::value_type(key,x));

View file

@ -41,7 +41,7 @@
} }
%} %}
#define %swig_unordered_multiset_methods(Set...) %swig_set_methods(Set) #define %swig_unordered_multiset_methods(Set...) %swig_unordered_set_methods(Set)

View file

@ -40,7 +40,7 @@
%} %}
%define %swig_unordered_set_methods(unordered_set...) %define %swig_unordered_set_methods(unordered_set...)
%swig_sequence_iterator(unordered_set); %swig_sequence_forward_iterator(unordered_set);
%swig_container_methods(unordered_set); %swig_container_methods(unordered_set);
%extend { %extend {