-impl_writeable_primitive!(u64, write_u64, read_u64);
-impl_writeable_primitive!(u32, write_u32, read_u32);
-impl_writeable_primitive!(u16, write_u16, read_u16);
-impl_writeable_primitive!(u8, write_u8, read_u8);
-impl_writeable_primitive!(bool, write_bool, read_bool);
+impl_writeable_primitive!(u64, be64_to_array, 8, slice_to_be64);
+impl_writeable_primitive!(u32, be32_to_array, 4, slice_to_be32);
+impl_writeable_primitive!(u16, be16_to_array, 2, slice_to_be16);
+
+impl Writeable for u8 {
+ #[inline]
+ fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
+ writer.write_all(&[*self])
+ }
+}
+impl<R: Read> Readable<R> for u8 {
+ #[inline]
+ fn read(reader: &mut R) -> Result<u8, DecodeError> {
+ let mut buf = [0; 1];
+ reader.read_exact(&mut buf)?;
+ Ok(buf[0])
+ }
+}
+
+impl Writeable for bool {
+ #[inline]
+ fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
+ writer.write_all(&[if *self {1} else {0}])
+ }
+}
+impl<R: Read> Readable<R> for bool {
+ #[inline]
+ fn read(reader: &mut R) -> Result<bool, DecodeError> {
+ let mut buf = [0; 1];
+ reader.read_exact(&mut buf)?;
+ if buf[0] != 0 && buf[0] != 1 {
+ return Err(DecodeError::InvalidValue);
+ }
+ Ok(buf[0] == 1)
+ }
+}