1 module epsilon.soag.alists;
2 
3 import runtime;
4 
5 const firstIndex = 0;
6 
7 struct AList
8 {
9     int Last;
10     int[] Elem;
11 }
12 
13 void Expand(ref AList List) nothrow pure @safe
14 {
15     assert(List.Elem.length < DIV(int.max, 2));
16 
17     auto List1 = new int[2 * List.Elem.length + 1];
18 
19     for (int i = firstIndex; i <= List.Last; ++i)
20         List1[i] = List.Elem[i];
21     List.Elem = List1;
22 }
23 
24 /**
25  * IN:  Referenzvariabel der Liste, anfängliche Länge der Liste
26  * OUT: Referenzvariabel der Liste
27  * SEM: Anlegen einer neune Liste (Speicherplatzreservierung)
28  * SEF: -
29  */
30 void New(ref AList List, int Len) nothrow pure @safe
31 {
32     List = AList();
33     List.Last = -1;
34     List.Elem = new int[Len];
35 }
36 
37 /**
38  * IN:  Referenzvariabel der Liste
39  * OUT: Referenzvariabel der Liste
40  * SEM: Löschen des Listeninhalts
41  * SEF: -
42  */
43 void Reset(ref AList List) @nogc nothrow pure @safe
44 {
45     List.Last = -1;
46 }
47 
48 /**
49  * IN:  Referenzvariabel der Liste, Index des zu löschenden Elements
50  * OUT: Referenzvariabel der Liste
51  * SEM: Löschen eines Elements
52  * SEF: Auf die Reihenfolge innerhalb der Liste
53  */
54 void Delete(ref AList List, int Index) @nogc nothrow pure @safe
55 {
56     if (Index >= firstIndex)
57     {
58         List.Elem[Index] = List.Elem[List.Last];
59         --List.Last;
60     }
61 }
62 
63 /**
64  * IN:  Referenzvariabel der Liste, Wert des Elements
65  * OUT: Referenzvariabel der Liste
66  * SEM: Anhängen des Elements am Ende der Liste
67  * SEF: -
68  */
69 void Append(ref AList List, int Value) nothrow pure @safe
70 {
71     if (List.Last + 1 >= List.Elem.length)
72         Expand(List);
73     ++List.Last;
74     List.Elem[List.Last] = Value;
75 }
76 
77 /**
78  * IN:  Referenzvariabel der Liste, gesuchter Wert
79  * OUT: Referenzvariabel der Liste, Index des ges. Wertes
80  * SEM: Liefert den Index des gesuchten Wertes;
81  *      Nach einer Delete-Aktion ist dieser Wert inkonsistent!
82  * SEF: -
83 */
84 int IndexOf(ref AList List, int Value) @nogc nothrow pure @safe
85 {
86     int i = firstIndex;
87 
88     while (List.Elem[i] != Value && i <= List.Last)
89         ++i;
90     return (i <= List.Last) ? i : -1;
91 }