Slight simplification of Python slicing
This commit is contained in:
parent
a4015acaca
commit
5ebf1cfa5d
1 changed files with 38 additions and 44 deletions
|
|
@ -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,7 +289,6 @@ 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);
|
||||||
|
|
@ -296,7 +299,6 @@ namespace swig {
|
||||||
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,7 +373,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) {
|
|
||||||
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) {
|
||||||
|
|
@ -392,9 +389,7 @@ namespace swig {
|
||||||
delcount--;
|
delcount--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (ii > jj) {
|
|
||||||
typename Sequence::reverse_iterator sb = self->rbegin();
|
typename Sequence::reverse_iterator sb = self->rbegin();
|
||||||
std::advance(sb,size-ii-1);
|
std::advance(sb,size-ii-1);
|
||||||
typename Sequence::reverse_iterator it = sb;
|
typename Sequence::reverse_iterator it = sb;
|
||||||
|
|
@ -407,7 +402,6 @@ namespace swig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue