rulloc 0.1.0

General purpose memory allocator
Documentation
#![feature(allocator_api)]

use std::{
    alloc::{Allocator, Layout},
    ptr::NonNull,
};

use rulloc::Rulloc;

fn print_alloc(addr: NonNull<u8>, layout: Layout) {
    println!("Requested {} bytes of memory", layout.size());
    println!("Received this address: {addr:?}");
}

fn main() {
    let allocator = Rulloc::default();

    unsafe {
        let layout1 = Layout::new::<u8>();
        let addr1 = allocator.allocate(layout1).unwrap().cast();
        print_alloc(addr1, layout1);

        let layout2 = Layout::array::<u8>(1024).unwrap();
        let addr2 = allocator.allocate(layout2).unwrap().cast();
        print_alloc(addr2, layout2);

        let layout3 = Layout::array::<u8>(4096).unwrap();
        let addr3 = allocator.allocate(layout3).unwrap().cast();
        print_alloc(addr3, layout3);

        println!("Deallocating everything...");
        allocator.deallocate(addr1, layout1);
        allocator.deallocate(addr2, layout2);
        allocator.deallocate(addr3, layout3);

        println!("\nNow let's try to use Vec with our allocator...");
        let initial_size = 10;
        let mut v = Vec::with_capacity_in(initial_size, allocator);
        for i in 0..initial_size {
            v.push(i as u32);
        }
        println!("Initial Vec at {:?} = {:?}", v.as_ptr(), v);

        println!("Let's try some reallocs");
        let next_chunk_size = 1024;
        for i in 0..next_chunk_size {
            v.push(i);
        }
        println!(
            "Pushed {} elements into vec, current addr = {:?}",
            next_chunk_size,
            v.as_ptr()
        );

        println!("First 15 elements: {:?}", &v[0..15]);
        println!("Last 15 elements: {:?}", &v[v.len() - 15..]);
    }
}