1 2 3 module llist.slist; 4 5 6 7 struct Node(T) { 8 // A node with the next pointer of `null` is a "Sentinel node". 9 Node!T* next; 10 11 T payload; 12 alias value = payload; 13 } 14 15 16 17 public { 18 @property bool empty(T)(Node!T* node) { 19 return (node is null); 20 } 21 } 22 public { 23 Node!T dup(T)(Node!T* node) { 24 return new Node!T(node.next, node.payload); 25 } 26 } 27 public { 28 void removeNext(T)(Node!T* node) { 29 assert(!node.empty); 30 node.next = node.next.next; 31 } 32 void insertAfter(T)(Node!T* node, Node!T* newNode) { 33 newNode.next = node.next; 34 node.next = newNode; 35 } 36 void insertAfter(T)(Node!T* node, T value) { 37 node.insertAfter(new Node!T(null, value)); 38 } 39 40 ////void append(T)(Node!T* node, T value) { 41 //// assert(node.empty, "Can only append to the last node. If you want to force this operation use `redirect`."); 42 //// node.payload = value; 43 //// node.next = new Node!T; 44 ////} 45 46 void redirect(bool checkAtEnd=true, T)(Node!T* node, Node!T* newNode) { 47 node.next = newNode; 48 } 49 } 50 51 public { 52 Iterator!T iterator(T)(Node!T* node) { 53 return Iterator!T(node); 54 } 55 private struct Iterator(T) { 56 private Node!T* node; 57 @disable this(); 58 this(Node!T* node) { 59 this.node = node; 60 } 61 @property bool empty() { 62 return node.empty; 63 } 64 @property Node!T* front() { 65 assert(!empty); 66 return node; 67 } 68 void popFront() { 69 assert(!empty); 70 node = node.next; 71 } 72 } 73 } 74 75 76 unittest { 77 import std.stdio; 78 import std.algorithm.iteration; 79 import std.algorithm.searching; 80 81 Node!int* s = new Node!int(); 82 s.append(4); 83 84 foreach(a;s.iterator){ 85 a.value.writeln; 86 } 87 //// 88 s.insertAfter(5); 89 ////s = s.next; 90 ////s = s.next; 91 writeln; 92 foreach(a;s.iterator){a.value.writeln;} 93 ////s.find!(a=>a.empty).append(6); 94 95 writeln; 96 foreach(a;s.iterator){a.value.writeln;} 97 writeln; 98 foreach(a;s.iterator){a.value.writeln;} 99 100 s.iterator.each!(a=>a.value.writeln); 101 102 103 int[][] a = [[4,6,2],[1,2,3]]; 104 a.each!writeln; 105 } 106 107 108 109 110 111 112 113 114 115