diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2015-02-18 15:52:01 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2015-02-18 15:52:01 -0800 |
| commit | 1506b34e0c52b098158541d2ba9e334df1ce4812 (patch) | |
| tree | a9ead87eacaf0acafdb0c4f72c334c2d5601b0ca /src/libcollections/enum_set.rs | |
| parent | 3e7a04cb3cac2b803dc8188d9a55ba1836404ea3 (diff) | |
| parent | 9f8b9d6847ab02f7f1c28c84988ceae4c0a10f26 (diff) | |
| download | rust-1506b34e0c52b098158541d2ba9e334df1ce4812.tar.gz rust-1506b34e0c52b098158541d2ba9e334df1ce4812.zip | |
rollup merge of #22286: nikomatsakis/variance-4b
Conflicts: src/librustc/middle/infer/combine.rs src/librustc_typeck/check/wf.rs
Diffstat (limited to 'src/libcollections/enum_set.rs')
| -rw-r--r-- | src/libcollections/enum_set.rs | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/libcollections/enum_set.rs b/src/libcollections/enum_set.rs index 140c9edb5a3..0c957426060 100644 --- a/src/libcollections/enum_set.rs +++ b/src/libcollections/enum_set.rs @@ -14,6 +14,7 @@ //! representation to hold C-like enum variants. use core::prelude::*; +use core::marker; use core::fmt; use core::num::Int; use core::iter::{FromIterator, IntoIterator}; @@ -26,7 +27,8 @@ use core::ops::{Sub, BitOr, BitAnd, BitXor}; pub struct EnumSet<E> { // We must maintain the invariant that no bits are set // for which no variant exists - bits: usize + bits: usize, + marker: marker::PhantomData<E>, } impl<E> Copy for EnumSet<E> {} @@ -86,7 +88,7 @@ impl<E:CLike> EnumSet<E> { #[unstable(feature = "collections", reason = "matches collection reform specification, waiting for dust to settle")] pub fn new() -> EnumSet<E> { - EnumSet {bits: 0} + EnumSet {bits: 0, marker: marker::PhantomData} } /// Returns the number of elements in the given `EnumSet`. @@ -130,12 +132,14 @@ impl<E:CLike> EnumSet<E> { /// Returns the union of both `EnumSets`. pub fn union(&self, e: EnumSet<E>) -> EnumSet<E> { - EnumSet {bits: self.bits | e.bits} + EnumSet {bits: self.bits | e.bits, + marker: marker::PhantomData} } /// Returns the intersection of both `EnumSets`. pub fn intersection(&self, e: EnumSet<E>) -> EnumSet<E> { - EnumSet {bits: self.bits & e.bits} + EnumSet {bits: self.bits & e.bits, + marker: marker::PhantomData} } /// Adds an enum to the `EnumSet`, and returns `true` if it wasn't there before @@ -175,7 +179,7 @@ impl<E:CLike> Sub for EnumSet<E> { type Output = EnumSet<E>; fn sub(self, e: EnumSet<E>) -> EnumSet<E> { - EnumSet {bits: self.bits & !e.bits} + EnumSet {bits: self.bits & !e.bits, marker: marker::PhantomData} } } @@ -183,7 +187,7 @@ impl<E:CLike> BitOr for EnumSet<E> { type Output = EnumSet<E>; fn bitor(self, e: EnumSet<E>) -> EnumSet<E> { - EnumSet {bits: self.bits | e.bits} + EnumSet {bits: self.bits | e.bits, marker: marker::PhantomData} } } @@ -191,7 +195,7 @@ impl<E:CLike> BitAnd for EnumSet<E> { type Output = EnumSet<E>; fn bitand(self, e: EnumSet<E>) -> EnumSet<E> { - EnumSet {bits: self.bits & e.bits} + EnumSet {bits: self.bits & e.bits, marker: marker::PhantomData} } } @@ -199,7 +203,7 @@ impl<E:CLike> BitXor for EnumSet<E> { type Output = EnumSet<E>; fn bitxor(self, e: EnumSet<E>) -> EnumSet<E> { - EnumSet {bits: self.bits ^ e.bits} + EnumSet {bits: self.bits ^ e.bits, marker: marker::PhantomData} } } @@ -207,6 +211,7 @@ impl<E:CLike> BitXor for EnumSet<E> { pub struct Iter<E> { index: usize, bits: usize, + marker: marker::PhantomData<E>, } // FIXME(#19839) Remove in favor of `#[derive(Clone)]` @@ -215,13 +220,14 @@ impl<E> Clone for Iter<E> { Iter { index: self.index, bits: self.bits, + marker: marker::PhantomData, } } } impl<E:CLike> Iter<E> { fn new(bits: usize) -> Iter<E> { - Iter { index: 0, bits: bits } + Iter { index: 0, bits: bits, marker: marker::PhantomData } } } |
