use std::marker::PhantomData;
use std::mem;
use std::vec::Vec;
pub trait HasBuffer {
type ABuffer;
fn new(size: usize) -> Self::ABuffer;
fn free(&mut Self::ABuffer);
fn write_whole<T>(buffer: &Self::ABuffer, values: &[T]) -> Result<(),BufferError>;
fn write<T>(buffer: &Self::ABuffer, offset: usize, x: T) -> Result<(), BufferError> where T: Copy;
fn read_whole<T>(buffer: &Self::ABuffer, nb: usize) -> Vec<T> where T: Copy;
fn read<T>(buffer: &Self::ABuffer, offset: usize) -> Option<T> where T: Copy;
}
#[derive(Debug)]
pub enum BufferError {
Overflow,
TooFewValues,
TooManyValues
}
#[derive(Debug)]
pub struct Buffer<C, T> where C: HasBuffer {
pub repr: C::ABuffer,
pub size: usize, _t: PhantomData<T>
}
impl<C, T> Buffer<C, T> where C: HasBuffer {
pub fn new(size: usize) -> Buffer<C, T> {
let buffer = C::new(size * mem::size_of::<T>());
Buffer {
repr: buffer,
size: size,
_t: PhantomData
}
}
pub fn get(&self, i: u32) -> Option<T> where T: Copy {
C::read(&self.repr, i as usize * mem::size_of::<T>())
}
pub fn whole(&self) -> Vec<T> where T: Copy {
C::read_whole(&self.repr, self.size)
}
pub fn set(&mut self, i: u32, x: T) -> Result<(), BufferError> where T: Copy {
C::write(&self.repr, i as usize * mem::size_of::<T>(), x)
}
pub fn clear(&self, x: T) where T: Copy {
let _ = C::write_whole(&self.repr, &vec![x; self.size]);
}
pub fn fill(&self, values: &[T]) {
let _ = C::write_whole(&self.repr, values);
}
}
impl<C, T> Drop for Buffer<C, T> where C: HasBuffer {
fn drop(&mut self) {
C::free(&mut self.repr)
}
}