[GIT] ppl/ppl(sparse_matrices): Unlimited_Sparse_Row_Std_List_Backend: fix splice() methods, now really.

Module: ppl/ppl Branch: sparse_matrices Commit: b51d58f85807e989747590684657bfccc87c7853 URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=b51d58f85807e...
Author: Marco Poletti poletti.marco@gmail.com Date: Thu Mar 4 21:51:55 2010 +0100
Unlimited_Sparse_Row_Std_List_Backend: fix splice() methods, now really.
---
...nlimited_Sparse_Row_Std_List_Backend.inlines.hh | 46 +++++++++++++------- 1 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/src/Unlimited_Sparse_Row_Std_List_Backend.inlines.hh b/src/Unlimited_Sparse_Row_Std_List_Backend.inlines.hh index adb0681..674bc78 100644 --- a/src/Unlimited_Sparse_Row_Std_List_Backend.inlines.hh +++ b/src/Unlimited_Sparse_Row_Std_List_Backend.inlines.hh @@ -45,13 +45,14 @@ Unlimited_Sparse_Row_Std_List_Backend::dangerous_iterator::next(iterator i) {
inline Unlimited_Sparse_Row_Std_List_Backend::iterator Unlimited_Sparse_Row_Std_List_Backend::splice(iterator& position,This& x) { - bool inserting_at_beginning = (position == begin()); + PPL_ASSERT(this != &x); + if (position == begin()) { + Base::splice(position,x); + return begin(); + } iterator previous = position; - if (!inserting_at_beginning) - --previous; + --previous; Base::splice(position,x); - if (inserting_at_beginning) - return begin(); ++previous; return previous; } @@ -59,27 +60,40 @@ Unlimited_Sparse_Row_Std_List_Backend::splice(iterator& position,This& x) { inline Unlimited_Sparse_Row_Std_List_Backend::iterator Unlimited_Sparse_Row_Std_List_Backend::splice(iterator& position,This& x, iterator i) { - bool inserting_at_beginning = (position == begin()); + if (position == begin()) { + Base::splice(position,x,i); + return begin(); + } iterator previous = position; - if (!inserting_at_beginning) + --previous; + if (previous == i) { + Base::splice(position,x,i); + // previous is no longer valid because it was equal to i. + previous = position; --previous; - Base::splice(position,x,i); - if (inserting_at_beginning) - return begin(); - ++previous; + } else { + Base::splice(position,x,i); + ++previous; + } return previous; }
inline Unlimited_Sparse_Row_Std_List_Backend::iterator Unlimited_Sparse_Row_Std_List_Backend::splice(iterator& position,This& x, iterator first,iterator last) { - bool inserting_at_beginning = (position == begin()); + if (position == begin()) { + Base::splice(position,x,first,last); + return begin(); + } + if (first == last) + return position; + if (last == position) + return first; iterator previous = position; - if (!inserting_at_beginning) - --previous; + --previous; + // previous is not in [first,last) because position is not in [first,last) + // and position!=last. Base::splice(position,x,first,last); - if (inserting_at_beginning) - return begin(); ++previous; return previous; }
participants (1)
-
Marco Poletti