summary refs log tree commit diff stats
path: root/rod/bitsets.nim
diff options
context:
space:
mode:
Diffstat (limited to 'rod/bitsets.nim')
-rwxr-xr-xrod/bitsets.nim71
1 files changed, 71 insertions, 0 deletions
diff --git a/rod/bitsets.nim b/rod/bitsets.nim
new file mode 100755
index 000000000..937e8237c
--- /dev/null
+++ b/rod/bitsets.nim
@@ -0,0 +1,71 @@
+#
+#
+#           The Nimrod Compiler
+#        (c) Copyright 2008 Andreas Rumpf
+#
+#    See the file "copying.txt", included in this
+#    distribution, for details about the copyright.
+#
+
+# this unit handles Nimrod sets; it implements bit sets
+# the code here should be reused in the Nimrod standard library
+
+type 
+  TBitSet* = seq[int8]        # we use byte here to avoid issues with
+                              # cross-compiling; uint would be more efficient
+                              # however
+
+const 
+  ElemSize* = sizeof(int8) * 8
+
+proc BitSetInit*(b: var TBitSet, length: int)
+proc BitSetUnion*(x: var TBitSet, y: TBitSet)
+proc BitSetDiff*(x: var TBitSet, y: TBitSet)
+proc BitSetSymDiff*(x: var TBitSet, y: TBitSet)
+proc BitSetIntersect*(x: var TBitSet, y: TBitSet)
+proc BitSetIncl*(x: var TBitSet, elem: BiggestInt)
+proc BitSetExcl*(x: var TBitSet, elem: BiggestInt)
+proc BitSetIn*(x: TBitSet, e: BiggestInt): bool
+proc BitSetEquals*(x, y: TBitSet): bool
+proc BitSetContains*(x, y: TBitSet): bool
+# implementation
+
+proc BitSetIn(x: TBitSet, e: BiggestInt): bool = 
+  result = (x[int(e div ElemSize)] and toU8(int(1 shl (e mod ElemSize)))) !=
+      toU8(0)
+
+proc BitSetIncl(x: var TBitSet, elem: BiggestInt) = 
+  assert(elem >= 0)
+  x[int(elem div ElemSize)] = x[int(elem div ElemSize)] or
+      toU8(int(1 shl (elem mod ElemSize)))
+
+proc BitSetExcl(x: var TBitSet, elem: BiggestInt) = 
+  x[int(elem div ElemSize)] = x[int(elem div ElemSize)] and
+      not toU8(int(1 shl (elem mod ElemSize)))
+
+proc BitSetInit(b: var TBitSet, length: int) = 
+  newSeq(b, length)
+
+proc BitSetUnion(x: var TBitSet, y: TBitSet) = 
+  for i in countup(0, high(x)): x[i] = x[i] or y[i]
+  
+proc BitSetDiff(x: var TBitSet, y: TBitSet) = 
+  for i in countup(0, high(x)): x[i] = x[i] and not y[i]
+  
+proc BitSetSymDiff(x: var TBitSet, y: TBitSet) = 
+  for i in countup(0, high(x)): x[i] = x[i] xor y[i]
+  
+proc BitSetIntersect(x: var TBitSet, y: TBitSet) = 
+  for i in countup(0, high(x)): x[i] = x[i] and y[i]
+  
+proc BitSetEquals(x, y: TBitSet): bool = 
+  for i in countup(0, high(x)): 
+    if x[i] != y[i]: 
+      return false
+  result = true
+
+proc BitSetContains(x, y: TBitSet): bool = 
+  for i in countup(0, high(x)): 
+    if (x[i] and not y[i]) != int8(0): 
+      return false
+  result = true