use brickworks::{br_print, set_module_name};
set_module_name!("tarray");
use super::fmalloc;
use core::fmt;
use core::fmt::*;
use super::FName;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct TArray<T> {
pub data: *mut T,
pub num: i32,
pub max: i32,
}
impl<T: Clone> TArray<T>
{
pub unsafe fn new() -> TArray<T>
{
TArray { data: core::ptr::null_mut(), num: 0, max: 0}
}
pub unsafe fn with_size( num: i32 ) -> TArray<T>
{
TArray { data: fmalloc::malloc( size_of::<T>() * num as usize ) as *mut T, num: num, max: num}
}
pub unsafe fn init( data: T, num: i32) -> TArray<T>
{
let alloc = fmalloc::malloc( size_of::<T>() * num as usize ) as *mut T;
for i in 0..num
{
*alloc.add(i as usize) = data.clone();
}
TArray {
data: alloc,
num: num,
max: num,
}
}
pub unsafe fn push( &mut self, data: T ) -> i32
{
if self.num >= self.max
{
self.max = u32::next_power_of_two((self.max + 1) as u32) as i32;
self.data =
fmalloc::realloc(
self.data as *mut (),
self.max as usize * core::mem::size_of::<T>()
) as *mut T
}
*self.data.add( self.num as usize ) = data.clone();
self.num += 1;
self.num - 1
}
#[allow(non_snake_case)]
pub unsafe fn Add( &mut self, data: T ) -> i32
{
self.push(data)
}
pub unsafe fn free( &mut self )
{
fmalloc::free(self.data as *mut ());
}
}