# Copyright (c) 2019-2022 Status Research & Development GmbH # Licensed and distributed under either of # * MIT license: http://opensource.org/licenses/MIT # * Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 # at your option. This file may not be copied, modified, or distributed except according to those terms. {.used.} import unittest2, strformat, ../stew/[bitseqs] suite "Bit fields": test "roundtrips": var a = BitSeq.init(100) b = BitSeq.init(100) check: not a[0] a.setBit 1 check: not a[0] a[1] b.setBit 2 a.combine(b) check: not a[0] a[1] a[2] test "iterating words": for bitCount in [8, 3, 7, 8, 14, 15, 16, 19, 260]: checkpoint &"trying bit count {bitCount}" var a = BitSeq.init(bitCount) b = BitSeq.init(bitCount) bitsInWord = sizeof(uint) * 8 expectedWordCount = (bitCount div bitsInWord) + 1 for i in 0 ..< expectedWordCount: let every3rdBit = i * sizeof(uint) * 8 + 2 a[every3rdBit] = true b[every3rdBit] = true for word in words(a): check word == 4 word = 2 for wa, wb in words(a, b): check wa == 2 and wb == 4 wa = 1 wb = 2 for i in 0 ..< expectedWordCount: for j in 0 ..< bitsInWord: let bitPos = i * bitsInWord + j if bitPos < bitCount: check a[j] == (j == 0) check b[j] == (j == 1) test "overlaps": for bitCount in [1, 62, 63, 64, 91, 127, 128, 129]: checkpoint &"trying bit count {bitCount}" var a = BitSeq.init(bitCount) b = BitSeq.init(bitCount) for pos in [4, 8, 9, 12, 29, 32, 63, 64, 67]: if pos + 2 < bitCount: a.setBit(pos) b.setBit(pos + 2) check: not a.overlaps(b) not b.overlaps(a)