1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
extern crate num;
use future::*;

pub trait Bitops: num::PrimInt + num::Unsigned + Future {
    fn bit_length() -> usize;
    fn bit_mask() -> Self;
}

impl Bitops for u8 {
    fn bit_length() -> usize { 8usize }
    fn bit_mask() -> u8 { 0xFFu8 }
}

impl Bitops for u16 {	
    fn bit_length() -> usize { 16usize }
    fn bit_mask() -> u16 { 0xFFFFu16 }
}

impl Bitops for u32 {
    fn bit_length() -> usize { 32usize }
    fn bit_mask() -> u32 { 0xFFFFFFFFu32 }
}

impl Bitops for u64 {
    fn bit_length() -> usize { 64usize }
    fn bit_mask() -> u64 { 0xFFFFFFFFFFFFFFFFu64 }
}

pub fn bit_length<T: Bitops>() -> usize {
    T::bit_length()
}

pub fn bit_mask<T: Bitops>() -> T {
    T::bit_mask()
}