use std::mem;
use std::ptr;
#[derive(Debug)]
pub struct Buffer<T> {
data: *mut T,
size: usize,
}
impl<T> Buffer<T> {
pub fn new(size: usize) -> Self {
assert!(size.is_power_of_two());
let mut vec = Vec::with_capacity(size);
let data = vec.as_mut_ptr();
mem::forget(vec);
Buffer { data: data, size: size }
}
pub fn size(&self) -> usize {
self.size
}
pub unsafe fn get(&self, index: usize) -> T {
let mut item = mem::uninitialized();
ptr::swap(self.data.offset(index as isize), &mut item);
item
}
pub unsafe fn wrapping_get(&self, index: usize) -> T {
self.get(index & (self.size - 1))
}
pub unsafe fn get_ref(&self, index: usize) -> &T {
&*self.data.offset(index as isize)
}
pub unsafe fn wrapping_get_ref(&self, index: usize) -> &T {
self.get_ref(index & (self.size - 1))
}
pub unsafe fn set(&self, index: usize, item: T) {
ptr::write(self.data.offset(index as isize), item);
}
pub unsafe fn wrapping_set(&self, index: usize, item: T) {
self.set(index & (self.size - 1), item);
}
}
impl<T> Drop for Buffer<T> {
fn drop(&mut self) {
unsafe { Vec::from_raw_parts(self.data, 0, self.size); }
}
}