use rustc_serialize::{Encodable, Encoder};
-use std::cmp::{self, Ordering};
+use std::alloc::Layout;
+use std::cmp::Ordering;
use std::fmt;
use std::hash::{Hash, Hasher};
use std::iter;
assert!(mem::size_of::<T>() != 0);
assert!(!slice.is_empty());
- // Align up the size of the len (usize) field
- let align = mem::align_of::<T>();
- let align_mask = align - 1;
- let offset = mem::size_of::<usize>();
- let offset = (offset + align_mask) & !align_mask;
-
- let size = offset + slice.len() * mem::size_of::<T>();
-
- let mem = arena
- .dropless
- .alloc_raw(size, cmp::max(mem::align_of::<T>(), mem::align_of::<usize>()));
+ let (layout, _offset) =
+ Layout::new::<usize>().extend(Layout::for_value::<[T]>(slice)).unwrap();
+ let mem = arena.dropless.alloc_raw(layout);
unsafe {
let result = &mut *(mem as *mut List<T>);
// Write the length
}
}
-impl<T: Encodable> Encodable for List<T> {
+impl<S: Encoder, T: Encodable<S>> Encodable<S> for List<T> {
+ #[inline]
+ fn encode(&self, s: &mut S) -> Result<(), S::Error> {
+ (**self).encode(s)
+ }
+}
+
+impl<S: Encoder, T: Encodable<S>> Encodable<S> for &List<T> {
#[inline]
- fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
+ fn encode(&self, s: &mut S) -> Result<(), S::Error> {
(**self).encode(s)
}
}