|
9 | 9 | // except according to those terms.
|
10 | 10 |
|
11 | 11 | // FIXME(conventions): implement bounded iterators
|
12 |
| -// FIXME(conventions): implement BitOr, BitAnd, BitXor, and Sub |
13 | 12 | // FIXME(conventions): replace each_reverse by making iter DoubleEnded
|
14 | 13 | // FIXME(conventions): implement iter_mut and into_iter
|
15 | 14 |
|
@@ -463,6 +462,90 @@ impl Extend<uint> for TrieSet {
|
463 | 462 | }
|
464 | 463 | }
|
465 | 464 |
|
| 465 | +#[unstable = "matches collection reform specification, waiting for dust to settle"] |
| 466 | +impl BitOr<TrieSet, TrieSet> for TrieSet { |
| 467 | + /// Returns the union of `self` and `rhs` as a new `TrieSet`. |
| 468 | + /// |
| 469 | + /// # Example |
| 470 | + /// |
| 471 | + /// ``` |
| 472 | + /// use std::collections::TrieSet; |
| 473 | + /// |
| 474 | + /// let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 475 | + /// let b: TrieSet = vec![3, 4, 5].into_iter().collect(); |
| 476 | + /// |
| 477 | + /// let set: TrieSet = a | b; |
| 478 | + /// let v: Vec<uint> = set.iter().collect(); |
| 479 | + /// assert_eq!(v, vec![1u, 2, 3, 4, 5]); |
| 480 | + /// ``` |
| 481 | + fn bitor(&self, rhs: &TrieSet) -> TrieSet { |
| 482 | + self.union(rhs).collect() |
| 483 | + } |
| 484 | +} |
| 485 | + |
| 486 | +#[unstable = "matches collection reform specification, waiting for dust to settle"] |
| 487 | +impl BitAnd<TrieSet, TrieSet> for TrieSet { |
| 488 | + /// Returns the intersection of `self` and `rhs` as a new `TrieSet`. |
| 489 | + /// |
| 490 | + /// # Example |
| 491 | + /// |
| 492 | + /// ``` |
| 493 | + /// use std::collections::TrieSet; |
| 494 | + /// |
| 495 | + /// let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 496 | + /// let b: TrieSet = vec![2, 3, 4].into_iter().collect(); |
| 497 | + /// |
| 498 | + /// let set: TrieSet = a & b; |
| 499 | + /// let v: Vec<uint> = set.iter().collect(); |
| 500 | + /// assert_eq!(v, vec![2u, 3]); |
| 501 | + /// ``` |
| 502 | + fn bitand(&self, rhs: &TrieSet) -> TrieSet { |
| 503 | + self.intersection(rhs).collect() |
| 504 | + } |
| 505 | +} |
| 506 | + |
| 507 | +#[unstable = "matches collection reform specification, waiting for dust to settle"] |
| 508 | +impl BitXor<TrieSet, TrieSet> for TrieSet { |
| 509 | + /// Returns the symmetric difference of `self` and `rhs` as a new `TrieSet`. |
| 510 | + /// |
| 511 | + /// # Example |
| 512 | + /// |
| 513 | + /// ``` |
| 514 | + /// use std::collections::TrieSet; |
| 515 | + /// |
| 516 | + /// let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 517 | + /// let b: TrieSet = vec![3, 4, 5].into_iter().collect(); |
| 518 | + /// |
| 519 | + /// let set: TrieSet = a ^ b; |
| 520 | + /// let v: Vec<uint> = set.iter().collect(); |
| 521 | + /// assert_eq!(v, vec![1u, 2, 4, 5]); |
| 522 | + /// ``` |
| 523 | + fn bitxor(&self, rhs: &TrieSet) -> TrieSet { |
| 524 | + self.symmetric_difference(rhs).collect() |
| 525 | + } |
| 526 | +} |
| 527 | + |
| 528 | +#[unstable = "matches collection reform specification, waiting for dust to settle"] |
| 529 | +impl Sub<TrieSet, TrieSet> for TrieSet { |
| 530 | + /// Returns the difference of `self` and `rhs` as a new `TrieSet`. |
| 531 | + /// |
| 532 | + /// # Example |
| 533 | + /// |
| 534 | + /// ``` |
| 535 | + /// use std::collections::TrieSet; |
| 536 | + /// |
| 537 | + /// let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 538 | + /// let b: TrieSet = vec![3, 4, 5].into_iter().collect(); |
| 539 | + /// |
| 540 | + /// let set: TrieSet = a - b; |
| 541 | + /// let v: Vec<uint> = set.iter().collect(); |
| 542 | + /// assert_eq!(v, vec![1u, 2]); |
| 543 | + /// ``` |
| 544 | + fn sub(&self, rhs: &TrieSet) -> TrieSet { |
| 545 | + self.difference(rhs).collect() |
| 546 | + } |
| 547 | +} |
| 548 | + |
466 | 549 | /// A forward iterator over a set.
|
467 | 550 | pub struct SetItems<'a> {
|
468 | 551 | iter: Entries<'a, ()>
|
@@ -569,6 +652,7 @@ impl<'a> Iterator<uint> for UnionItems<'a> {
|
569 | 652 | mod test {
|
570 | 653 | use std::prelude::*;
|
571 | 654 | use std::uint;
|
| 655 | + use vec::Vec; |
572 | 656 |
|
573 | 657 | use super::TrieSet;
|
574 | 658 |
|
@@ -738,4 +822,44 @@ mod test {
|
738 | 822 | &[1, 5, 9, 13, 19],
|
739 | 823 | &[1, 3, 5, 9, 11, 13, 16, 19, 24]);
|
740 | 824 | }
|
| 825 | + |
| 826 | + #[test] |
| 827 | + fn test_bit_or() { |
| 828 | + let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 829 | + let b: TrieSet = vec![3, 4, 5].into_iter().collect(); |
| 830 | + |
| 831 | + let set: TrieSet = a | b; |
| 832 | + let v: Vec<uint> = set.iter().collect(); |
| 833 | + assert_eq!(v, vec![1u, 2, 3, 4, 5]); |
| 834 | + } |
| 835 | + |
| 836 | + #[test] |
| 837 | + fn test_bit_and() { |
| 838 | + let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 839 | + let b: TrieSet = vec![2, 3, 4].into_iter().collect(); |
| 840 | + |
| 841 | + let set: TrieSet = a & b; |
| 842 | + let v: Vec<uint> = set.iter().collect(); |
| 843 | + assert_eq!(v, vec![2u, 3]); |
| 844 | + } |
| 845 | + |
| 846 | + #[test] |
| 847 | + fn test_bit_xor() { |
| 848 | + let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 849 | + let b: TrieSet = vec![3, 4, 5].into_iter().collect(); |
| 850 | + |
| 851 | + let set: TrieSet = a ^ b; |
| 852 | + let v: Vec<uint> = set.iter().collect(); |
| 853 | + assert_eq!(v, vec![1u, 2, 4, 5]); |
| 854 | + } |
| 855 | + |
| 856 | + #[test] |
| 857 | + fn test_sub() { |
| 858 | + let a: TrieSet = vec![1, 2, 3].into_iter().collect(); |
| 859 | + let b: TrieSet = vec![3, 4, 5].into_iter().collect(); |
| 860 | + |
| 861 | + let set: TrieSet = a - b; |
| 862 | + let v: Vec<uint> = set.iter().collect(); |
| 863 | + assert_eq!(v, vec![1u, 2]); |
| 864 | + } |
741 | 865 | }
|
0 commit comments