diff --git a/SWIG/Examples/test-suite/python/li_std_vector_runme.py b/SWIG/Examples/test-suite/python/li_std_vector_runme.py index dd6352f38..ed2943b67 100644 --- a/SWIG/Examples/test-suite/python/li_std_vector_runme.py +++ b/SWIG/Examples/test-suite/python/li_std_vector_runme.py @@ -102,3 +102,12 @@ pv = pyvector([1, "hello", (1,2)]) if pv[1] != "hello": raise RuntimeError + +iv = IntVector(5) +for i in range(0,5): + iv[i] = i + +iv[1:3] = [] +if iv[1] != 3: + raise RuntimeError + diff --git a/SWIG/Lib/python/pycontainer.swg b/SWIG/Lib/python/pycontainer.swg index eee5987c0..638a2b1c9 100644 --- a/SWIG/Lib/python/pycontainer.swg +++ b/SWIG/Lib/python/pycontainer.swg @@ -239,11 +239,21 @@ namespace swig { 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; - typename Sequence::iterator sb = self->begin(); - typename InputSeq::const_iterator vmid = v.begin(); - std::advance(sb,ii); - std::advance(vmid, jj - ii); - self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); + size_t ssize = jj - ii; + if (ssize <= v.size()) { + typename Sequence::iterator sb = self->begin(); + typename InputSeq::const_iterator vmid = v.begin(); + std::advance(sb,ii); + std::advance(vmid, jj - ii); + self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); + } else { + 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()); + } } template