summary refs log tree commit diff stats
path: root/lib/system/cellsets.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/system/cellsets.nim')
-rw-r--r--lib/system/cellsets.nim35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/system/cellsets.nim b/lib/system/cellsets.nim
index bb5de6f42..776a2b7ec 100644
--- a/lib/system/cellsets.nim
+++ b/lib/system/cellsets.nim
@@ -201,6 +201,41 @@ iterator elements(t: CellSet): PCell {.inline.} =
       inc(i)
     r = r.next
 
+when false:
+  type
+    CellSetIter = object
+      p: PPageDesc
+      i, w, j: int
+
+  proc next(it: var CellSetIter): PCell =
+    while true:
+      while it.w != 0:         # test all remaining bits for zero
+        if (it.w and 1) != 0:  # the bit is set!
+          result = cast[PCell]((it.p.key shl PageShift) or
+                               (it.i shl IntShift +% it.j) *% MemAlign)
+
+          inc(it.j)
+          it.w = it.w shr 1
+          return
+        else:
+          inc(it.j)
+          it.w = it.w shr 1
+      # load next w:
+      if it.i >= high(it.p.bits):
+        it.i = 0
+        it.j = 0
+        it.p = it.p.next
+        if it.p == nil: return nil
+      else:
+        inc it.i
+      it.w = it.p.bits[i]
+
+  proc init(it: var CellSetIter; t: CellSet): PCell =
+    it.p = t.head
+    it.i = -1
+    it.w = 0
+    result = it.next
+
 iterator elementsExcept(t, s: CellSet): PCell {.inline.} =
   var r = t.head
   while r != nil: