Finished std::pair and std::map support.
li_std_pair_extra test fails, because the _runme.py uses the secret 'this' member variable, which doesn't exist when the -builtin option is used. Seems like a flaw in the test. Test suite now fails on li_std_string_extra, because static member variables are not fully implemented. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/szager-python-builtin@12351 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
8a7ad756d0
commit
dd465f9588
7 changed files with 827 additions and 690 deletions
|
|
@ -31,7 +31,7 @@ SWIGINTERN Py_ssize_t \
|
|||
wrapper##_closure (PyObject *a) \
|
||||
{ \
|
||||
PyObject *resultobj = wrapper(a, NULL); \
|
||||
Py_ssize_t result = _PyLong_AsSsize_t(resultobj); \
|
||||
Py_ssize_t result = PyNumber_AsSsize_t(resultobj, NULL); \
|
||||
Py_DECREF(resultobj); \
|
||||
return result; \
|
||||
}
|
||||
|
|
@ -53,12 +53,14 @@ wrapper##_closure (PyObject *a, Py_ssize_t b, Py_ssize_t c) \
|
|||
SWIGINTERN int \
|
||||
wrapper##_closure (PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) \
|
||||
{ \
|
||||
PyObject *tuple = PyTuple_New(3); \
|
||||
PyObject *tuple = PyTuple_New(d ? 3 : 2); \
|
||||
assert(tuple); \
|
||||
PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); \
|
||||
PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c)); \
|
||||
PyTuple_SET_ITEM(tuple, 2, d); \
|
||||
Py_XINCREF(d); \
|
||||
if (d) { \
|
||||
PyTuple_SET_ITEM(tuple, 2, d); \
|
||||
Py_INCREF(d); \
|
||||
} \
|
||||
PyObject *resultobj = wrapper(a, tuple); \
|
||||
int result = resultobj ? 0 : -1; \
|
||||
Py_DECREF(tuple); \
|
||||
|
|
@ -94,6 +96,25 @@ wrapper##_closure (PyObject *a, Py_ssize_t b, PyObject *c) \
|
|||
return result; \
|
||||
}
|
||||
|
||||
#define PYSWIG_OBJOBJARGPROC_CLOSURE(wrapper) \
|
||||
SWIGINTERN int \
|
||||
wrapper##_closure (PyObject *a, PyObject *b, PyObject *c) \
|
||||
{ \
|
||||
PyObject *tuple = PyTuple_New(c ? 2 : 1); \
|
||||
assert(tuple); \
|
||||
PyTuple_SET_ITEM(tuple, 0, b); \
|
||||
Py_XINCREF(b); \
|
||||
if (c) { \
|
||||
PyTuple_SET_ITEM(tuple, 1, c); \
|
||||
Py_XINCREF(c); \
|
||||
} \
|
||||
PyObject *resultobj = wrapper(a, tuple); \
|
||||
int result = resultobj ? 0 : -1; \
|
||||
Py_XDECREF(resultobj); \
|
||||
Py_DECREF(tuple); \
|
||||
return result; \
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
namespace {
|
||||
|
|
@ -105,6 +126,8 @@ template <typename _Tp> struct PySwigBuiltin : public SwigPyObject {
|
|||
typedef obj_type* pointer;
|
||||
typedef obj_type& reference;
|
||||
|
||||
static PyObject* richcompare (PyObject *self, PyObject *other, int op);
|
||||
|
||||
static PyMethodDef methods[];
|
||||
static PyGetSetDef getset[];
|
||||
static PyNumberMethods number_methods;
|
||||
|
|
|
|||
|
|
@ -245,7 +245,7 @@ namespace swig {
|
|||
|
||||
template <class Sequence, class Difference, class InputSeq>
|
||||
inline void
|
||||
setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) {
|
||||
setslice(Sequence* self, Difference i, Difference j, const InputSeq& v = InputSeq()) {
|
||||
typename Sequence::size_type size = self->size();
|
||||
typename Sequence::size_type ii = swig::check_index(i, size, true);
|
||||
typename Sequence::size_type jj = swig::slice_index(j, size);
|
||||
|
|
@ -580,18 +580,18 @@ namespace swig
|
|||
|
||||
%fragment("SwigPySequence_Cont");
|
||||
|
||||
# if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("tp_iter") Sequence "&swig::make_output_iterator_builtin< Sequence >";
|
||||
# else
|
||||
%newobject iterator(PyObject **PYTHON_SELF);
|
||||
%extend {
|
||||
swig::SwigPyIterator* iterator(PyObject **PYTHON_SELF) {
|
||||
return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
|
||||
}
|
||||
|
||||
%pythoncode {def __iter__(self): return self.iterator()}
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("pyslot", "tp_iter", functype="getiterfunc") iterator;
|
||||
#else
|
||||
%pythoncode {def __iter__(self): return self.iterator()}
|
||||
#endif
|
||||
}
|
||||
# endif // SWIGPYTHON_BUILTIN
|
||||
|
||||
#endif //SWIG_EXPORT_ITERATOR_METHODS
|
||||
%enddef
|
||||
|
|
@ -603,6 +603,11 @@ namespace swig
|
|||
|
||||
%newobject __getslice__;
|
||||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("pyslot", "nb_nonzero", functype="unaryfunc") __nonzero__;
|
||||
%feature("pyslot", "sq_length", functype="lenfunc") __len__;
|
||||
#endif // SWIGPYTHON_BUILTIN
|
||||
|
||||
%extend {
|
||||
bool __nonzero__() const {
|
||||
return !(self->empty());
|
||||
|
|
@ -618,11 +623,6 @@ namespace swig
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%pybinoperator(__nonzero__, __nonzero__, unaryfunc, nb_nonzero);
|
||||
%pybinoperator(__len__, __len__, lenfunc, sq_length);
|
||||
#endif // SWIGPYTHON_BUILTIN
|
||||
|
||||
%enddef
|
||||
|
||||
|
||||
|
|
@ -633,6 +633,13 @@ namespace swig
|
|||
|
||||
%fragment("SwigPySequence_Base");
|
||||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("pyslot", "sq_item", functype="ssizeargfunc") __getitem__;
|
||||
%feature("pyslot", "sq_slice", functype="ssizessizeargfunc") __getslice__;
|
||||
%feature("pyslot", "sq_ass_item", functype="ssizeobjargproc") __setitem__;
|
||||
%feature("pyslot", "sq_ass_slice", functype="ssizessizeobjargproc") __setslice__;
|
||||
#endif // SWIGPYTHON_BUILTIN
|
||||
|
||||
%extend {
|
||||
value_type pop() throw (std::out_of_range) {
|
||||
if (self->size() == 0)
|
||||
|
|
@ -654,7 +661,7 @@ namespace swig
|
|||
return swig::getslice(self, i, j);
|
||||
}
|
||||
|
||||
void __setslice__(difference_type i, difference_type j, const Sequence& v)
|
||||
void __setslice__(difference_type i, difference_type j, const Sequence& v = Sequence())
|
||||
throw (std::out_of_range, std::invalid_argument) {
|
||||
swig::setslice(self, i, j, v);
|
||||
}
|
||||
|
|
@ -705,13 +712,6 @@ namespace swig
|
|||
|
||||
}
|
||||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%pybinoperator(__getitem__, __getitem__, ssizeargfunc, sq_item);
|
||||
%pybinoperator(__getslice__, __getslice__, ssizessizeargfunc, sq_slice);
|
||||
%pybinoperator(__setitem__, __setitem__, ssizeobjargproc, sq_ass_item);
|
||||
%pybinoperator(__setslice__, __setslice__, ssizessizeobjargproc, sq_ass_slice);
|
||||
#endif // SWIGPYTHON_BUILTIN
|
||||
|
||||
%enddef
|
||||
|
||||
%define %swig_sequence_methods(Sequence...)
|
||||
|
|
|
|||
|
|
@ -350,6 +350,7 @@ namespace swig
|
|||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("tp_iter") SwigPyIterator "&swig::make_output_iterator_builtin<swig::SwigPyIterator>";
|
||||
%feature("pyslot", "tp_iternext", functype="iternextfunc") SwigPyIterator::__next__;
|
||||
#else
|
||||
%extend SwigPyIterator {
|
||||
%pythoncode {def __iter__(self): return self}
|
||||
|
|
@ -370,7 +371,6 @@ namespace swig
|
|||
%catches(swig::stop_iteration) SwigPyIterator::operator + (ptrdiff_t n) const;
|
||||
%catches(swig::stop_iteration) SwigPyIterator::operator - (ptrdiff_t n) const;
|
||||
|
||||
|
||||
struct SwigPyIterator
|
||||
{
|
||||
protected:
|
||||
|
|
|
|||
|
|
@ -465,8 +465,17 @@ SwigPyObject_type(void) {
|
|||
|
||||
SWIGRUNTIMEINLINE int
|
||||
SwigPyObject_Check(PyObject *op) {
|
||||
#ifdef SWIGPYTHON_BUILTIN
|
||||
PyTypeObject *target_tp = SwigPyObject_type();
|
||||
PyTypeObject *obj_tp;
|
||||
for (obj_tp = op->ob_type; obj_tp; obj_tp = obj_tp->tp_base)
|
||||
if (obj_tp == target_tp)
|
||||
return 1;
|
||||
return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0);
|
||||
#else
|
||||
return (Py_TYPE(op) == SwigPyObject_type())
|
||||
|| (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
SWIGRUNTIME PyObject *
|
||||
|
|
|
|||
|
|
@ -119,6 +119,17 @@
|
|||
return new SwigPyMapKeyIterator_T<OutIter>(current, begin, end, seq);
|
||||
}
|
||||
|
||||
template<typename Sequence>
|
||||
inline PyObject* make_output_key_iterator_builtin (PyObject *pyself)
|
||||
{
|
||||
SwigPyObject *builtin_obj = (SwigPyObject*) pyself;
|
||||
Sequence *seq = reinterpret_cast< Sequence * >(builtin_obj->ptr);
|
||||
if (!seq)
|
||||
return SWIG_Py_Void();
|
||||
SwigPyIterator *iter = make_output_key_iterator(seq->begin(), seq->begin(), seq->end(), pyself);
|
||||
return SWIG_NewPointerObj(iter, SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN);
|
||||
}
|
||||
|
||||
template<class OutIterator,
|
||||
class FromOper = from_value_oper<typename OutIterator::value_type> >
|
||||
struct SwigPyMapValueITerator_T : SwigPyMapIterator_T<OutIterator, FromOper>
|
||||
|
|
@ -136,6 +147,7 @@
|
|||
{
|
||||
return new SwigPyMapValueITerator_T<OutIter>(current, begin, end, seq);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -143,6 +155,37 @@
|
|||
%swig_sequence_iterator(Map);
|
||||
%swig_container_methods(Map)
|
||||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("pyslot", "mp_length", functype="lenfunc") __len__;
|
||||
%feature("pyslot", "mp_subscript", functype="binaryfunc") __getitem__;
|
||||
%feature("tp_iter") Map "&swig::make_output_key_iterator_builtin< Map >";
|
||||
|
||||
%extend {
|
||||
%newobject iterkeys(PyObject **PYTHON_SELF);
|
||||
swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) {
|
||||
return swig::make_output_key_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_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF);
|
||||
}
|
||||
|
||||
%newobject iteritems(PyObject **PYTHON_SELF);
|
||||
swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) {
|
||||
return swig::make_output_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 {
|
||||
mapped_type __getitem__(const key_type& key) const throw (std::out_of_range) {
|
||||
Map::const_iterator i = self->find(key);
|
||||
|
|
@ -151,7 +194,7 @@
|
|||
else
|
||||
throw std::out_of_range("key not found");
|
||||
}
|
||||
|
||||
|
||||
void __delitem__(const key_type& key) throw (std::out_of_range) {
|
||||
Map::iterator i = self->find(key);
|
||||
if (i != self->end())
|
||||
|
|
@ -236,16 +279,24 @@
|
|||
swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) {
|
||||
return swig::make_output_value_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_map_methods(Map...)
|
||||
%swig_map_common(Map)
|
||||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("pyslot", "mp_ass_subscript", functype="objobjargproc") __setitem__;
|
||||
|
||||
%extend {
|
||||
// This will be called through the mp_ass_subscript slot to delete an entry.
|
||||
void __setitem__(const key_type& key) {
|
||||
self->erase(key);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
%extend {
|
||||
void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) {
|
||||
(*self)[key] = x;
|
||||
|
|
|
|||
|
|
@ -116,9 +116,58 @@
|
|||
}
|
||||
};
|
||||
}
|
||||
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
SWIGINTERN Py_ssize_t
|
||||
SwigPython_std_pair_len (PyObject *a)
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
SWIGINTERN PyObject*
|
||||
SwigPython_std_pair_repr (PyObject *o)
|
||||
{
|
||||
static PyObject *first = PyString_FromString("first");
|
||||
static PyObject *second = PyString_FromString("second");
|
||||
PyObject *tuple = PyTuple_New(2);
|
||||
assert(tuple);
|
||||
PyTuple_SET_ITEM(tuple, 0, PyObject_GetAttr(o, first));
|
||||
PyTuple_SET_ITEM(tuple, 1, PyObject_GetAttr(o, second));
|
||||
PyObject *result = PyObject_Repr(tuple);
|
||||
Py_DECREF(tuple);
|
||||
return result;
|
||||
}
|
||||
|
||||
SWIGINTERN PyObject*
|
||||
SwigPython_std_pair_getitem (PyObject *a, Py_ssize_t b)
|
||||
{
|
||||
static PyObject *first = PyString_FromString("first");
|
||||
static PyObject *second = PyString_FromString("second");
|
||||
PyObject *attr_name = b % 2 ? second : first;
|
||||
PyObject *result = PyObject_GetAttr(a, attr_name);
|
||||
return result;
|
||||
}
|
||||
|
||||
SWIGINTERN int
|
||||
SwigPython_std_pair_setitem (PyObject *a, Py_ssize_t b, PyObject *c)
|
||||
{
|
||||
static PyObject *first = PyString_FromString("first");
|
||||
static PyObject *second = PyString_FromString("second");
|
||||
PyObject *attr_name = b % 2 ? second : first;
|
||||
int result = PyObject_SetAttr(a, attr_name, c);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
%define %swig_pair_methods(pair...)
|
||||
#if defined(SWIGPYTHON_BUILTIN)
|
||||
%feature("sq_length") pair "SwigPython_std_pair_len";
|
||||
%feature("tp_repr") pair "SwigPython_std_pair_repr";
|
||||
%feature("sq_item") pair "SwigPython_std_pair_getitem";
|
||||
%feature("sq_ass_item") pair "SwigPython_std_pair_setitem";
|
||||
#else
|
||||
%extend {
|
||||
%pythoncode {def __len__(self): return 2
|
||||
def __repr__(self): return str((self.first, self.second))
|
||||
|
|
@ -133,6 +182,7 @@ def __setitem__(self, index, val):
|
|||
else:
|
||||
self.second = val}
|
||||
}
|
||||
#endif
|
||||
%enddef
|
||||
|
||||
%include <std/std_pair.i>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue