diff options
Diffstat (limited to 'Lib/ruby/rubycontainer.swg')
-rw-r--r-- | Lib/ruby/rubycontainer.swg | 53 |
1 files changed, 28 insertions, 25 deletions
diff --git a/Lib/ruby/rubycontainer.swg b/Lib/ruby/rubycontainer.swg index 9fa205bf5..cd912d959 100644 --- a/Lib/ruby/rubycontainer.swg +++ b/Lib/ruby/rubycontainer.swg @@ -101,7 +101,7 @@ namespace swig { inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); - typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); + typename Sequence::size_type ii = swig::check_index(i, size, (i == (Difference)size && j == (Difference)size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { @@ -117,25 +117,29 @@ 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& is) { 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); if (jj < ii) jj = ii; size_t ssize = jj - ii; - if (ssize <= v.size()) { + if (ssize <= is.size()) { + // expanding/staying the same size typename Sequence::iterator sb = self->begin(); - typename InputSeq::const_iterator vmid = v.begin(); + typename InputSeq::const_iterator vmid = is.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); - self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); + self->insert(std::copy(is.begin(), vmid, sb), vmid, is.end()); } else { + // shrinking typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); - self->insert(sb, v.begin(), v.end()); + sb = self->begin(); + std::advance(sb,ii); + self->insert(sb, is.begin(), is.end()); } } @@ -186,7 +190,7 @@ namespace swig return swig::as<T>(item); } catch (const std::invalid_argument& e) { char msg[1024]; - sprintf(msg, "in sequence element %d ", _index); + SWIG_snprintf(msg, sizeof(msg), "in sequence element %d ", _index); VALUE lastErr = rb_gv_get("$!"); if ( lastErr == Qnil ) { %type_error(swig::type_name<T>()); @@ -338,7 +342,7 @@ namespace swig typedef T value_type; typedef T* pointer; typedef int difference_type; - typedef int size_type; + typedef std::size_t size_type; typedef const pointer const_pointer; typedef RubySequence_InputIterator<T, reference> iterator; typedef RubySequence_InputIterator<T, const_reference> const_iterator; @@ -628,7 +632,7 @@ namespace swig try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -687,9 +691,8 @@ namespace swig r = swig::from< Sequence::value_type >( *(at) ); $self->erase(at); } - catch (std::out_of_range) - { - } + catch (const std::out_of_range&) { + } return r; } } @@ -757,7 +760,7 @@ namespace swig try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -780,7 +783,7 @@ namespace swig try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -790,7 +793,7 @@ namespace swig try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } - catch( std::out_of_range ) { + catch( const std::out_of_range& ) { } return r; } @@ -804,9 +807,9 @@ namespace swig static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); - VALUE start = rb_funcall( i, id_start, 0 ); - VALUE end = rb_funcall( i, id_end, 0 ); - bool noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue ); + VALUE start = rb_funcall2( i, id_start, 0, 0 ); + VALUE end = rb_funcall2( i, id_end, 0, 0 ); + bool noend = ( rb_funcall2( i, id_noend, 0, 0 ) == Qtrue ); int len = $self->size(); @@ -838,7 +841,7 @@ namespace swig return swig::from< Sequence::value_type >( x ); } - VALUE __setitem__(difference_type i, difference_type length, const Sequence& v) throw (std::invalid_argument) { + VALUE __setitem__(difference_type i, difference_type length, const Sequence& is) throw (std::invalid_argument) { if ( length < 0 ) return Qnil; @@ -850,13 +853,13 @@ namespace swig i = len + i; } Sequence::difference_type j = length + i; - if ( j > static_cast<Sequence::difference_type>(len) ) { - swig::resize( $self, j, *(v.begin()) ); + if ( j > static_cast<Sequence::difference_type>(len) && is.size() > 0 ) { + swig::resize( $self, j, *(is.begin()) ); } VALUE r = Qnil; - swig::setslice($self, i, j, v); - r = swig::from< const Sequence* >( &v ); + swig::setslice($self, i, j, is); + r = swig::from< const Sequence* >( &is ); return r; } } @@ -1017,7 +1020,7 @@ namespace swig { } else { return rubyseq.check() ? SWIG_OK : SWIG_ERROR; } - } catch (std::exception& e) { + } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { @@ -1057,7 +1060,7 @@ namespace swig { } else { return true; } - } catch (std::exception& e) { + } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { |