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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
macro_rules! deref { (@itemize $($one:item)*) => ($($one)*); ($name:ident::$field:tt => $target:ty) => (deref! { @itemize impl ::std::ops::Deref for $name { type Target = $target; #[inline] fn deref(&self) -> &Self::Target { &self.$field } } impl ::std::ops::DerefMut for $name { #[inline] fn deref_mut(&mut self) -> &mut Self::Target { &mut self.$field } } }); ($name:ident<$life:tt>::$field:tt => $target:ty) => (deref! { @itemize impl<$life> ::std::ops::Deref for $name<$life> { type Target = $target; #[inline] fn deref(&self) -> &Self::Target { &self.$field } } impl<$life> ::std::ops::DerefMut for $name<$life> { #[inline] fn deref_mut(&mut self) -> &mut Self::Target { &mut self.$field } } }); } macro_rules! raise( ($message:expr) => (return Err(::Error::new(::std::io::ErrorKind::Other, $message))); ); macro_rules! table { ($(#[$attribute:meta])* pub $name:ident { $($field:ident ($kind:ty),)* }) => ( table! { @define $(#[$attribute])* pub $name { $($field ($kind),)* } } table! { @implement pub $name { $($field,)* } } ); (@define $(#[$attribute:meta])* pub $name:ident { $($field:ident ($kind:ty),)* }) => ( $(#[$attribute])* #[derive(Clone, Debug)] pub struct $name { $(pub $field: $kind,)* } ); (@implement pub $name:ident { $($field:ident,)* }) => ( impl ::Value for $name { fn read<T: ::Tape>(tape: &mut T) -> ::Result<Self> { let mut table: $name = unsafe { ::std::mem::zeroed() }; $(::std::mem::forget(::std::mem::replace(&mut table.$field, tape.take()?));)+ Ok(table) } } ); }