zigzag-alloc 1.0.1

A collection of explicit memory allocators and collections inspired by Zig
Documentation
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "zigzag.h"

int main() {
    zigzag_counting_t *sys_counter = zigzag_counting_create();
    zigzag_alloc_t sys_alloc = zigzag_counting_as_alloc(sys_counter);

    printf("=== Manual Allocation & CountingAllocator ===\n");
    {
        int *val = (int*)zigzag_alloc(sys_alloc, sizeof(int), _Alignof(int));
        if (val) {
            *val = 42;
            printf("Value: %d\n", *val);
            zigzag_dealloc(sys_alloc, val, sizeof(int), _Alignof(int));
        }
    }

    zigzag_alloc_stats_t stats = zigzag_counting_stats(sys_counter);
    printf("Allocated: %zu bytes\n", stats.bytes);
    printf("Allocs count: %zu\n\n", stats.allocs);

    printf("=== ExVec & Arena (Linear Allocation) ===\n");
    {
        zigzag_arena_t *arena = zigzag_arena_create();
        zigzag_alloc_t arena_alloc = zigzag_arena_as_alloc(arena);

        zigzag_vec_t *v = zigzag_vec_create(arena_alloc, sizeof(int), _Alignof(int));
        
        for (int i = 0; i < 5; i++) {
            int val = i * 10;
            zigzag_vec_push(v, &val);
        }

        printf("Vec: [");
        for (size_t i = 0; i < zigzag_vec_len(v); i++) {
            printf("%d%s", *(int*)zigzag_vec_get(v, i), (i < 4 ? ", " : ""));
        }
        printf("]\n");

        zigzag_arena_reset(arena);
        printf("Arena reset performed\n");

        zigzag_vec_destroy(v);
        zigzag_arena_destroy(arena);
    }

    printf("\n=== ExString & Pool (Fixed Size Blocks) ===\n");
    {
        size_t block_size = 64;
        zigzag_pool_t *pool = zigzag_pool_create(block_size, 8, 10);
        zigzag_alloc_t pool_alloc = zigzag_pool_as_alloc(pool);

        zigzag_string_t *s = zigzag_string_create(pool_alloc);
        const char *msg = "Hello from ZigZag!";
        zigzag_string_push_str(s, (const uint8_t*)msg, strlen(msg));

        printf("String in Pool: %s\n", (const char*)zigzag_string_as_ptr(s));
        printf("Pool free slots: %zu\n", zigzag_pool_free_count(pool));

        zigzag_string_destroy(s);
        zigzag_pool_destroy(pool);
    }

    printf("\n=== Final Global Stats ===\n");
    zigzag_alloc_stats_t final_stats = zigzag_counting_stats(sys_counter);
    printf("Total count of alloc() calls: %zu\n", final_stats.allocs);
    printf("Total count of dealloc() calls: %zu\n", final_stats.deallocs);
    printf("Total bytes processed: %zu\n", final_stats.bytes);

    zigzag_counting_destroy(sys_counter);

    return 0;
}