• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2001, 2002 Dave Abrahams
2# Copyright 2003 Vladimir Prus
3# Distributed under the Boost Software License, Version 1.0.
4# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
5
6class set
7{
8    rule __init__ ( )
9    {
10    }
11
12    rule add ( elements * )
13    {
14        for local e in $(elements)
15        {
16            if ! $($(e))
17            {
18                $(e) = 1 ;
19                self.result += $(e) ;
20            }
21        }
22    }
23
24    rule contains ( element )
25    {
26        return $($(element)) ;
27    }
28
29    rule list ( )
30    {
31        return $(self.result) ;
32    }
33}
34
35
36
37# Returns the elements of set1 that are not in set2.
38#
39rule difference ( set1 * : set2 * )
40{
41    local result = ;
42    for local element in $(set1)
43    {
44        if ! ( $(element) in $(set2) )
45        {
46            result += $(element) ;
47        }
48    }
49    return $(result) ;
50}
51
52NATIVE_RULE set : difference ;
53
54
55# Removes all the items appearing in both set1 & set2.
56#
57rule intersection ( set1 * : set2 * )
58{
59    local result ;
60    for local v in $(set1)
61    {
62        if $(v) in $(set2)
63        {
64            result += $(v) ;
65        }
66    }
67    return $(result) ;
68}
69
70
71# Returns whether set1 & set2 contain the same elements. Note that this ignores
72# any element ordering differences as well as any element duplication.
73#
74rule equal ( set1 * : set2 * )
75{
76    if $(set1) in $(set2) && ( $(set2) in $(set1) )
77    {
78        return true ;
79    }
80}
81
82
83rule __test__ ( )
84{
85    import assert ;
86
87    assert.result 0 1 4 6 8 9 : difference   0 1 2 3 4 5 6 7 8 9 : 2 3 5 7 ;
88    assert.result 2 5 7       : intersection 0 1 2   4 5 6 7 8 9 : 2 3 5 7 ;
89
90    assert.true  equal         :         ;
91    assert.true  equal 1 1 2 3 : 3 2 2 1 ;
92    assert.false equal 2 3     : 3 2 2 1 ;
93}
94