From 52a01518f1a511f737b00f59c83d327c4e130c5b Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Mon, 5 Apr 2004 23:24:39 +0000 Subject: [PATCH] fix vector problems git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5831 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- Lib/python/pycontainer.i | 75 ++++++++++++++++------------------------ Lib/python/std_vector.i | 34 ++++++++++++++++++ 2 files changed, 63 insertions(+), 46 deletions(-) diff --git a/Lib/python/pycontainer.i b/Lib/python/pycontainer.i index 984f6a594..92488208b 100644 --- a/Lib/python/pycontainer.i +++ b/Lib/python/pycontainer.i @@ -17,15 +17,17 @@ #if PY_VERSION_HEX < 0x02000000 #define PySequence_Size PySequence_Length #endif +#include %} %fragment("PySequence_Base","header") %{ namespace swigpy { inline size_t - sequence_index(ptrdiff_t i, size_t size) { + check_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { - if ((size_t) (-i) <= size) return (size_t) (i + size); + if ((size_t) (-i) <= size) + return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } @@ -42,6 +44,22 @@ namespace swigpy { } } + template + inline typename Sequence::iterator + getpos(Sequence* self, Difference i) { + typename Sequence::iterator pos = self->begin(); + std::advance(pos, swigpy::check_index(i, self->size())); + return pos; + } + + template + inline typename Sequence::const_iterator + getpos(const Sequence* self, Difference i) { + typename Sequence::const_iterator pos = self->begin(); + std::advance(pos, swigpy::check_index(i, self->size())); + return pos; + } + template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { @@ -49,11 +67,7 @@ namespace swigpy { typename Sequence::size_type ii = swigpy::slice_index(i, size); typename Sequence::size_type jj = swigpy::slice_index(j, size); if (jj > ii) { - typename Sequence::const_iterator beg = self->begin(); - std::advance(beg, ii); - typename Sequence::const_iterator end = self->begin(); - std::advance(end, jj); - return new Sequence(beg, end); + return new Sequence(getpos(self, ii), getpos(self, jj)); } else { return new Sequence(); } @@ -66,11 +80,8 @@ namespace swigpy { typename Sequence::size_type ii = swigpy::slice_index(i, size); typename Sequence::size_type jj = swigpy::slice_index(j, size); if (jj < ii) jj = ii; - typename Sequence::iterator beg = self->begin(); - std::advance(beg,ii); - typename InputSeq::const_iterator vmid = v.begin(); - std::advance(vmid, jj - ii); - self->insert(std::copy(v.begin(), vmid, beg), vmid, v.end()); + typename InputSeq::const_iterator vmid = getpos(&v, jj - ii); + self->insert(std::copy(v.begin(), vmid, getpos(self,ii)), vmid, v.end()); } template @@ -80,37 +91,9 @@ namespace swigpy { typename Sequence::size_type ii = swigpy::slice_index(i, size); typename Sequence::size_type jj = swigpy::slice_index(j, size); if (jj > ii) { - typename Sequence::iterator beg = self->begin(); - std::advance(beg, ii); - typename Sequence::iterator end = self->begin(); - std::advance(end, jj); - self->erase(beg, end); + self->erase(getpos(self,ii), getpos(self,jj)); } } - - template - inline void - delitem(Sequence* self, Difference i) { - typename Sequence::iterator pos = self->begin(); - std::advance(pos, swigpy::sequence_index(i, self->size())); - self->erase(pos); - } - - template - inline const typename Sequence::value_type& - getitem(const Sequence* self, Difference i) { - typename Sequence::const_iterator pos = self->begin(); - std::advance(pos, swigpy::sequence_index(i, self->size())); - return *(pos); - } - - template - inline void - setitem(Sequence* self, Difference i, const Value& x) { - typename Sequence::iterator pos = self->begin(); - std::advance(pos, swigpy::sequence_index(i, self->size())); - *(pos) = x; - } } %} @@ -424,7 +407,7 @@ namespace swigpy } void __delitem__(difference_type i) { - swigpy::delitem(self,i); + self->erase(swigpy::getpos(self,i)); } } %enddef @@ -433,11 +416,11 @@ namespace swigpy %pysequence_methods_common(SWIG_arg(Sequence)) %extend { const value_type& __getitem__(difference_type i) const { - return swigpy::getitem(self, i); + return *(swigpy::getpos(self, i)); } void __setitem__(difference_type i, const value_type& x) { - swigpy::setitem(self, i, x); + *(swigpy::getpos(self,i)) = x; } void append(const value_type& x) { @@ -450,11 +433,11 @@ namespace swigpy %pysequence_methods_common(SWIG_arg(Sequence)) %extend { value_type __getitem__(difference_type i) { - return swigpy::getitem(self, i); + return *(swigpy::getpos(self, i)); } void __setitem__(difference_type i, value_type x) { - swigpy::setitem(self, i, x); + *(swigpy::getpos(self,i)) = x; } void append(value_type x) { diff --git a/Lib/python/std_vector.i b/Lib/python/std_vector.i index 8e9ff0dca..4b14256b9 100644 --- a/Lib/python/std_vector.i +++ b/Lib/python/std_vector.i @@ -153,6 +153,40 @@ namespace std { %std_vector_methods_val(vector); %pysequence_methods_val(std::vector); }; + + // *** + // *** + template class vector { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef bool value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type reference; + typedef value_type const_reference; + + %traits_swigtype(bool); + + %fragment(SWIG_Traits_frag(std::vector), "header", + fragment=SWIG_Traits_frag(bool), + fragment="StdVectorTraits") { + namespace swigpy { + template <> struct traits > { + typedef value_category category; + static const char* type_name() { + return "std::vector"; + } + }; + } + } + + %typemap_traits_ptr(SWIG_CCode(VECTOR), std::vector); + + %std_vector_methods_val(vector); + %pysequence_methods_val(std::vector); + }; + } %define %std_vector_ptypen(...)