From b72703acdf42ce0939737ed73ca4830c1e1b6b2d Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Sat, 1 Apr 2023 21:57:34 +0100 Subject: STL support for copying Python objects supporting Iterator protocol std::array not working though --- Lib/python/pycontainer.swg | 69 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'Lib') diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index 4910fecc0..a1affa86b 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -1013,12 +1013,47 @@ namespace swig { } } + template + static int assign_iterator_protocol(PyObject *obj, Seq **seq) { + int ret = SWIG_ERROR; + PyObject *iter = PyObject_GetIter(obj); + if (iter) { + PyObject *item = PyIter_Next(iter); + ret = SWIG_OK; + if (seq) + *seq = new Seq(); + while (item) { + try { + if (seq) { + (*seq)->insert((*seq)->end(), swig::as(item)); + } else { + if (!swig::check(item)) + ret = SWIG_ERROR; + } + } catch (std::exception& e) { + if (seq) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, e.what()); + } + } + ret = SWIG_ERROR; + } + Py_DECREF(item); + item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; + } + Py_DECREF(iter); + } + + return ret; + } + template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(PyObject *obj, sequence **seq) { + int ret = SWIG_ERROR; if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); @@ -1045,8 +1080,40 @@ namespace swig { } return SWIG_ERROR; } + } else { +#if 0 + PyObject *iter = PyObject_GetIter(obj); + if (iter) { + PyObject *item = PyIter_Next(iter); + ret = SWIG_OK; + if (seq) + *seq = new sequence(); + while (item) { + try { + if (seq) { + (*seq)->insert((*seq)->end(), swig::as(item)); + } else { + if (!swig::check(item)) + ret = SWIG_ERROR; + } + } catch (std::exception& e) { + if (seq) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, e.what()); + } + } + ret = SWIG_ERROR; + } + Py_DECREF(item); + item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; + } + Py_DECREF(iter); + } +#else + ret = swig::assign_iterator_protocol(obj, seq); +#endif } - return SWIG_ERROR; + return ret; } }; -- cgit v1.2.1 From 6098b26f3ece2096e14695fd02b040bd0658d2ac Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 3 Apr 2023 22:09:39 +0100 Subject: Iterator Protocol support for std::array wrappers Introduce swig::IteratorProtocol class and assign which can be partially specialized by different container types, such as std::array. --- Lib/python/pycontainer.swg | 46 +++++++++++++------------------------------- Lib/python/std_array.i | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 33 deletions(-) (limited to 'Lib') diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index a1affa86b..65223b615 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -1014,7 +1014,8 @@ namespace swig { } template - static int assign_iterator_protocol(PyObject *obj, Seq **seq) { + struct IteratorProtocol { + static int assign(PyObject *obj, Seq **seq) { int ret = SWIG_ERROR; PyObject *iter = PyObject_GetIter(obj); if (iter) { @@ -1046,12 +1047,21 @@ namespace swig { return ret; } + }; template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; + static bool is_iterable(PyObject *obj) { + PyObject *iter = PyObject_GetIter(obj); + bool is_iter = iter != 0; + Py_XDECREF(iter); + PyErr_Clear(); + return is_iter; + } + static int asptr(PyObject *obj, sequence **seq) { int ret = SWIG_ERROR; if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { @@ -1061,6 +1071,8 @@ namespace swig { if (seq) *seq = p; return SWIG_OLDOBJ; } + } else if (is_iterable(obj)) { + ret = IteratorProtocol::assign(obj, seq); } else if (PySequence_Check(obj)) { try { SwigPySequence_Cont swigpyseq(obj); @@ -1080,38 +1092,6 @@ namespace swig { } return SWIG_ERROR; } - } else { -#if 0 - PyObject *iter = PyObject_GetIter(obj); - if (iter) { - PyObject *item = PyIter_Next(iter); - ret = SWIG_OK; - if (seq) - *seq = new sequence(); - while (item) { - try { - if (seq) { - (*seq)->insert((*seq)->end(), swig::as(item)); - } else { - if (!swig::check(item)) - ret = SWIG_ERROR; - } - } catch (std::exception& e) { - if (seq) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, e.what()); - } - } - ret = SWIG_ERROR; - } - Py_DECREF(item); - item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; - } - Py_DECREF(iter); - } -#else - ret = swig::assign_iterator_protocol(obj, seq); -#endif } return ret; } diff --git a/Lib/python/std_array.i b/Lib/python/std_array.i index a3de3125b..9cca563c0 100644 --- a/Lib/python/std_array.i +++ b/Lib/python/std_array.i @@ -29,6 +29,54 @@ std::copy(swigpyseq.begin(), swigpyseq.end(), seq->begin()); } + template + struct IteratorProtocol, T> { + static int assign(PyObject *obj, std::array **seq) { + int ret = SWIG_ERROR; + PyObject *iter = PyObject_GetIter(obj); + if (iter) { + PyObject *item = PyIter_Next(iter); + size_t count = 0; + typename std::array::iterator array_iter = nullptr; + ret = SWIG_OK; + if (seq) { + *seq = new std::array(); + array_iter = (*seq)->begin(); + } + while (item && (count < N)) { + try { + if (seq) { + *array_iter++ = swig::as(item); + } else { + if (!swig::check(item)) + ret = SWIG_ERROR; + } + } catch (std::exception& e) { + if (seq) { + if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, e.what()); + } + } + ret = SWIG_ERROR; + } + ++count; + Py_DECREF(item); + item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; + } + if ((ret == SWIG_OK) && (count != N || item)) { + PyErr_SetString(PyExc_TypeError, "std::array size does not match source container size"); + ret = SWIG_ERROR; + } + Py_XDECREF(item); + Py_DECREF(iter); + if (seq && (ret == SWIG_ERROR)) + delete *seq; + } + + return ret; + } + }; + template inline void erase(std::array* SWIGUNUSEDPARM(seq), const typename std::array::iterator& SWIGUNUSEDPARM(position)) { -- cgit v1.2.1 From b2fd91bc41050ec4dd8fbb13b71abb796bc6c8b7 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Wed, 5 Apr 2023 20:21:34 +0100 Subject: Add support for all STL containers to be constructible from a Python set --- Lib/python/pyclasses.swg | 2 +- Lib/python/pycontainer.swg | 65 +++++++++++++++++++++++++--------------------- Lib/python/std_array.i | 60 ++++++++++++++++++------------------------ 3 files changed, 61 insertions(+), 66 deletions(-) (limited to 'Lib') diff --git a/Lib/python/pyclasses.swg b/Lib/python/pyclasses.swg index 31ebdd2a1..39c4e0316 100644 --- a/Lib/python/pyclasses.swg +++ b/Lib/python/pyclasses.swg @@ -11,7 +11,7 @@ or as a member variable: struct A { - SwigPtr_PyObject obj; + SwigPtr_PyObject _obj; A(PyObject *o) : _obj(o) { } }; diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index 65223b615..7012b0b1d 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -1015,36 +1015,28 @@ namespace swig { template struct IteratorProtocol { - static int assign(PyObject *obj, Seq **seq) { - int ret = SWIG_ERROR; - PyObject *iter = PyObject_GetIter(obj); + static void assign(PyObject *obj, Seq *seq) { + SwigVar_PyObject iter = PyObject_GetIter(obj); if (iter) { - PyObject *item = PyIter_Next(iter); - ret = SWIG_OK; - if (seq) - *seq = new Seq(); + SwigVar_PyObject item = PyIter_Next(iter); while (item) { - try { - if (seq) { - (*seq)->insert((*seq)->end(), swig::as(item)); - } else { - if (!swig::check(item)) - ret = SWIG_ERROR; - } - } catch (std::exception& e) { - if (seq) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, e.what()); - } - } - ret = SWIG_ERROR; - } - Py_DECREF(item); - item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; + seq->insert(seq->end(), swig::as(item)); + item = PyIter_Next(iter); } - Py_DECREF(iter); } + } + static bool check(PyObject *obj) { + int ret = false; + SwigVar_PyObject iter = PyObject_GetIter(obj); + if (iter) { + SwigVar_PyObject item = PyIter_Next(iter); + ret = true; + while (item) { + ret = swig::check(item); + item = ret ? PyIter_Next(iter) : 0; + } + } return ret; } }; @@ -1055,11 +1047,9 @@ namespace swig { typedef T value_type; static bool is_iterable(PyObject *obj) { - PyObject *iter = PyObject_GetIter(obj); - bool is_iter = iter != 0; - Py_XDECREF(iter); + SwigVar_PyObject iter = PyObject_GetIter(obj); PyErr_Clear(); - return is_iter; + return iter != 0; } static int asptr(PyObject *obj, sequence **seq) { @@ -1072,7 +1062,22 @@ namespace swig { return SWIG_OLDOBJ; } } else if (is_iterable(obj)) { - ret = IteratorProtocol::assign(obj, seq); + try { + if (seq) { + *seq = new sequence(); + IteratorProtocol::assign(obj, *seq); + if (!PyErr_Occurred()) + return SWIG_NEWOBJ; + } else { + return IteratorProtocol::check(obj) ? SWIG_OK : SWIG_ERROR; + } + } catch (std::exception& e) { + if (seq && !PyErr_Occurred()) + PyErr_SetString(PyExc_TypeError, e.what()); + } + if (seq) + delete *seq; + return SWIG_ERROR; } else if (PySequence_Check(obj)) { try { SwigPySequence_Cont swigpyseq(obj); diff --git a/Lib/python/std_array.i b/Lib/python/std_array.i index 9cca563c0..d41d1f15e 100644 --- a/Lib/python/std_array.i +++ b/Lib/python/std_array.i @@ -31,48 +31,38 @@ template struct IteratorProtocol, T> { - static int assign(PyObject *obj, std::array **seq) { - int ret = SWIG_ERROR; - PyObject *iter = PyObject_GetIter(obj); + + static void assign(PyObject *obj, std::array *seq) { + SwigVar_PyObject iter = PyObject_GetIter(obj); if (iter) { - PyObject *item = PyIter_Next(iter); + SwigVar_PyObject item = PyIter_Next(iter); size_t count = 0; - typename std::array::iterator array_iter = nullptr; - ret = SWIG_OK; - if (seq) { - *seq = new std::array(); - array_iter = (*seq)->begin(); - } + typename std::array::iterator array_iter = seq->begin(); while (item && (count < N)) { - try { - if (seq) { - *array_iter++ = swig::as(item); - } else { - if (!swig::check(item)) - ret = SWIG_ERROR; - } - } catch (std::exception& e) { - if (seq) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, e.what()); - } - } - ret = SWIG_ERROR; - } ++count; - Py_DECREF(item); - item = (ret == SWIG_OK) ? PyIter_Next(iter) : 0; - } - if ((ret == SWIG_OK) && (count != N || item)) { - PyErr_SetString(PyExc_TypeError, "std::array size does not match source container size"); - ret = SWIG_ERROR; + *array_iter++ = swig::as(item); + item = PyIter_Next(iter); } - Py_XDECREF(item); - Py_DECREF(iter); - if (seq && (ret == SWIG_ERROR)) - delete *seq; + if (count != N || item) + throw std::invalid_argument("std::array size does not match source container size"); } + } + static bool check(PyObject *obj) { + int ret = false; + SwigVar_PyObject iter = PyObject_GetIter(obj); + if (iter) { + SwigVar_PyObject item = PyIter_Next(iter); + size_t count = 0; + ret = true; + while (item && (count < N)) { + ++count; + ret = swig::check(item); + item = ret ? PyIter_Next(iter) : 0; + } + if (count != N || item) + ret = false; + } return ret; } }; -- cgit v1.2.1 From d5291a77e18dbc5342803f1d80bc55c6333f1271 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 6 Apr 2023 12:53:47 +0100 Subject: Remove now redundant use of Python Sequence protocol in STL wrappers Removes SwigPySequence_Cont and support classes: SwigPySequence_ArrowProxy, SwigPySequence_Cont, SwigPySequence_Ref The recently added Iterator Protocol support should cover the Sequence Protocol usage for converting from Python containers to STL containers. --- Lib/python/pycontainer.swg | 248 +-------------------------------------------- Lib/python/pyname_compat.i | 5 - 2 files changed, 1 insertion(+), 252 deletions(-) (limited to 'Lib') diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index 7012b0b1d..b77a37876 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -460,234 +460,7 @@ namespace swig { fragment="StdTraits", fragment="SwigPySequence_Base", fragment="SwigPyIterator_T") -{ -namespace swig -{ - template - struct SwigPySequence_Ref - { - SwigPySequence_Ref(PyObject* seq, Py_ssize_t index) - : _seq(seq), _index(index) - { - } - - operator T () const - { - swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index); - try { - return swig::as(item); - } catch (const std::invalid_argument& e) { - char msg[1024]; - PyOS_snprintf(msg, sizeof(msg), "in sequence element %d ", (int)_index); - if (!PyErr_Occurred()) { - ::%type_error(swig::type_name()); - } - SWIG_Python_AddErrorMsg(msg); - SWIG_Python_AddErrorMsg(e.what()); - throw; - } - } - - SwigPySequence_Ref& operator=(const T& v) - { - PySequence_SetItem(_seq, _index, swig::from(v)); - return *this; - } - - private: - PyObject* _seq; - Py_ssize_t _index; - }; - - template - struct SwigPySequence_ArrowProxy - { - SwigPySequence_ArrowProxy(const T& x): m_value(x) {} - const T* operator->() const { return &m_value; } - operator const T*() const { return &m_value; } - T m_value; - }; - - template - struct SwigPySequence_InputIterator - { - typedef SwigPySequence_InputIterator self; - - typedef std::random_access_iterator_tag iterator_category; - typedef Reference reference; - typedef T value_type; - typedef T* pointer; - typedef Py_ssize_t difference_type; - - SwigPySequence_InputIterator() - { - } - - SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index) - : _seq(seq), _index(index) - { - } - - reference operator*() const - { - return reference(_seq, _index); - } - - SwigPySequence_ArrowProxy - operator->() const { - return SwigPySequence_ArrowProxy(operator*()); - } - - bool operator==(const self& ri) const - { - return (_index == ri._index) && (_seq == ri._seq); - } - - bool operator!=(const self& ri) const - { - return !(operator==(ri)); - } - - self& operator ++ () - { - ++_index; - return *this; - } - - self& operator -- () - { - --_index; - return *this; - } - - self& operator += (difference_type n) - { - _index += n; - return *this; - } - - self operator +(difference_type n) const - { - return self(_seq, _index + n); - } - - self& operator -= (difference_type n) - { - _index -= n; - return *this; - } - - self operator -(difference_type n) const - { - return self(_seq, _index - n); - } - - difference_type operator - (const self& ri) const - { - return _index - ri._index; - } - - bool operator < (const self& ri) const - { - return _index < ri._index; - } - - reference - operator[](difference_type n) const - { - return reference(_seq, _index + n); - } - - private: - PyObject* _seq; - difference_type _index; - }; - - // STL container wrapper around a Python sequence - template - struct SwigPySequence_Cont - { - typedef SwigPySequence_Ref reference; - typedef const SwigPySequence_Ref const_reference; - typedef T value_type; - typedef T* pointer; - typedef Py_ssize_t difference_type; - typedef size_t size_type; - typedef const pointer const_pointer; - typedef SwigPySequence_InputIterator iterator; - typedef SwigPySequence_InputIterator const_iterator; - - SwigPySequence_Cont(PyObject* seq) : _seq(0) - { - if (!PySequence_Check(seq)) { - throw std::invalid_argument("a sequence is expected"); - } - _seq = seq; - Py_INCREF(_seq); - } - - ~SwigPySequence_Cont() - { - Py_XDECREF(_seq); - } - - size_type size() const - { - return static_cast(PySequence_Size(_seq)); - } - - bool empty() const - { - return size() == 0; - } - - iterator begin() - { - return iterator(_seq, 0); - } - - const_iterator begin() const - { - return const_iterator(_seq, 0); - } - - iterator end() - { - return iterator(_seq, size()); - } - - const_iterator end() const - { - return const_iterator(_seq, size()); - } - - reference operator[](difference_type n) - { - return reference(_seq, n); - } - - const_reference operator[](difference_type n) const - { - return const_reference(_seq, n); - } - - bool check() const - { - Py_ssize_t s = size(); - for (Py_ssize_t i = 0; i < s; ++i) { - swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); - if (!swig::check(item)) - return false; - } - return true; - } - - private: - PyObject* _seq; - }; - -} -} +{} %define %swig_sequence_iterator(Sequence...) %swig_sequence_iterator_with_making_function(swig::make_output_iterator,Sequence...) @@ -1078,25 +851,6 @@ namespace swig { if (seq) delete *seq; return SWIG_ERROR; - } else if (PySequence_Check(obj)) { - try { - SwigPySequence_Cont swigpyseq(obj); - if (seq) { - sequence *pseq = new sequence(); - assign(swigpyseq, pseq); - *seq = pseq; - return SWIG_NEWOBJ; - } else { - return swigpyseq.check() ? SWIG_OK : SWIG_ERROR; - } - } catch (std::exception& e) { - if (seq) { - if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, e.what()); - } - } - return SWIG_ERROR; - } } return ret; } diff --git a/Lib/python/pyname_compat.i b/Lib/python/pyname_compat.i index a9630dbe7..ca063153b 100644 --- a/Lib/python/pyname_compat.i +++ b/Lib/python/pyname_compat.i @@ -25,7 +25,6 @@ */ %fragment("PySequence_Base", "header", fragment="SwigPySequence_Base") {} -%fragment("PySequence_Cont", "header", fragment="SwigPySequence_Cont") {} %fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} %fragment("PyPairBoolOutputIterator", "header", fragment="SwigPyPairBoolOutputIterator") {} %fragment("PySwigIterator", "header", fragment="SwigPyIterator") {} @@ -39,10 +38,6 @@ #define PyObject_var SwigVar_PyObject #define PyOper SwigPyOper #define PySeq SwigPySeq -#define PySequence_ArrowProxy SwigPySequence_ArrowProxy -#define PySequence_Cont SwigPySequence_Cont -#define PySequence_InputIterator SwigPySequence_InputIterator -#define PySequence_Ref SwigPySequence_Ref #define PySwigClientData SwigPyClientData #define PySwigClientData_Del SwigPyClientData_Del #define PySwigClientData_New SwigPyClientData_New -- cgit v1.2.1 From 08aee96cbd1de0c842b29776be8c24e9f742ef2d Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Thu, 6 Apr 2023 13:08:47 +0100 Subject: Remove assign method uses by the removed Python Sequence Protocol --- Lib/python/pycontainer.swg | 11 ----------- Lib/python/pyname_compat.i | 2 -- Lib/python/std_array.i | 10 ---------- Lib/python/std_map.i | 10 ---------- Lib/python/std_multimap.i | 10 ---------- Lib/python/std_multiset.i | 11 ----------- Lib/python/std_set.i | 11 ----------- Lib/python/std_unordered_map.i | 10 ---------- Lib/python/std_unordered_multimap.i | 10 ---------- Lib/python/std_unordered_multiset.i | 11 ----------- Lib/python/std_unordered_set.i | 11 ----------- 11 files changed, 107 deletions(-) (limited to 'Lib') diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index b77a37876..2c0466c21 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -775,17 +775,6 @@ namespace swig { fragment="SwigPySequence_Cont") { namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, Seq* seq) { - // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented - typedef typename SwigPySeq::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - seq->insert(seq->end(),(value_type)(*it)); - } - } - template struct IteratorProtocol { static void assign(PyObject *obj, Seq *seq) { diff --git a/Lib/python/pyname_compat.i b/Lib/python/pyname_compat.i index ca063153b..789b28443 100644 --- a/Lib/python/pyname_compat.i +++ b/Lib/python/pyname_compat.i @@ -37,7 +37,6 @@ #define PyObject_ptr SwigPtr_PyObject #define PyObject_var SwigVar_PyObject #define PyOper SwigPyOper -#define PySeq SwigPySeq #define PySwigClientData SwigPyClientData #define PySwigClientData_Del SwigPyClientData_Del #define PySwigClientData_New SwigPyClientData_New @@ -74,7 +73,6 @@ #define PySwigPacked_repr SwigPyPacked_repr #define PySwigPacked_str SwigPyPacked_str #define PySwigPacked_type SwigPyPacked_type -#define pyseq swigpyseq #define pyswigobject_type swigpyobject_type #define pyswigpacked_type swigpypacked_type %} diff --git a/Lib/python/std_array.i b/Lib/python/std_array.i index d41d1f15e..561f00fc7 100644 --- a/Lib/python/std_array.i +++ b/Lib/python/std_array.i @@ -19,16 +19,6 @@ } }; - template - inline void - assign(const SwigPySeq& swigpyseq, std::array* seq) { - if (swigpyseq.size() < seq->size()) - throw std::invalid_argument("std::array cannot be expanded in size"); - else if (swigpyseq.size() > seq->size()) - throw std::invalid_argument("std::array cannot be reduced in size"); - std::copy(swigpyseq.begin(), swigpyseq.end(), seq->begin()); - } - template struct IteratorProtocol, T> { diff --git a/Lib/python/std_map.i b/Lib/python/std_map.i index e0b7d69dc..ef6eb7f20 100644 --- a/Lib/python/std_map.i +++ b/Lib/python/std_map.i @@ -77,16 +77,6 @@ %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::map *map) { - typedef typename std::map::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - map->insert(value_type(it->first, it->second)); - } - } - template struct traits_asptr > { typedef std::map map_type; diff --git a/Lib/python/std_multimap.i b/Lib/python/std_multimap.i index bbffb6bcd..75b4d7fcf 100644 --- a/Lib/python/std_multimap.i +++ b/Lib/python/std_multimap.i @@ -6,16 +6,6 @@ %fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::multimap *multimap) { - typedef typename std::multimap::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - multimap->insert(value_type(it->first, it->second)); - } - } - template struct traits_asptr > { typedef std::multimap multimap_type; diff --git a/Lib/python/std_multiset.i b/Lib/python/std_multiset.i index ac430334c..b79f64e5a 100644 --- a/Lib/python/std_multiset.i +++ b/Lib/python/std_multiset.i @@ -7,17 +7,6 @@ %fragment("StdMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::multiset* seq) { - // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented - typedef typename SwigPySeq::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - seq->insert(seq->end(),(value_type)(*it)); - } - } - template struct traits_asptr > { static int asptr(PyObject *obj, std::multiset **m) { diff --git a/Lib/python/std_set.i b/Lib/python/std_set.i index 0ef011998..3f80daff6 100644 --- a/Lib/python/std_set.i +++ b/Lib/python/std_set.i @@ -5,17 +5,6 @@ %fragment("StdSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::set* seq) { - // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented - typedef typename SwigPySeq::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - seq->insert(seq->end(),(value_type)(*it)); - } - } - template struct traits_asptr > { static int asptr(PyObject *obj, std::set **s) { diff --git a/Lib/python/std_unordered_map.i b/Lib/python/std_unordered_map.i index 784be4c8f..200ec2c5d 100644 --- a/Lib/python/std_unordered_map.i +++ b/Lib/python/std_unordered_map.i @@ -56,16 +56,6 @@ %fragment("StdUnorderedMapTraits","header",fragment="StdMapCommonTraits",fragment="StdUnorderedMapForwardIteratorTraits") { namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::unordered_map *unordered_map) { - typedef typename std::unordered_map::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - unordered_map->insert(value_type(it->first, it->second)); - } - } - template struct traits_reserve > { static void reserve(std::unordered_map &seq, typename std::unordered_map::size_type n) { diff --git a/Lib/python/std_unordered_multimap.i b/Lib/python/std_unordered_multimap.i index bc095ea48..816ec0933 100644 --- a/Lib/python/std_unordered_multimap.i +++ b/Lib/python/std_unordered_multimap.i @@ -6,16 +6,6 @@ %fragment("StdUnorderedMultimapTraits","header",fragment="StdMapCommonTraits",fragment="StdUnorderedMapForwardIteratorTraits") { namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::unordered_multimap *unordered_multimap) { - typedef typename std::unordered_multimap::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - unordered_multimap->insert(value_type(it->first, it->second)); - } - } - template struct traits_reserve > { static void reserve(std::unordered_multimap &seq, typename std::unordered_multimap::size_type n) { diff --git a/Lib/python/std_unordered_multiset.i b/Lib/python/std_unordered_multiset.i index b0f3f096b..0542247b2 100644 --- a/Lib/python/std_unordered_multiset.i +++ b/Lib/python/std_unordered_multiset.i @@ -7,17 +7,6 @@ %fragment("StdUnorderedMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::unordered_multiset* seq) { - // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented - typedef typename SwigPySeq::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - seq->insert(seq->end(),(value_type)(*it)); - } - } - template struct traits_reserve > { static void reserve(std::unordered_multiset &seq, typename std::unordered_multiset::size_type n) { diff --git a/Lib/python/std_unordered_set.i b/Lib/python/std_unordered_set.i index 79fca6c2f..fd866b14a 100644 --- a/Lib/python/std_unordered_set.i +++ b/Lib/python/std_unordered_set.i @@ -5,17 +5,6 @@ %fragment("StdUnorderedSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { - template - inline void - assign(const SwigPySeq& swigpyseq, std::unordered_set* seq) { - // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented - typedef typename SwigPySeq::value_type value_type; - typename SwigPySeq::const_iterator it = swigpyseq.begin(); - for (;it != swigpyseq.end(); ++it) { - seq->insert(seq->end(),(value_type)(*it)); - } - } - template struct traits_reserve > { static void reserve(std::unordered_set &seq, typename std::unordered_set::size_type n) { -- cgit v1.2.1 From 1835580589b34bb383218a3b8ca5bea1c535e084 Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Mon, 24 Apr 2023 22:40:00 +0100 Subject: Remove undocumented and non-existent STL std::carray --- Lib/octave/std_carray.i | 0 Lib/python/std_carray.i | 54 ----------------------------------------- Lib/std/std_carray.swg | 64 ------------------------------------------------- 3 files changed, 118 deletions(-) delete mode 100644 Lib/octave/std_carray.i delete mode 100644 Lib/python/std_carray.i delete mode 100644 Lib/std/std_carray.swg (limited to 'Lib') diff --git a/Lib/octave/std_carray.i b/Lib/octave/std_carray.i deleted file mode 100644 index e69de29bb..000000000 diff --git a/Lib/python/std_carray.i b/Lib/python/std_carray.i deleted file mode 100644 index 680d67115..000000000 --- a/Lib/python/std_carray.i +++ /dev/null @@ -1,54 +0,0 @@ -%include - - -%fragment("StdCarrayTraits","header",fragment="StdSequenceTraits") -{ -namespace swig { - template - struct traits_asptr > { - static int asptr(PyObject *obj, std::carray **array) { - return traits_asptr_stdseq >::asptr(obj, array); - } - }; -} -} - -%warnfilter(SWIGWARN_IGNORE_OPERATOR_INDEX) std::carray::operator[]; - -%extend std::carray { - %fragment(SWIG_Traits_frag(std::carray<_Type, _Size >), "header", - fragment="SwigPyIterator_T", - fragment=SWIG_Traits_frag(_Type), - fragment="StdCarrayTraits") { - namespace swig { - template <> struct traits > { - typedef pointer_category category; - static const char* type_name() { - return "std::carray<" #_Type "," #_Size " >"; - } - }; - } - } - - %typemaps_asptr(SWIG_TYPECHECK_VECTOR, swig::asptr, - SWIG_Traits_frag(std::carray<_Type, _Size >), - std::carray<_Type, _Size >); - - %typemap(out,noblock=1) iterator, const_iterator { - $result = SWIG_NewPointerObj(swig::make_output_iterator((const $type &)$1), - swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); - } - - inline size_t __len__() const { return self->size(); } - - inline const _Type& __getitem__(size_t i) const { return (*self)[i]; } - - inline void __setitem__(size_t i, const _Type& v) { (*self)[i] = v; } - - - swig::SwigPyIterator* __iter__(PyObject **PYTHON_SELF) { - return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); - } -} - -%include diff --git a/Lib/std/std_carray.swg b/Lib/std/std_carray.swg deleted file mode 100644 index de2a07627..000000000 --- a/Lib/std/std_carray.swg +++ /dev/null @@ -1,64 +0,0 @@ -%{ -#include -%} - -// -// std::carray - is really an extension to the 'std' namespace. -// -// A simple fix C array wrapper, more or less as presented in -// -// "The C++ Standarf Library", by Nicolai M. Josuttis -// -// which is also derived from the example in -// -// "The C++ Programming Language", by Bjarne Stroustup. -// - -%inline %{ -namespace std { - template - class carray - { - public: - typedef _Type value_type; - typedef size_t size_type; - - typedef _Type * iterator; - typedef const _Type * const_iterator; - - carray() { } - - carray(const carray& other) { - std::copy(other.v, other.v + size(), v); - } - - template - carray(_Iterator first, _Iterator last) { - assign(first, last); - } - - iterator begin() { return v; } - iterator end() { return v + _Size; } - - const_iterator begin() const { return v; } - const_iterator end() const { return v + _Size; } - - _Type& operator[](size_t i) { return v[i]; } - const _Type& operator[](size_t i) const { return v[i]; } - - static size_t size() { return _Size; } - - template - void assign(_Iterator first, _Iterator last) { - if (std::distance(first,last) == size()) { - std::copy(first, last, v); - } else { - throw std::length_error("bad range length"); - } - } - - private: - _Type v[_Size]; - }; -} -%} -- cgit v1.2.1 From 3a2318cb579edb3d1545210911b0058563521e3d Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Wed, 26 Apr 2023 19:38:39 +0100 Subject: Finish removal of SwigPySequence_Cont --- Lib/python/pycontainer.swg | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'Lib') diff --git a/Lib/python/pycontainer.swg b/Lib/python/pycontainer.swg index 2c0466c21..ceee27f5d 100644 --- a/Lib/python/pycontainer.swg +++ b/Lib/python/pycontainer.swg @@ -456,12 +456,6 @@ namespace swig { } } -%fragment("SwigPySequence_Cont","header", - fragment="StdTraits", - fragment="SwigPySequence_Base", - fragment="SwigPyIterator_T") -{} - %define %swig_sequence_iterator(Sequence...) %swig_sequence_iterator_with_making_function(swig::make_output_iterator,Sequence...) %enddef @@ -477,12 +471,12 @@ namespace swig { class const_iterator; class const_reverse_iterator; - %typemap(out,noblock=1,fragment="SwigPySequence_Cont") + %typemap(out,noblock=1,fragment="SwigPyIterator_T") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } - %typemap(out,noblock=1,fragment="SwigPySequence_Cont") + %typemap(out,noblock=1,fragment="SwigPyIterator_T") std::pair, std::pair { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(Make_output_iterator(%static_cast($1,const $type &).first), @@ -491,7 +485,7 @@ namespace swig { swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); } - %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="SwigPySequence_Cont") {} + %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="SwigPyIterator_T") {} %typemap(out,noblock=1,fragment="SwigPyPairBoolOutputIterator") std::pair, std::pair { @@ -501,7 +495,7 @@ namespace swig { PyTuple_SetItem($result,1,SWIG_From(bool)(%static_cast($1,const $type &).second)); } - %typemap(in,noblock=1,fragment="SwigPySequence_Cont") + %typemap(in,noblock=1,fragment="SwigPyIterator_T") iterator(swig::SwigPyIterator *iter = 0, int res), reverse_iterator(swig::SwigPyIterator *iter = 0, int res), const_iterator(swig::SwigPyIterator *iter = 0, int res), @@ -519,14 +513,14 @@ namespace swig { } } - %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SwigPySequence_Cont") + %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SwigPyIterator_T") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } - %fragment("SwigPySequence_Cont"); + %fragment("SwigPyIterator_T"); %newobject iterator(PyObject **PYTHON_SELF); %extend { @@ -772,7 +766,7 @@ namespace swig { %fragment("StdSequenceTraits","header", fragment="StdTraits", - fragment="SwigPySequence_Cont") + fragment="SwigPySequence_Base") { namespace swig { template -- cgit v1.2.1