c_vec

Struct CVec

Source
pub struct CVec<T> { /* private fields */ }
Expand description

The type representing a foreign mutable chunk of memory.

§Example

use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };

Implementations§

Source§

impl<T> CVec<T>

Source

pub unsafe fn new(base: *mut T, len: usize) -> CVec<T>

Create a CVec from a raw pointer to a buffer with a given length.

Panics if the given pointer is null. The returned vector will not attempt to deallocate the vector when dropped.

§Arguments
  • base - A unique pointer to a buffer
  • len - The number of elements in the buffer
§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
Source

pub unsafe fn new_with_dtor<F>(base: *mut T, len: usize, dtor: F) -> CVec<T>
where F: FnOnce(*mut T) + 'static,

Create a CVec from a foreign buffer, with a given length, and a function to run upon destruction.

Panics if the given pointer is null.

§Arguments
  • base - A unique pointer to a buffer
  • len - The number of elements in the buffer
  • dtor - A fn to run when the value is destructed, useful for freeing the buffer, etc. base will be passed to it as an argument.
§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new_with_dtor(ptr, slice.len(), |_| println!("free time!")) };
Source

pub fn get(&self, ofs: usize) -> Option<&T>

Retrieves an element at a given index, returning None if the requested index is greater than the length of the vector.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
assert_eq!(cvec.get(1), slice.get(1));
Source

pub unsafe fn get_unchecked(&self, ofs: usize) -> &T

Returns a reference to an element without doing any check.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
unsafe {
    assert_eq!(cvec.get_unchecked(1), slice.get_unchecked(1));
}
Source

pub fn get_mut(&mut self, ofs: usize) -> Option<&mut T>

Retrieves a mutable element at a given index, returning None if the requested index is greater than the length of the vector.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let mut cvec = unsafe { CVec::new(ptr, slice.len()) };
if let Some(el) = cvec.get_mut(1) {
    *el += 10;
}
assert_eq!(cvec[1], 11);
Source

pub unsafe fn get_unchecked_mut<'a>(&'a mut self, ofs: usize) -> &mut T

Returns a mutable reference to an element without doing any check.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let mut cvec = unsafe { CVec::new(ptr, slice.len()) };
unsafe { *cvec.get_unchecked_mut(1) += 10; }
assert_eq!(cvec[1], 11);
Source

pub unsafe fn into_inner(self) -> *mut T

Unwrap the pointer without running the destructor

This method retrieves the underlying pointer, and in the process destroys the CVec but without running the destructor. A use case would be transferring ownership of the buffer to a C function, as in this case you would not want to run the destructor.

Note that if you want to access the underlying pointer without cancelling the destructor, you can simply call transmute on the return value of CVec::get(0).

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
assert_eq!(unsafe { cvec.into_inner() }, ptr);
Source

pub fn len(&self) -> usize

Returns the number of items in this vector.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
assert_eq!(cvec.len(), slice.len());
Source

pub fn is_empty(&self) -> bool

Returns whether this vector is empty.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
assert_eq!(cvec.is_empty(), slice.is_empty());
Source

pub fn as_cslice<'a>(&'a self) -> CSlice<'a, T>

Returns a CSlice which is a “view” over the data.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
let cslice = cvec.as_cslice();
Source

pub fn as_cslice_mut<'a>(&'a mut self) -> CSliceMut<'a, T>

Returns a CSliceMut which is a mutable “view” over the data.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let mut cvec = unsafe { CVec::new(ptr, slice.len()) };
let cslice = cvec.as_cslice_mut();
Source

pub fn iter<'a>(&'a self) -> CVecIter<'a, T>

Returns an iterator over CVec data.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let cvec = unsafe { CVec::new(ptr, slice.len()) };
for elem in cvec.iter() {
    println!("=> {}", elem);
}
Source

pub fn iter_mut<'a>(&'a mut self) -> CVecIterMut<'a, T>

Returns a mutable iterator over CVec data.

§Example
use c_vec::CVec;

let slice = &mut [0, 1, 2];
let ptr = slice.as_mut_ptr();
let mut cvec = unsafe { CVec::new(ptr, slice.len()) };
for elem in cvec.iter_mut() {
    *elem += 1;
}
assert_eq!(cvec[0], 1);

Trait Implementations§

Source§

impl<T> AsMut<[T]> for CVec<T>

Source§

fn as_mut(&mut self) -> &mut [T]

View the stored data as a slice.

Source§

impl<T> AsRef<[T]> for CVec<T>

Source§

fn as_ref(&self) -> &[T]

View the stored data as a slice.

Source§

impl<T> Drop for CVec<T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T> Index<usize> for CVec<T>

Source§

type Output = T

The returned type after indexing.
Source§

fn index(&self, index: usize) -> &T

Performs the indexing (container[index]) operation. Read more
Source§

impl<T> IndexMut<usize> for CVec<T>

Source§

fn index_mut(&mut self, index: usize) -> &mut T

Performs the mutable indexing (container[index]) operation. Read more
Source§

impl<T: Clone> Into<Vec<T>> for CVec<T>

Source§

fn into(self: CVec<T>) -> Vec<T>

Converts this type into the (usually inferred) input type.

Auto Trait Implementations§

§

impl<T> Freeze for CVec<T>

§

impl<T> !RefUnwindSafe for CVec<T>

§

impl<T> !Send for CVec<T>

§

impl<T> !Sync for CVec<T>

§

impl<T> Unpin for CVec<T>

§

impl<T> !UnwindSafe for CVec<T>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.