ecere/containers: Iterator::Index() now returning false when creating new entry
[sdk] / ecere / src / com / containers / LinkList.ec
index 044f13b..1cb5ee6 100644 (file)
@@ -32,7 +32,7 @@ public:
    LT GetNext(IteratorPointer item) { return ((LT)item).link.next; }
    LT GetData(IteratorPointer pointer) { return (LT)pointer; }
 
-   IteratorPointer GetAtPosition(I pos, bool create)
+   IteratorPointer GetAtPosition(const I pos, bool create, bool * justAdded)
    {
       int c;
       LT item;
@@ -50,7 +50,7 @@ public:
       if(item)
       {
          item.link.prev = last;
-         if(item.link.prev) 
+         if(item.link.prev)
             item.link.prev.link.next = item;
          if(!first) first = item;
          last = item;
@@ -83,7 +83,7 @@ public:
                   item.link.prev.link.next = item;
                else
                   item.link.next = item;
-            }                 
+            }
          }
          if(prevItem == last) last = item;
          if(item.link.next)
@@ -101,7 +101,7 @@ public:
       {
          if(item.link.prev)
             item.link.prev.link.next = item.link.next;
-         if(item.link.next) 
+         if(item.link.next)
             item.link.next.link.prev = item.link.prev;
          if(circ && last == first)
             last = first = null;
@@ -122,18 +122,19 @@ public:
       LT prevItem = (LT)_prevItem;
       if(item)
       {
-         if(prevItem != item && (first != item || prevItem)) 
+         if(prevItem != item && (first != item || prevItem))
          {
-            if(item.link.prev) 
+            if(item.link.prev)
                item.link.prev.link.next = item.link.next;
-            if(item.link.next) 
+            if(item.link.next)
                item.link.next.link.prev = item.link.prev;
             if(item == first) first = item.link.next;
             if(item == last)  last = item.link.prev;
-      
-            if(prevItem == last) 
+
+            if(prevItem == last)
                last = item;
-         
+
+            item.link.prev = prevItem ? prevItem : (circ ? last : null);
             if(prevItem)
             {
                item.link.next = prevItem.link.next;
@@ -143,9 +144,15 @@ public:
             {
                item.link.next = first;
                first = item;
+               if(circ)
+               {
+                   if(item.link.prev)
+                      item.link.prev.link.next = item;
+                   else
+                      item.link.next = item;
+               }
             }
-            item.link.prev = prevItem;
-            if(item.link.next) 
+            if(item.link.next)
                item.link.next.link.prev = item;
          }
       }
@@ -159,7 +166,7 @@ public:
    void Free()
    {
       LT item;
-      while(item = first)
+      while((item = first))
       {
          Remove(item);
          delete item;