Merge pull request #1308 from flyx/tset_additions

Logical operations for TSet
This commit is contained in:
Andreas Rumpf 2014-06-26 21:02:10 +02:00
commit cb09723033
2 changed files with 18 additions and 18 deletions

View file

@ -157,37 +157,37 @@ proc `$`*[A](s: TSet[A]): string =
proc union*[A](s1, s2: TSet[A]): TSet[A] = proc union*[A](s1, s2: TSet[A]): TSet[A] =
## returns a new set of all items that are contained in at ## returns a new set of all items that are contained in at
## least one of `l` and `r` ## least one of `s1` and `s2`
result = s1 result = s1
incl(result, s2) incl(result, s2)
proc intersection*[A](s1, s2: TSet[A]): TSet[A] = proc intersection*[A](s1, s2: TSet[A]): TSet[A] =
## returns a new set of all items that are contained in both `l` and `r` ## returns a new set of all items that are contained in both `s1` and `s2`
result = initSet[A](min(s1.data.len, s2.data.len)) result = initSet[A](min(s1.data.len, s2.data.len))
for item in s1: for item in s1:
if item in s2: incl(result, item) if item in s2: incl(result, item)
proc symmetricDifference*[A](s1, s2: TSet[A]): TSet[A] = proc symmetricDifference*[A](s1, s2: TSet[A]): TSet[A] =
## returns a new set of all items that are contained in either ## returns a new set of all items that are contained in either
## `l` or `r`, but not both ## `s1` or `s2`, but not both
result = s1 result = s1
for item in s2: for item in s2:
if containsOrIncl(result, item): excl(result, item) if containsOrIncl(result, item): excl(result, item)
proc `or`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} = proc `+`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} =
## alias for `union` ## alias for `union`
result = union(s1, s2) result = union(s1, s2)
proc `and`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} = proc `*`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} =
## alias for `intersection` ## alias for `intersection`
result = intersection(s1, s2) result = intersection(s1, s2)
proc `xor`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} = proc `-+-`*[A](s1, s2: TSet[A]): TSet[A] {.inline.} =
## alias for `symmetricDifference` ## alias for `symmetricDifference`
result = symmetricDifference(s1, s2) result = symmetricDifference(s1, s2)
proc disjoint*[A](s1, s2: TSet[A]): bool = proc disjoint*[A](s1, s2: TSet[A]): bool =
## returns true iff `l` and `r` have no items in common ## returns true iff `s1` and `s2` have no items in common
for item in s1: for item in s1:
if item in s2: return false if item in s2: return false
return true return true

View file

@ -8,8 +8,8 @@ let
block union: block union:
let let
s1_s2 = union(s1, s2) s1_s2 = union(s1, s2)
s1_s3 = s1 or s3 s1_s3 = s1 + s3
s2_s3 = s2 or s3 s2_s3 = s2 + s3
assert s1_s2.len == 7 assert s1_s2.len == 7
assert s1_s3.len == 8 assert s1_s3.len == 8
@ -25,14 +25,14 @@ block union:
assert i in s1_s3 assert i in s1_s3
assert i in s2_s3 assert i in s2_s3
assert((s1 or s1) == s1) assert((s1 + s1) == s1)
assert((s2 or s1) == s1_s2) assert((s2 + s1) == s1_s2)
block intersection: block intersection:
let let
s1_s2 = intersection(s1, s2) s1_s2 = intersection(s1, s2)
s1_s3 = intersection(s1, s3) s1_s3 = intersection(s1, s3)
s2_s3 = s2 and s3 s2_s3 = s2 * s3
assert s1_s2.len == 3 assert s1_s2.len == 3
assert s1_s3.len == 0 assert s1_s3.len == 0
@ -48,14 +48,14 @@ block intersection:
assert i in s2 assert i in s2
assert i in s3 assert i in s3
assert((s2 and s2) == s2) assert((s2 * s2) == s2)
assert((s3 and s2) == s2_s3) assert((s3 * s2) == s2_s3)
block symmetricDifference: block symmetricDifference:
let let
s1_s2 = symmetricDifference(s1, s2) s1_s2 = symmetricDifference(s1, s2)
s1_s3 = s1 xor s3 s1_s3 = s1 -+- s3
s2_s3 = s2 xor s3 s2_s3 = s2 -+- s3
assert s1_s2.len == 4 assert s1_s2.len == 4
assert s1_s3.len == 8 assert s1_s3.len == 8
@ -71,8 +71,8 @@ block symmetricDifference:
assert i in s1_s3 xor i in s1 assert i in s1_s3 xor i in s1
assert i in s2_s3 xor i in s2 assert i in s2_s3 xor i in s2
assert((s3 xor s3) == initSet[int]()) assert((s3 -+- s3) == initSet[int]())
assert((s3 xor s1) == s1_s3) assert((s3 -+- s1) == s1_s3)
block disjoint: block disjoint:
assert(not disjoint(s1, s2)) assert(not disjoint(s1, s2))