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 }