5 public struct LinkElement<class T:void *>
10 public class ListItem : IteratorPointer
16 LinkElement<thisclass> link;
17 struct { thisclass prev, next; };
21 public class LinkList<class LT:void * = ListItem, bool circ = false, link = LT::link> : Container<LT>
28 // Generic iterator support
29 LT GetFirst() { return first; }
30 LT GetLast() { return last; }
31 LT GetPrev(IteratorPointer item) { return ((LT)item).link.prev; }
32 LT GetNext(IteratorPointer item) { return ((LT)item).link.next; }
33 LT GetData(IteratorPointer pointer) { return (LT)pointer; }
35 IteratorPointer GetAtPosition(const I pos, bool create, bool * justAdded)
39 for(c = 0, item = first; c < (int)pos && item; c++, item = item.link.next);
40 return (IteratorPointer)item;
42 bool SetData(IteratorPointer pointer, LT data)
44 // Not supported for LinkList
48 IteratorPointer Add(LT item)
52 item.link.prev = last;
54 item.link.prev.link.next = item;
55 if(!first) first = item;
57 item.link.next = circ ? first : null;
59 first.link.prev = item;
62 return (IteratorPointer)item;
65 IteratorPointer Insert(IteratorPointer _prevItem, T item)
67 LT prevItem = (LT)_prevItem;
68 if(item && prevItem != item)
70 item.link.prev = prevItem ? prevItem : (circ ? last : null);
73 item.link.next = prevItem.link.next;
74 prevItem.link.next = item;
78 item.link.next = first;
83 item.link.prev.link.next = item;
85 item.link.next = item;
88 if(prevItem == last) last = item;
90 item.link.next.link.prev = item;
92 return (IteratorPointer)item;
97 void Remove(IteratorPointer _item)
103 item.link.prev.link.next = item.link.next;
105 item.link.next.link.prev = item.link.prev;
106 if(circ && last == first)
110 if(last == item) last = item.link.prev;
111 if(first == item) first = item.link.next;
113 item.link.prev = null;
114 item.link.next = null;
119 void Move(IteratorPointer _item, IteratorPointer _prevItem)
122 LT prevItem = (LT)_prevItem;
125 if(prevItem != item && (first != item || prevItem))
128 item.link.prev.link.next = item.link.next;
130 item.link.next.link.prev = item.link.prev;
131 if(item == first) first = item.link.next;
132 if(item == last) last = item.link.prev;
137 item.link.prev = prevItem ? prevItem : (circ ? last : null);
140 item.link.next = prevItem.link.next;
141 prevItem.link.next = item;
145 item.link.next = first;
150 item.link.prev.link.next = item;
152 item.link.next = item;
156 item.link.next.link.prev = item;
161 IteratorPointer Find(LT value)
163 return (IteratorPointer)value;
169 while((item = first))
176 // TOFIX: This compiles without error but produces bad code, since the virtual method prototype is an IteratorPointer which should be a pointer, not a uint64
177 //void Delete(LT item)
178 void Delete(void * item)