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(-) 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