1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
13 use collections::enum_set::{CLike, EnumSet};
17 #[derive(Copy, Clone, PartialEq, Debug)]
24 fn to_usize(&self) -> usize {
28 fn from_usize(v: usize) -> Foo {
29 unsafe { mem::transmute(v) }
35 let e: EnumSet<Foo> = EnumSet::new();
36 assert!(e.is_empty());
41 let mut e = EnumSet::new();
42 assert!(format!("{:?}", e) == "{}");
44 assert!(format!("{:?}", e) == "{A}");
46 assert!(format!("{:?}", e) == "{A, C}");
51 let mut e = EnumSet::new();
52 assert_eq!(e.len(), 0);
56 assert_eq!(e.len(), 3);
58 assert_eq!(e.len(), 2);
60 assert_eq!(e.len(), 0);
63 ///////////////////////////////////////////////////////////////////////////
67 fn test_two_empties_do_not_intersect() {
68 let e1: EnumSet<Foo> = EnumSet::new();
69 let e2: EnumSet<Foo> = EnumSet::new();
70 assert!(e1.is_disjoint(&e2));
74 fn test_empty_does_not_intersect_with_full() {
75 let e1: EnumSet<Foo> = EnumSet::new();
77 let mut e2: EnumSet<Foo> = EnumSet::new();
82 assert!(e1.is_disjoint(&e2));
86 fn test_disjoint_intersects() {
87 let mut e1: EnumSet<Foo> = EnumSet::new();
90 let mut e2: EnumSet<Foo> = EnumSet::new();
93 assert!(e1.is_disjoint(&e2));
97 fn test_overlapping_intersects() {
98 let mut e1: EnumSet<Foo> = EnumSet::new();
101 let mut e2: EnumSet<Foo> = EnumSet::new();
105 assert!(!e1.is_disjoint(&e2));
108 ///////////////////////////////////////////////////////////////////////////
109 // contains and contains_elem
113 let mut e1: EnumSet<Foo> = EnumSet::new();
116 let mut e2: EnumSet<Foo> = EnumSet::new();
120 let mut e3: EnumSet<Foo> = EnumSet::new();
123 assert!(e1.is_subset(&e2));
124 assert!(e2.is_superset(&e1));
125 assert!(!e3.is_superset(&e2));
126 assert!(!e2.is_superset(&e3))
131 let mut e1: EnumSet<Foo> = EnumSet::new();
133 assert!(e1.contains(&A));
134 assert!(!e1.contains(&B));
135 assert!(!e1.contains(&C));
139 assert!(e1.contains(&A));
140 assert!(e1.contains(&B));
141 assert!(!e1.contains(&C));
144 ///////////////////////////////////////////////////////////////////////////
149 let mut e1: EnumSet<Foo> = EnumSet::new();
151 let elems: Vec<Foo> = e1.iter().collect();
152 assert!(elems.is_empty());
155 let elems: Vec<_> = e1.iter().collect();
156 assert_eq!(elems, [A]);
159 let elems: Vec<_> = e1.iter().collect();
160 assert_eq!(elems, [A,C]);
163 let elems: Vec<_> = e1.iter().collect();
164 assert_eq!(elems, [A,C]);
167 let elems: Vec<_> = e1.iter().collect();
168 assert_eq!(elems, [A,B,C]);
171 ///////////////////////////////////////////////////////////////////////////
175 fn test_operators() {
176 let mut e1: EnumSet<Foo> = EnumSet::new();
180 let mut e2: EnumSet<Foo> = EnumSet::new();
184 let e_union = e1 | e2;
185 let elems: Vec<_> = e_union.iter().collect();
186 assert_eq!(elems, [A,B,C]);
188 let e_intersection = e1 & e2;
189 let elems: Vec<_> = e_intersection.iter().collect();
190 assert_eq!(elems, [C]);
192 // Another way to express intersection
193 let e_intersection = e1 - (e1 - e2);
194 let elems: Vec<_> = e_intersection.iter().collect();
195 assert_eq!(elems, [C]);
197 let e_subtract = e1 - e2;
198 let elems: Vec<_> = e_subtract.iter().collect();
199 assert_eq!(elems, [A]);
201 // Bitwise XOR of two sets, aka symmetric difference
202 let e_symmetric_diff = e1 ^ e2;
203 let elems: Vec<_> = e_symmetric_diff.iter().collect();
204 assert_eq!(elems, [A,B]);
206 // Another way to express symmetric difference
207 let e_symmetric_diff = (e1 - e2) | (e2 - e1);
208 let elems: Vec<_> = e_symmetric_diff.iter().collect();
209 assert_eq!(elems, [A,B]);
211 // Yet another way to express symmetric difference
212 let e_symmetric_diff = (e1 | e2) - (e1 & e2);
213 let elems: Vec<_> = e_symmetric_diff.iter().collect();
214 assert_eq!(elems, [A,B]);
221 #[derive(Copy, Clone)]
224 V00, V01, V02, V03, V04, V05, V06, V07, V08, V09,
225 V10, V11, V12, V13, V14, V15, V16, V17, V18, V19,
226 V20, V21, V22, V23, V24, V25, V26, V27, V28, V29,
227 V30, V31, V32, V33, V34, V35, V36, V37, V38, V39,
228 V40, V41, V42, V43, V44, V45, V46, V47, V48, V49,
229 V50, V51, V52, V53, V54, V55, V56, V57, V58, V59,
230 V60, V61, V62, V63, V64, V65, V66, V67, V68, V69,
234 fn to_usize(&self) -> usize {
238 fn from_usize(v: usize) -> Bar {
239 unsafe { mem::transmute(v) }
242 let mut set = EnumSet::new();
243 set.insert(Bar::V64);
247 fn test_extend_ref() {
248 let mut a = EnumSet::new();
253 assert_eq!(a.len(), 2);
254 assert!(a.contains(&A));
255 assert!(a.contains(&C));
257 let mut b = EnumSet::new();
262 assert_eq!(a.len(), 3);
263 assert!(a.contains(&A));
264 assert!(a.contains(&B));
265 assert!(a.contains(&C));