use rustc_serialize::{Decodable, Encodable, Decoder, Encoder};
use std::mem;
use std::ops::Deref;
use std::cmp::PartialEq;
#[derive(Clone, Debug)]
pub struct Fixed<T>(pub T);
impl<T> Deref for Fixed<T> {
type Target = T;
fn deref<'a>(&'a self) -> &'a T {
&self.0
}
}
impl<T: PartialEq> PartialEq for Fixed<T> {
fn eq(&self, other: &Fixed<T>) -> bool {
self.0.eq(&other.0)
}
}
macro_rules! def_fixed {
($( $n:expr )*) => {$(
impl<T : Decodable> Decodable for Fixed<[T; $n]> {
fn decode<D: Decoder>(d: &mut D) -> Result<Fixed<[T; $n]>, D::Error> {
let mut v : [T; $n] = unsafe { mem::uninitialized() };
for i in 0..$n {
v[i] = try!(Decodable::decode(d));
}
Ok(Fixed(v))
}
}
impl<T : Encodable> Encodable for Fixed<[T; $n]> {
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
for i in 0..$n {
try!(self.0[i].encode(s));
}
Ok(())
}
}
)*}
}
def_fixed! {0 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}