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,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--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue