summary refs log tree commit diff stats
path: root/lib/pure/collections/chains.nim
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2016-03-31 16:49:46 +0200
committerAndreas Rumpf <rumpf_a@web.de>2016-03-31 16:49:56 +0200
commita61d5e466beb8dc5efeb4a96511c8162fe16f38c (patch)
tree1e2cd4df904d1e05343ab635e7ed244a1968373e /lib/pure/collections/chains.nim
parentf91caa7f2554f50f9a43559ec0e12c3b5d83108a (diff)
downloadNim-a61d5e466beb8dc5efeb4a96511c8162fe16f38c.tar.gz
added missing file for --gc:stack
Diffstat (limited to 'lib/pure/collections/chains.nim')
-rw-r--r--lib/pure/collections/chains.nim44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/pure/collections/chains.nim b/lib/pure/collections/chains.nim
new file mode 100644
index 000000000..6b2ecd272
--- /dev/null
+++ b/lib/pure/collections/chains.nim
@@ -0,0 +1,44 @@
+#
+#
+#            Nim's Runtime Library
+#        (c) Copyright 2016 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+## Template based implementation of singly and doubly linked lists.
+## The involved types should have 'prev' or 'next' fields and the
+## list header should have 'head' or 'tail' fields.
+
+template prepend*(header, node) =
+  when compiles(header.head):
+    when compiles(node.prev):
+      if header.head != nil:
+        header.head.prev = node
+    node.next = header.head
+    header.head = node
+  when compiles(header.tail):
+    if header.tail == nil:
+      header.tail = node
+
+template append*(header, node) =
+  when compiles(header.head):
+    if header.head == nil:
+      header.head = node
+  when compiles(header.tail):
+    when compiles(node.prev):
+      node.prev = header.tail
+    if header.tail != nil:
+      header.tail.next = node
+    header.tail = node
+
+template unlink*(header, node) =
+  if node.next != nil:
+    node.next.prev = node.prev
+  if node.prev != nil:
+    node.prev.next = node.next
+  if header.head == node:
+    header.head = node.prev
+  if header.tail == node:
+    header.tail = node.next