31 #ifdef AGENTPP_NAMESPACE
35 template <
class T>
class List;
64 prev(p), next(n), item(i) { }
67 template <
class T>
class List {
80 if (head->next) head->next->prev = head;
113 T*
add(T* t) {
return addLast(t); }
126 if ((!head) || (head->item == elem)) {
127 return addFirst(item);
133 while ((tmp->next) && (elem != tmp->next->item))
144 return tmp->next->item;
159 if ((!tail) || (tail->item == elem)) {
160 return addLast(item);
166 while ((tmp->prev) && (elem != tmp->prev->item))
177 return tmp->prev->item;
189 T* retval = head->item;
210 T* retval = tail->item;
272 if (tmp->item == i) {
276 while ((tmp = tmp->next) != 0);
291 if ((victim->prev) && (victim->next)) {
292 victim->prev->next = victim->next;
293 victim->next->prev = victim->prev;
297 victim->next->prev = 0;
302 victim->prev->next = 0;
328 while ((n>0) && (p->next)) {
351 while ((p) && (p->item != t))
369 for (; (p) && (p->item != t); i++)
380 T*
first()
const {
return (head) ? head->item : 0; }
387 T*
last()
const {
return (tail) ? tail->item : 0; }
406 while ((n>0) && (p->next)) {
430 for (; (i<n) && ((t = removeLast()) != 0); i++) {
496 if ((cursor) && (cursor->next)) {
497 cursor = cursor->next;
506 if ((cursor) && (cursor->prev)) {
507 cursor = cursor->prev;
516 if ((cursor) && (cursor->next))
522 if ((cursor) && (cursor->prev))
551 if (!content.empty()) {
554 if (*item < *cur.
get())
555 return content.insertBefore(item, cur.
get());
557 return content.add(item);
559 else return content.add(item);
563 if (!content.empty()) {
566 if (*item > *cur.
get())
567 return content.insertAfter(item,
570 return content.addFirst(item);
572 else return content.addFirst(item);
578 if (!content.empty()) {
581 if (*item == *cur.
get()) {
585 if (*item < *cur.
get())
586 return content.insertBefore(item, cur.
get());
588 return content.add(item);
590 else return content.add(item);
593 T*
remove(T* item) {
return content.remove(item); }
597 return content.overwriteNth(n, t);
600 int size()
const {
return content.size(); }
603 T*
getNth(
int i)
const {
return content.getNth(i); }
606 int index(T* t)
const {
return content.index(t); }
608 int empty()
const {
return content.empty(); }
625 T*
get() {
return cursor.get(); }
626 int next() {
return cursor.next(); }
628 int prev() {
return cursor.prev(); }
634 cursor((const
List<T>*)l) { }
647 (*content)[item->key()] = (
void*)item;
652 content->del(item->key());
658 content->del(oidptr);
663 Pix i = content->seek(oidptr);
664 if (i)
return (T*)content->contents(i);
669 Pix i = content->seek_inexact(oidptr);
671 while ((i) && (i != content->last()) &&
672 (*content->key(i) < *oidptr))
674 while ((i) && (*content->key(i) > *oidptr))
677 if (i)
return (T*)content->contents(i);
682 Pix i = content->seek_inexact(oidptr);
684 while ((i) && (i != content->first()) &&
685 (*content->key(i) > *oidptr))
687 while ((i) && (*content->key(i) < *oidptr))
689 if (i)
return (T*)content->contents(i);
694 Pix i = content->seek(oidptr);
697 if (i)
return (T*)content->contents(i);
702 Pix i = content->seek(oidptr);
705 if (i)
return (T*)content->contents(i);
710 Pix i = content->seek_inexact(oidptr);
711 if (i)
return (T*)content->contents(i);
715 int size()
const {
return content->length(); }
718 Pix i = content->first();
719 if (i)
return (T*)content->contents(i);
724 Pix i = content->last();
725 if (i)
return (T*)content->contents(i);
730 Pix x = content->first();
731 for (
int n = 0; ((n<i) && (x)); n++) {
734 if (x)
return (T*)content->contents(x);
739 Pix i = content->seek(t->key());
748 bool empty()
const {
return content->empty(); }
754 Pix i = content->first();
756 T* t = (T*)content->contents(i);
758 content->del(t->key());
788 if ((list) && (cursor))
789 return (T*)list->content->contents(cursor);
795 if ((list) && (cursor)) {
797 list->content->next(x);
799 return (T*)list->content->contents(x);
805 if ((list) && (cursor)) {
807 list->content->prev(x);
809 return (T*)list->content->contents(x);
815 if ((list) && (cursor)) {
816 list->content->next(cursor);
825 if ((list) && (cursor)) {
826 list->content->prev(cursor);
836 Pix i = list->content->seek_inexact(oidptr);
837 if (!i)
return FALSE;
839 while ((i) && (t = (T*)list->content->contents(i)) &&
840 (*t->key() > *oidptr)) {
841 list->content->prev(i);
853 cursor(l->content->first()) { list = l; }
880 content =
new T*[sz+1];
881 memcpy(content+1, h, sz*
sizeof(T*));
900 content =
new T*[sz+1];
901 memcpy(content, h, sz*
sizeof(T*));
917 T*
add(T* t) {
return addLast(t); }
930 for (
unsigned int i=0; i<sz; i++) {
931 if (content[i] == elem) {
932 if (i == 0)
return addFirst(item);
934 content =
new T*[sz+1];
935 memcpy(content, h, i*
sizeof(T*));
936 memcpy(content+i+1, h+i,
946 return addLast(item);
960 for (
unsigned int i=0; i<sz; i++) {
961 if (content[i] == elem) {
962 if (i == sz-1)
return addLast(item);
964 content =
new T*[sz+1];
965 memcpy(content, h, (i+1)*
sizeof(T*));
967 memcpy(content+i+2, h+i+1,
968 (sz-i-1)*
sizeof(T*));
977 return addLast(item);
987 if (sz == 0)
return 0;
990 content =
new T*[--sz];
991 memcpy(content, h+1, sz*
sizeof(T*));
1006 return content[--sz];
1014 for (
unsigned int i=0; i<sz; i++) {
1052 T*
remove(T* item) {
1053 for (
unsigned int i=0; i<sz; i++) {
1054 if (item == content[i]) {
1070 T*
remove(
unsigned int i) {
1071 if (i >= sz)
return 0;
1074 content =
new T*[sz-1];
1076 memcpy(content, h, i*
sizeof(T*));
1078 memcpy(content+i, h+i+1,(sz-i-1)*
sizeof(T*));
1096 if ((n < 0) || (((
unsigned int)n) >= sz))
return 0;
1110 for (
unsigned int i=0; i<sz; i++) {
1111 if (t == content[i])
1123 T*
first()
const {
return (sz) ? content[0] : 0; }
1130 T*
last()
const {
return (sz) ? content[sz-1] : 0; }
1144 if ((n < 0) || ((
unsigned int)n >= sz))
return 0;
1145 if (content[n])
delete content[n];
1151 return *(content[n]);
1164 for (i=0; (i<n) && (sz > 0); i++) {
1165 T* t = removeLast();
1198 if (sz == 0)
return r;
1202 for (
unsigned int i=0; i<sz; i++) {
1203 r->
content[i] = (T*)content[i]->clone();
1209 if (
this == &o)
return *
this;
1212 content =
new T*[sz];
1213 for (
unsigned int i=0; i<sz; i++) {
1214 content[i] = (T*)o.
content[i]->clone();
1246 cursor = l->
size()-1;
1250 if ((cursor < 0) || !list || (cursor >= list->size()))
return 0;
1251 return list->getNth(cursor);
1255 if ((++cursor >= list->size()))
return 0;
1260 if (--cursor < 0)
return 0;
1265 if ((cursor+1 >= list->size()))
return 0;
1270 if (cursor-1 < 0)
return 0;
1299 if (!this->empty()) {
1300 for (
unsigned int i=0; i<this->sz; i++) {
1301 if (*item < *(this->content[i]))
1302 return this->insertBefore(item,
1311 return addEnd(item);
1315 if (!this->empty()) {
1316 for (
int i=this->sz-1; i>=0; i--) {
1317 if (*item > *(this->content[i]))
1318 return this->insertAfter(item,
1329 if (!this->empty()) {
1330 for (
unsigned int i=0; i<this->sz; i++) {
1331 if (*item == *(this->content[i])) {
1335 if (*item < *(this->content[i]))
1336 return this->insertBefore(item,
1346 #ifdef AGENTPP_NAMESPACE