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