blob: 9660a9d970214c6a2f9ffd3f97464965078c3c91 [file] [log] [blame] [edit]
#![cfg(test)]
use super::{SliceWrapperMut, SliceWrapper};
use std::vec::Vec;
use core;
use super::super::Allocator;
#[derive(Debug)]
pub struct ItemVec<Item>(Vec<Item>);
define_index_ops_mut!(T, ItemVec<T>);
impl<Item> Default for ItemVec<Item> {
fn default() -> Self {
ItemVec(Vec::<Item>::new())
}
}
impl<Item> SliceWrapper<Item> for ItemVec<Item> {
fn slice(&self) -> &[Item] {
&self.0[..]
}
}
impl<Item> SliceWrapperMut<Item> for ItemVec<Item> {
fn slice_mut(&mut self) -> &mut [Item] {
&mut self.0[..]
}
}
/*
impl<Item> core::ops::Index<usize> for ItemVec<Item> {
type Output = Item;
fn index(&self, index:usize) -> &Item {
&self.0[index]
}
}
impl<Item> core::ops::IndexMut<usize> for ItemVec<Item> {
fn index_mut(&mut self, index:usize) -> &mut Item {
&mut self.0[index]
}
}
*/
#[derive(Default)]
struct ItemVecAllocator<Item> {
_item: core::marker::PhantomData<Item>,
}
impl<Item:Default+Clone> Allocator<Item> for ItemVecAllocator<Item> {
type AllocatedMemory = ItemVec<Item>;
fn alloc_cell(&mut self, size:usize) ->ItemVec<Item>{
//eprint!("A:{}\n", size);
ItemVec(vec![Item::default();size])
}
fn free_cell(&mut self, _bv:ItemVec<Item>) {
//eprint!("F:{}\n", _bv.slice().len());
}
}
#[derive(Copy,Clone)]
pub struct SliceReference<'a, T:'a> {
data: &'a[T],
start: usize,
len: usize,
}
impl<'a, T:'a> SliceReference<'a, T> {
pub fn new(input: &'a[T], start: usize, len: usize) -> SliceReference<'a, T> {
SliceReference::<T> {
data: input.split_at(start).1.split_at(len).0,
start: start,
len: len,
}
}
}
impl<'a, T:'a> SliceWrapper<T> for SliceReference<'a, T> {
fn slice(&self) -> &[T]{
self.data
}
}
impl<'a, T> Default for SliceReference<'a, T> {
fn default() ->SliceReference<'a, T> {
SliceReference::<T> {
data:&[],
start:0,
len:0,
}
}
}
define_index_ops!(a, T, SliceReference<'a, T>);
#[test]
fn test_index_ops() {
let array = [255u8, 0u8, 1u8,2u8,3u8,4u8,5u8, 6u8];
let sl = SliceReference::<u8>::new(&array[..], 1, 5);
let val = sl[0];
assert_eq!(val, 0);
assert_eq!(&sl[1..5], &[1u8,2u8,3u8,4u8]);
let mut al =ItemVecAllocator::<u64>::default();
let mut dat = al.alloc_cell(1024);
dat[0] = 0;
dat[1] = 1;
dat[2] = 2;
dat[3] = 3;
assert_eq!(dat[1], 1);
assert_eq!(&dat[1..5], &[1u64,2u64,3u64,0u64]);
assert_eq!(dat.len(), 1024);
al.free_cell(dat);
}