pub mod bindings;
pub mod include {
pub use crate::clist::raw::bindings::*;
}
#[allow(unused_imports)]
use std::ffi;
#[allow(unused_imports)]
use std::os::raw;
#[allow(unused_imports)]
use std::ptr;
pub enum Data {
Int(i32),
UInt(u32),
Float(f32),
Double(f64),
CString(ffi::CString),
}
pub struct DebugCList {
pub inner: include::RawCList,
}
impl DebugCList {
pub fn new(size: usize) -> Self {
let size_int = size.try_into().unwrap();
let inner_n = include::RawCList::new(size_int);
DebugCList { inner: inner_n }
}
pub fn clear(&mut self) {
self.inner.free();
}
pub fn get(&mut self, index: usize) -> ffi::CString {
let index_int: raw::c_int = index.try_into().unwrap();
let data_ptr = self.inner.get(index_int);
let data_c = unsafe { ffi::CStr::from_ptr(data_ptr as *const _)};
let data_bytes = data_c.to_bytes();
let data_cstring = ffi::CString::new(data_bytes).unwrap();
data_cstring
}
pub fn append(&mut self, data: ffi::CString) {
let data_ptr = data.as_ptr();
self.inner.append(data_ptr as *mut raw::c_void);
}
pub fn extend(&mut self, list: &mut include::RawCList) {
let mut clist_origin = include::include::CList {
data: list.get_data(),
size: list.size(),
len: list.len(),
locked: list.is_locked(),
next: list.get_next(),
};
self.inner.extend(&mut clist_origin);
}
pub fn push(&mut self, data: Data) {
match data {
Data::Int(val) => self.inner.push(&val as *const _ as *mut raw::c_void),
Data::UInt(val) => self.inner.push(&val as *const _ as *mut raw::c_void),
Data::Float(val) => self.inner.push(&val as *const _ as *mut raw::c_void),
Data::Double(val) => self.inner.push(&val as *const _ as *mut raw::c_void),
Data::CString(val) => self.inner.push(val.as_ptr() as *mut raw::c_void),
}
}
pub fn remove(&mut self, data: ffi::CString) {
let data_ptr = data.as_ptr();
self.inner.remove(data_ptr as *mut raw::c_void);
}
pub fn pop(&mut self, index: usize) {
let index_int: raw::c_int = index.try_into().unwrap();
self.inner.pop(index_int);
}
pub fn to_array(&mut self, array: &mut Vec<ffi::CString>) {
let mut raw_array: Vec<*mut raw::c_void> = array.iter_mut()
.map(|cstr| cstr.as_ptr() as *mut raw::c_void)
.collect();
let array_ptr: *mut *mut raw::c_void = raw_array.as_mut_ptr();
self.inner.to_array(array_ptr);
}
pub fn to_array_new(&mut self) -> Vec<ffi::CString> {
let mut array: Vec<ffi::CString> = Vec::new();
self.to_array(&mut array);
array
}
pub fn size(&mut self) -> usize {
let size_int = self.inner.size();
size_int.try_into().unwrap()
}
pub fn len(&mut self) -> usize {
let len_int = self.inner.len();
len_int.try_into().unwrap()
}
pub fn lock(&mut self) {
self.inner.lock();
}
pub fn unlock(&mut self) {
self.inner.unlock();
}
pub fn is_locked(&mut self) -> bool {
self.inner.is_locked()
}
}