diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2016-03-31 16:49:46 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2016-03-31 16:49:56 +0200 |
commit | a61d5e466beb8dc5efeb4a96511c8162fe16f38c (patch) | |
tree | 1e2cd4df904d1e05343ab635e7ed244a1968373e /lib/pure/collections/chains.nim | |
parent | f91caa7f2554f50f9a43559ec0e12c3b5d83108a (diff) | |
download | Nim-a61d5e466beb8dc5efeb4a96511c8162fe16f38c.tar.gz |
added missing file for --gc:stack
Diffstat (limited to 'lib/pure/collections/chains.nim')
-rw-r--r-- | lib/pure/collections/chains.nim | 44 |
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 |