cu 0.1.1

Low level bindings to cuda apis
use core::DevMem;
use std::ops::{DerefMut, Deref};
use num::Num;
use std::mem;

use std::marker::PhantomData;
use std::rc::Rc;
use std::slice;

use ::val::CudaVal;

#[derive(Debug, Clone)]
pub struct Buffer<T: ::val::CudaVal>(Rc<DevMem>, PhantomData<T>);

impl<T: CudaVal> Buffer<T> {
    pub fn new(count: usize) -> Buffer<T> {
        return Buffer(Rc::new(DevMem::alloc(mem::size_of::<T>() * count)), PhantomData {});
    }
    pub (crate) fn from_mem(mem: DevMem) -> Buffer < T >{
        return Buffer(Rc::new(mem),PhantomData{});
    }
    pub fn read(&self, buf: &mut [T]) {
        unsafe {
            let mut data = slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut u8, buf.len() * mem::size_of::<T>());
            self.0.read(&mut data);
        }
    }
    pub fn write(&self, buf: &[T]) {
        unsafe {
            let mut data = slice::from_raw_parts(buf.as_ptr() as *mut u8, buf.len() * mem::size_of::<T>());
            self.0.write(&mut data);
        }
    }
    pub fn len(&self) -> usize {
        return self.0.len() / mem::size_of::<T>();
    }
}


impl<T: CudaVal> Deref for Buffer<T> {
    type Target = DevMem;

    fn deref(&self) -> &Self::Target {
        return &self.0;
    }
}