diff options
Diffstat (limited to 'lib/system/sets.nim')
-rw-r--r-- | lib/system/sets.nim | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/lib/system/sets.nim b/lib/system/sets.nim index 66877de30..97431c296 100644 --- a/lib/system/sets.nim +++ b/lib/system/sets.nim @@ -9,21 +9,20 @@ # set handling -type - NimSet = array [0..4*2048-1, uint8] -{.deprecated: [TNimSet: NimSet].} -proc countBits32(n: int32): int {.compilerproc.} = - var v = n - v = v -% ((v shr 1'i32) and 0x55555555'i32) - v = (v and 0x33333333'i32) +% ((v shr 2'i32) and 0x33333333'i32) - result = ((v +% (v shr 4'i32) and 0xF0F0F0F'i32) *% 0x1010101'i32) shr 24'i32 +proc cardSetImpl(s: ptr UncheckedArray[uint8], len: int): int {.inline.} = + var i = 0 + result = 0 + var num = 0'u64 + when defined(x86) or defined(amd64): + while i < len - 8: + copyMem(addr num, addr s[i], 8) + inc(result, countBits64(num)) + inc(i, 8) -proc countBits64(n: int64): int {.compilerproc.} = - result = countBits32(toU32(n and 0xffffffff'i64)) + - countBits32(toU32(n shr 32'i64)) + while i < len: + inc(result, countBits32(uint32(s[i]))) + inc(i, 1) -proc cardSet(s: NimSet, len: int): int {.compilerproc.} = - result = 0 - for i in countup(0, len-1): - inc(result, countBits32(int32(s[i]))) +proc cardSet(s: ptr UncheckedArray[uint8], len: int): int {.compilerproc, inline.} = + result = cardSetImpl(s, len) |