import sets, hashes, algorithm block setEquality: var a = initHashSet[int]() b = initHashSet[int]() c = initHashSet[string]() for i in 0..5: a.incl(i) for i in 1..6: b.incl(i) for i in 0..5: c.incl($i) doAssert map(a, proc(x: int): int = x + 1) == b doAssert map(a, proc(x: int): string = $x) == c block setsContainingTuples: var set = initHashSet[tuple[i: int, i64: int64, f: float]]() set.incl( (i: 123, i64: 123'i64, f: 3.14) ) doAssert set.contains( (i: 123, i64: 123'i64, f: 3.14) ) doAssert( not set.contains( (i: 456, i64: 789'i64, f: 2.78) ) ) block setWithTuplesWithSeqs: var s = initHashSet[tuple[s: seq[int]]]() s.incl( (s: @[1, 2, 3]) ) doAssert s.contains( (s: @[1, 2, 3]) ) doAssert( not s.contains((s: @[4, 5, 6])) ) block setWithSequences: var s = initHashSet[seq[int]]() s.incl( @[1, 2, 3] ) doAssert s.contains(@[1, 2, 3]) doAssert( not s.contains(@[4, 5, 6]) ) block setClearWorked: var s = initHashSet[char]() for c in "this is a test": s.incl(c) doAssert len(s) == 7 clear(s) doAssert len(s) == 0 s.incl('z') for c in "this is a test": s.incl(c) doAssert len(s) == 8 block orderedSetClearWorked: var s = initOrderedSet[char]() for c in "eat at joes": s.incl(c) var r = "" for c in items(s): add(r, c) doAssert r == "eat jos" clear(s) s.incl('z') for c in "eat at joes": s.incl(c) r = "" for c in items(s): add(r, c) doAssert r == "zeat jos" block hashForHashedSet: let seq1 = "This is the test." seq2 = "the test is This." s1 = seq1.toHashSet() s2 = seq2.toHashSet() doAssert s1 == s2 doAssert hash(s1) == hash(s2) block hashForOrderdSet: let str = "This is the test." rstr = str.reversed var s1 = initOrderedSet[char]() s2 = initOrderedSet[char]() r = initOrderedSet[char]() expected: Hash added: seq[char] = @[] reversed: Hash radded: seq[char] = @[] expected = 0 for c in str: if (not (c in added)): expected = expected !& hash(c) added.add(c) s1.incl(c) s2.incl(c) expected = !$expected doAssert hash(s1) == expected doAssert hash(s1) == hash(s2) doAssert hash(s1) != hash(r) reversed = 0 for c in rstr: if (not (c in radded)): reversed = reversed !& hash(c) radded.add(c) r.incl(c) reversed = !$reversed doAssert hash(r) == reversed doAssert hash(s1) != reversed proc testModule() = ## Internal micro test to validate docstrings and such. block lenTest: var values: HashSet[int] doAssert values.len == 0 doAssert values.card == 0 block setIterator: type pair = tuple[a, b: int] var a, b = initHashSet[pair]() a.incl((2, 3)) a.incl((3, 2)) a.incl((2, 3)) for x, y in a.items: b.incl((x - 2, y + 1)) doAssert a.len == b.card doAssert a.len == 2 #echo b block setContains: var values = initHashSet[int]() doAssert(not values.contains(2)) values.incl(2) doAssert values.contains(2) values.excl(2) doAssert(not values.contains(2)) values.incl(4) var others = toHashSet([6, 7]) values.incl(others) doAssert values.len == 3 values.init doAssert values.containsOrIncl(2) == false doAssert values.containsOrIncl(2) == true var a = toHashSet([1, 2]) b = toHashSet([1]) b.incl(2) doAssert a == b block exclusions: var s = toHashSet([2, 3, 6, 7]) s.excl(2) s.excl(2) doAssert s.len == 3 var numbers = toHashSet([1, 2, 3, 4, 5]) even = toHashSet([2, 4, 6, 8]) numbers.excl(even) #echo numbers # --> {1, 3, 5} block toSeqAndString: var a = toHashSet([2, 7, 5]) var b = initHashSet[int](a.len) for x in [2, 7, 5]: b.incl(x) doAssert($a == $b) #echo a #echo toHashSet(["no", "esc'aping", "is \" provided"]) #block orderedToSeqAndString: # echo toOrderedSet([2, 4, 5]) # echo toOrderedSet(["no", "esc'aping", "is \" provided"]) block setOperations: var a = toHashSet(["a", "b"]) b = toHashSet(["b", "c"]) c = union(a, b) doAssert c == toHashSet(["a", "b", "c"]) var d = intersection(a, b) doAssert d == toHashSet(["b"]) var e = difference(a, b) doAssert e == toHashSet(["a"]) var f = symmetricDifference(a, b) doAssert f == toHashSet(["a", "c"]) doAssert d < a and d < b doAssert((a < a) == false) doAssert d <= a and d <= b doAssert((a <= a)) # Alias test. doAssert a + b == toHashSet(["a", "b", "c"]) doAssert a * b == toHashSet(["b"]) doAssert a - b == toHashSet(["a"]) doAssert a -+- b == toHashSet(["a", "c"]) doAssert disjoint(a, b) == false doAssert disjoint(a, b - a) == true block mapSet: var a = toHashSet([1, 2, 3]) var b = a.map(proc (x: int): string = $x) doAssert b == toHashSet(["1", "2", "3"]) block lenTest: var values: OrderedSet[int] doAssert values.len == 0 doAssert values.card == 0 block setIterator: type pair = tuple[a, b: int] var a, b = initOrderedSet[pair]() a.incl((2, 3)) a.incl((3, 2)) a.incl((2, 3)) for x, y in a.items: b.incl((x - 2, y + 1)) doAssert a.len == b.card doAssert a.len == 2 block setPairsIterator: var s = toOrderedSet([1, 3, 5, 7]) var items = newSeq[tuple[a: int, b: int]]() for idx, item in s: items.add((idx, item)) doAssert items == @[(0, 1), (1, 3), (2, 5), (3, 7)] block exclusions: var s = toOrderedSet([1, 2, 3, 6, 7, 4]) s.excl(3) s.excl(3) s.excl(1) s.excl(4) var items = newSeq[int]() for item in s: items.add item doAssert items == @[2, 6, 7] block: #9005 var s = initOrderedSet[(int, int)]() for i in 0 .. 30: incl(s, (i, 0)) for i in 0 .. 30: excl(s, (i, 0)) doAssert s.len == 0 #block orderedSetIterator: # var a = initOrderedSet[int]() # for value in [9, 2, 1, 5, 1, 8, 4, 2]: # a.incl(value) # for value in a.items: # echo "Got ", value block setContains: var values = initOrderedSet[int]() doAssert(not values.contains(2)) values.incl(2) doAssert values.contains(2) block toSeqAndString: var a = toOrderedSet([2, 4, 5]) var b = initOrderedSet[int]() for x in [2, 4, 5]: b.incl(x) doAssert($a == $b) doAssert(a == b) # https://github.com/Araq/Nim/issues/1413 block initBlocks: var a: OrderedSet[int] a.init(4) a.incl(2) a.init doAssert a.len == 0 a = initOrderedSet[int](4) a.incl(2) doAssert a.len == 1 var b: HashSet[int] b.init(4) b.incl(2) b.init doAssert b.len == 0 b = initHashSet[int](4) b.incl(2) doAssert b.len == 1 block missingOrExcl: var s = toOrderedSet([2, 3, 6, 7]) doAssert s.missingOrExcl(4) == true doAssert s.missingOrExcl(6) == false block orderedSetEquality: type pair = tuple[a, b: int] var aa = initOrderedSet[pair]() var bb = initOrderedSet[pair]() var x = (a: 1, b: 2) var y = (a: 3, b: 4) aa.incl(x) aa.incl(y) bb.incl(x) bb.incl(y) doAssert aa == bb block setsWithoutInit: var a: HashSet[int] b: HashSet[int] c: HashSet[int] d: HashSet[int] e: HashSet[int] doAssert a.containsOrIncl(3) == false doAssert a.contains(3) doAssert a.len == 1 doAssert a.containsOrIncl(3) a.incl(3) doAssert a.len == 1 a.incl(6) doAssert a.len == 2 b.incl(5) doAssert b.len == 1 b.excl(5) b.excl(c) doAssert b.missingOrExcl(5) doAssert b.disjoint(c) d = b + c doAssert d.len == 0 d = b * c doAssert d.len == 0 d = b - c doAssert d.len == 0 d = b -+- c doAssert d.len == 0 doAssert (d < e) == false doAssert d <= e doAssert d == e block setsWithoutInit: var a: OrderedSet[int] b: OrderedSet[int] c: OrderedSet[int] d: HashSet[int] doAssert a.containsOrIncl(3) == false doAssert a.contains(3) doAssert a.len == 1 doAssert a.containsOrIncl(3) a.incl(3) doAssert a.len == 1 a.incl(6) doAssert a.len == 2 b.incl(5) doAssert b.len == 1 doAssert b.missingOrExcl(5) == false doAssert b.missingOrExcl(5) doAssert c.missingOrExcl(9) d.incl(c) doAssert d.len == 0 testModule()