I advise you to check the tests accompanying EnumSet (in the source code):
http://static.rust-lang.org/doc/master/src/collections/home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libcollections/enum_set.rs.html#144-158

They show a simple implementation:

    impl CLike for Foo {
        fn to_uint(&self) -> uint {
            *self as uint
        }

        fn from_uint(v: uint) -> Foo {
            unsafe { mem::transmute(v) }
        }
    }

which uses transmute to avoid that manual maintenance.

Note though that in general if you wanted to add new enum values while
maintaining it sorted alphabetically and still be backward-compatible you
would need to handle the values manually.


On Fri, May 30, 2014 at 8:41 PM, Igor Bukanov <i...@mir2.org> wrote:

> Is it possible to somehow automatically derive
> collections::enum_set::CLike for a enum? The idea of writing
>
> impl CLike for MyEnum {
>     fn to_uint(&self) -> uint {
>         return *self as uint;
>     }
>
>     fn from_uint(n: uint) -> Flag {
>         match n {
>             0 => EnumConst1,
>             ...
>             _ => fail!("{} does not match any enum case, n)
>         }
>     }
> }
>
> just to get a type safe bit set EnumSet<MyEnum> is rather discouraging.
>
> On a related note I see that EnumSet never checks that CLike::to_int
> result stays below the word size. Is it a bug?
> _______________________________________________
> Rust-dev mailing list
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev
>
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to