198
199
} else if (insert && ((size_t) i == size)) {
202
202
throw std::out_of_range("index out of range");
206
slice_index(ptrdiff_t i, size_t size) {
208
if ((size_t) (-i) <= size) {
209
return (size_t) (i + size);
205
template <class Difference>
207
slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) {
209
throw std::invalid_argument("slice step cannot be zero");
210
} else if (step > 0) {
211
// Required range: 0 <= i < size, 0 <= j < size
214
} else if (i < (Difference)size) {
216
} else if (insert && (i >= (Difference)size)) {
217
ii = (Difference)size;
211
throw std::out_of_range("index out of range");
222
jj = (j < (Difference)size) ? j : (Difference)size;
214
return ( (size_t) i < size ) ? ((size_t) i) : size;
225
// Required range: -1 <= i < size-1, -1 <= j < size-1
228
} else if (i < (Difference) size) {
230
} else if (i >= (Difference)(size-1)) {
231
ii = (Difference)(size-1);
236
jj = (j < (Difference)size ) ? j : (Difference)(size-1);
234
257
template <class Sequence, class Difference>
236
getslice(const Sequence* self, Difference i, Difference j) {
259
getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) {
237
260
typename Sequence::size_type size = self->size();
238
typename Sequence::size_type ii = swig::check_index(i, size);
239
typename Sequence::size_type jj = swig::slice_index(j, size);
263
swig::slice_adjust(i, j, step, size, ii, jj);
242
typename Sequence::const_iterator vb = self->begin();
243
typename Sequence::const_iterator ve = self->begin();
246
return new Sequence(vb, ve);
266
typename Sequence::const_iterator sb = self->begin();
267
typename Sequence::const_iterator se = self->begin();
271
return new Sequence(sb, se);
273
Sequence *sequence = new Sequence();
274
typename Sequence::const_iterator it = sb;
276
sequence->push_back(*it);
277
for (Py_ssize_t c=0; c<step && it!=se; ++c)
248
return new Sequence();
283
Sequence *sequence = new Sequence();
285
typename Sequence::const_reverse_iterator sb = self->rbegin();
286
typename Sequence::const_reverse_iterator se = self->rbegin();
287
std::advance(sb,size-ii-1);
288
std::advance(se,size-jj-1);
289
typename Sequence::const_reverse_iterator it = sb;
291
sequence->push_back(*it);
292
for (Py_ssize_t c=0; c<-step && it!=se; ++c)
252
300
template <class Sequence, class Difference, class InputSeq>
254
setslice(Sequence* self, Difference i, Difference j, const InputSeq& v = InputSeq()) {
302
setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) {
255
303
typename Sequence::size_type size = self->size();
256
typename Sequence::size_type ii = swig::check_index(i, size, true);
257
typename Sequence::size_type jj = swig::slice_index(j, size);
258
if (jj < ii) jj = ii;
259
size_t ssize = jj - ii;
260
if (ssize <= v.size()) {
261
typename Sequence::iterator sb = self->begin();
262
typename InputSeq::const_iterator vmid = v.begin();
264
std::advance(vmid, jj - ii);
265
self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end());
306
swig::slice_adjust(i, j, step, size, ii, jj, true);
311
size_t ssize = jj - ii;
312
if (ssize <= is.size()) {
313
// expanding/staying the same size
314
typename Sequence::iterator sb = self->begin();
315
typename InputSeq::const_iterator isit = is.begin();
317
std::advance(isit, jj - ii);
318
self->insert(std::copy(is.begin(), isit, sb), isit, is.end());
321
typename Sequence::iterator sb = self->begin();
322
typename Sequence::iterator se = self->begin();
328
self->insert(sb, is.begin(), is.end());
331
size_t replacecount = (jj - ii + step - 1) / step;
332
if (is.size() != replacecount) {
334
sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
335
throw std::invalid_argument(msg);
337
typename Sequence::const_iterator isit = is.begin();
338
typename Sequence::iterator it = self->begin();
340
for (size_t rc=0; rc<replacecount; ++rc) {
342
for (Py_ssize_t c=0; c<(step-1); ++c)
267
typename Sequence::iterator sb = self->begin();
268
typename Sequence::iterator se = self->begin();
272
self->insert(sb, v.begin(), v.end());
349
size_t replacecount = (ii - jj - step - 1) / -step;
350
if (is.size() != replacecount) {
352
sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount);
353
throw std::invalid_argument(msg);
355
typename Sequence::const_iterator isit = is.begin();
356
typename Sequence::reverse_iterator it = self->rbegin();
357
std::advance(it,size-ii-1);
358
for (size_t rc=0; rc<replacecount; ++rc) {
360
for (Py_ssize_t c=0; c<(-step-1); ++c)
276
366
template <class Sequence, class Difference>
278
delslice(Sequence* self, Difference i, Difference j) {
368
delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) {
279
369
typename Sequence::size_type size = self->size();
280
typename Sequence::size_type ii = swig::check_index(i, size, true);
281
typename Sequence::size_type jj = swig::slice_index(j, size);
283
typename Sequence::iterator sb = self->begin();
284
typename Sequence::iterator se = self->begin();
372
swig::slice_adjust(i, j, step, size, ii, jj, true);
375
typename Sequence::iterator sb = self->begin();
378
typename Sequence::iterator se = self->begin();
382
typename Sequence::iterator it = sb;
383
size_t delcount = (jj - ii + step - 1) / step;
385
it = self->erase(it);
388
for (Py_ssize_t c=0; c<(step-1); ++c)
396
typename Sequence::reverse_iterator sb = self->rbegin();
397
std::advance(sb,size-ii-1);
398
typename Sequence::reverse_iterator it = sb;
399
size_t delcount = (ii - jj - step - 1) / -step;
401
self->erase((++it).base());
402
if (it==self->rend())
404
for (Py_ssize_t c=0; c<(-step-1); ++c)
668
793
$1 = PySlice_Check($input);
671
Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range) {
672
return swig::getslice(self, i, j);
675
void __setslice__(difference_type i, difference_type j, const Sequence& v = Sequence())
676
throw (std::out_of_range, std::invalid_argument) {
677
swig::setslice(self, i, j, v);
680
void __delslice__(difference_type i, difference_type j) throw (std::out_of_range) {
681
swig::delslice(self, i, j);
796
/* deprecated in Python 2 */
798
Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) {
799
return swig::getslice(self, i, j, 1);
802
void __setslice__(difference_type i, difference_type j, const Sequence& v = Sequence()) throw (std::out_of_range, std::invalid_argument) {
803
swig::setslice(self, i, j, 1, v);
806
void __delslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) {
807
swig::delslice(self, i, j, 1);
684
811
void __delitem__(difference_type i) throw (std::out_of_range) {
685
812
self->erase(swig::getpos(self,i));
689
816
/* Overloaded methods for Python 3 compatibility
690
817
* (Also useful in Python 2.x)
692
Sequence* __getitem__(PySliceObject *slice) throw (std::out_of_range) {
819
Sequence* __getitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) {
693
820
Py_ssize_t i, j, step;
694
821
if( !PySlice_Check(slice) ) {
695
822
SWIG_Error(SWIG_TypeError, "Slice object expected.");
698
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), self->size(), &i, &j, &step);
699
return swig::getslice(self, i, j);
702
void __setitem__(PySliceObject *slice, const Sequence& v)
703
throw (std::out_of_range, std::invalid_argument) {
704
Py_ssize_t i, j, step;
705
if( !PySlice_Check(slice) ) {
706
SWIG_Error(SWIG_TypeError, "Slice object expected.");
709
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), self->size(), &i, &j, &step);
710
swig::setslice(self, i, j, v);
713
void __setitem__(PySliceObject *slice)
714
throw (std::out_of_range) {
715
Py_ssize_t i, j, step;
716
if( !PySlice_Check(slice) ) {
717
SWIG_Error(SWIG_TypeError, "Slice object expected.");
720
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), self->size(), &i, &j, &step);
721
swig::delslice(self, i,j);
724
void __delitem__(PySliceObject *slice)
725
throw (std::out_of_range) {
726
Py_ssize_t i, j, step;
727
if( !PySlice_Check(slice) ) {
728
SWIG_Error(SWIG_TypeError, "Slice object expected.");
731
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), self->size(), &i, &j, &step);
732
swig::delslice(self, i,j);
825
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
826
Sequence::difference_type id = i;
827
Sequence::difference_type jd = j;
828
return swig::getslice(self, id, jd, step);
831
void __setitem__(PySliceObject *slice, const Sequence& v) throw (std::out_of_range, std::invalid_argument) {
832
Py_ssize_t i, j, step;
833
if( !PySlice_Check(slice) ) {
834
SWIG_Error(SWIG_TypeError, "Slice object expected.");
837
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
838
Sequence::difference_type id = i;
839
Sequence::difference_type jd = j;
840
swig::setslice(self, id, jd, step, v);
843
void __setitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) {
844
Py_ssize_t i, j, step;
845
if( !PySlice_Check(slice) ) {
846
SWIG_Error(SWIG_TypeError, "Slice object expected.");
849
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
850
Sequence::difference_type id = i;
851
Sequence::difference_type jd = j;
852
swig::delslice(self, id, jd, step);
855
void __delitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) {
856
Py_ssize_t i, j, step;
857
if( !PySlice_Check(slice) ) {
858
SWIG_Error(SWIG_TypeError, "Slice object expected.");
861
PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step);
862
Sequence::difference_type id = i;
863
Sequence::difference_type jd = j;
864
swig::delslice(self, id, jd, step);