e8822d1cf3effb75cf541730881af08a9c56d092
[sdk] / ecere / src / com / containers / List.ec
1 namespace com;
2
3 import "instance" // TOFIX: This is required to build Debug on Ubuntu 10.04, GCC 4.4.3
4 import "LinkList"
5
6 public class Link : ListItem
7 {
8    class_fixed
9 public:
10    uint64 data;
11 }
12
13 public class List<class LLT> : LinkList<Link, T = LLT, D = LLT>
14 {
15    class_fixed
16    // Generic iterator support
17    LLT GetData(Link link)
18    {
19       return link ? ((class(LLT) && class(LLT).type == structClass) ? (LLT)&link.data : (LLT)link.data) : (LLT)0;
20    }
21
22    bool SetData(Link link, LLT value)
23    {
24       if(class(LLT).type == structClass)
25          memcpy((void *)&link.data, (void *)(uintptr)value, class(LLT).structSize);
26       else
27          link.data = (uint64)value;
28       return true;
29    }
30
31    Link Insert(Link after, LLT value)
32    {
33       Link link;
34       if(class(LLT) && class(LLT).type == structClass)
35       {
36          link = (Link)new0 byte[sizeof(class ListItem) + class(LLT).structSize];
37          memcpy((void *)&link.data, (void *)value, class(LLT).structSize);
38       }
39       else
40          link = Link { data = (uint64)value };
41       LinkList::Insert(after, (LT)link);
42       return link;
43    }
44
45    Link Add(LLT value)
46    {
47       return (Link)Insert(last, value);
48    }
49
50    void Remove(Link link)
51    {
52       LinkList::Remove(link);
53       delete link;
54    }
55
56    void Delete(Link link)
57    {
58       D data = GetData(link);
59       delete data;
60       Remove(link);
61    }
62
63    void Free()
64    {
65       LT item;
66       while((item = first))
67       {
68          D data = GetData(item);
69          delete data;
70          Remove(item);
71       }
72    }
73
74    Link Find(const LLT value)
75    {
76       return (Link)Container::Find(value);
77    }
78 }