[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