Slight simplification of Python slicing

This commit is contained in:
William S Fulton 2016-09-01 08:38:31 +01:00
commit 5ebf1cfa5d

View file

@ -206,7 +206,7 @@ namespace swig {
if (step == 0) { if (step == 0) {
throw std::invalid_argument("slice step cannot be zero"); throw std::invalid_argument("slice step cannot be zero");
} else if (step > 0) { } else if (step > 0) {
// Required range: 0 <= i < size, 0 <= j < size // Required range: 0 <= i < size, 0 <= j < size, i <= j
if (i < 0) { if (i < 0) {
ii = 0; ii = 0;
} else if (i < (Difference)size) { } else if (i < (Difference)size) {
@ -214,13 +214,15 @@ namespace swig {
} else if (insert && (i >= (Difference)size)) { } else if (insert && (i >= (Difference)size)) {
ii = (Difference)size; ii = (Difference)size;
} }
if ( j < 0 ) { if (j < 0) {
jj = 0; jj = 0;
} else { } else {
jj = (j < (Difference)size) ? j : (Difference)size; jj = (j < (Difference)size) ? j : (Difference)size;
} }
if (jj < ii)
jj = ii;
} else { } else {
// Required range: -1 <= i < size-1, -1 <= j < size-1 // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j
if (i < -1) { if (i < -1) {
ii = -1; ii = -1;
} else if (i < (Difference) size) { } else if (i < (Difference) size) {
@ -233,6 +235,8 @@ namespace swig {
} else { } else {
jj = (j < (Difference)size ) ? j : (Difference)(size-1); jj = (j < (Difference)size ) ? j : (Difference)(size-1);
} }
if (ii < jj)
ii = jj;
} }
} }
@ -285,17 +289,15 @@ namespace swig {
} }
} else { } else {
Sequence *sequence = new Sequence(); Sequence *sequence = new Sequence();
if (ii > jj) { typename Sequence::const_reverse_iterator sb = self->rbegin();
typename Sequence::const_reverse_iterator sb = self->rbegin(); typename Sequence::const_reverse_iterator se = self->rbegin();
typename Sequence::const_reverse_iterator se = self->rbegin(); std::advance(sb,size-ii-1);
std::advance(sb,size-ii-1); std::advance(se,size-jj-1);
std::advance(se,size-jj-1); typename Sequence::const_reverse_iterator it = sb;
typename Sequence::const_reverse_iterator it = sb; while (it!=se) {
while (it!=se) { sequence->push_back(*it);
sequence->push_back(*it); for (Py_ssize_t c=0; c<-step && it!=se; ++c)
for (Py_ssize_t c=0; c<-step && it!=se; ++c) it++;
it++;
}
} }
return sequence; return sequence;
} }
@ -309,8 +311,6 @@ namespace swig {
Difference jj = 0; Difference jj = 0;
swig::slice_adjust(i, j, step, size, ii, jj, true); swig::slice_adjust(i, j, step, size, ii, jj, true);
if (step > 0) { if (step > 0) {
if (jj < ii)
jj = ii;
if (step == 1) { if (step == 1) {
size_t ssize = jj - ii; size_t ssize = jj - ii;
if (ssize <= is.size()) { if (ssize <= is.size()) {
@ -348,8 +348,6 @@ namespace swig {
} }
} }
} else { } else {
if (jj > ii)
jj = ii;
size_t replacecount = (ii - jj - step - 1) / -step; size_t replacecount = (ii - jj - step - 1) / -step;
if (is.size() != replacecount) { if (is.size() != replacecount) {
char msg[1024]; char msg[1024];
@ -375,37 +373,33 @@ namespace swig {
Difference jj = 0; Difference jj = 0;
swig::slice_adjust(i, j, step, size, ii, jj, true); swig::slice_adjust(i, j, step, size, ii, jj, true);
if (step > 0) { if (step > 0) {
if (jj > ii) { typename Sequence::iterator sb = self->begin();
typename Sequence::iterator sb = self->begin(); std::advance(sb,ii);
std::advance(sb,ii); if (step == 1) {
if (step == 1) { typename Sequence::iterator se = self->begin();
typename Sequence::iterator se = self->begin(); std::advance(se,jj);
std::advance(se,jj); self->erase(sb,se);
self->erase(sb,se); } else {
} else { typename Sequence::iterator it = sb;
typename Sequence::iterator it = sb; size_t delcount = (jj - ii + step - 1) / step;
size_t delcount = (jj - ii + step - 1) / step;
while (delcount) {
it = self->erase(it);
for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
it++;
delcount--;
}
}
}
} else {
if (ii > jj) {
typename Sequence::reverse_iterator sb = self->rbegin();
std::advance(sb,size-ii-1);
typename Sequence::reverse_iterator it = sb;
size_t delcount = (ii - jj - step - 1) / -step;
while (delcount) { while (delcount) {
it = typename Sequence::reverse_iterator(self->erase((++it).base())); it = self->erase(it);
for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
it++; it++;
delcount--; delcount--;
} }
} }
} else {
typename Sequence::reverse_iterator sb = self->rbegin();
std::advance(sb,size-ii-1);
typename Sequence::reverse_iterator it = sb;
size_t delcount = (ii - jj - step - 1) / -step;
while (delcount) {
it = typename Sequence::reverse_iterator(self->erase((++it).base()));
for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
it++;
delcount--;
}
} }
} }
} }