[PPL-devel] [GIT] ppl/ppl(sparse_matrices): Unlimited_Sparse_Row_Std_List_Backend: fix splice() methods, now really.
Marco Poletti
poletti.marco at gmail.com
Thu Mar 4 21:54:58 CET 2010
Module: ppl/ppl
Branch: sparse_matrices
Commit: b51d58f85807e989747590684657bfccc87c7853
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=b51d58f85807e989747590684657bfccc87c7853
Author: Marco Poletti <poletti.marco at 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;
}
More information about the PPL-devel
mailing list