#include #include #include #include typedef struct { char* arr; size_t size; size_t capacity; } Vec8_t; #define CAPACITY 1024 Vec8_t create(const Vec8_t* input) { Vec8_t vec = { .arr = NULL, .size = 0, .capacity = CAPACITY }; if (input == NULL) { vec.arr = calloc(vec.capacity, sizeof(char)); return vec; } if (input->size > 0) { vec.size = input->size + 1; } vec.arr = calloc(vec.capacity, sizeof(char)); return vec; } void delete(Vec8_t* vec) { if (vec->arr != NULL) { free(vec->arr); vec->arr = NULL; } vec->size = 0; vec->capacity = 0; } Vec8_t add_back(Vec8_t* vec, const char val) { if (vec->size >= vec->capacity) { vec->capacity = 2 * vec->capacity; char* new_arr = reallocf(vec->arr, vec->capacity * sizeof(char)); if (new_arr == NULL) { return *vec; } vec->arr = new_arr; } vec->arr[vec->size] = val; vec->size++; return *vec; } vm_size_t get_physical_mem() { struct task_basic_info info; mach_msg_type_number_t count = TASK_BASIC_INFO_COUNT; task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &count); return info.resident_size; } int main() { printf("=== PROGRESSIVE TEST: 1K -> 10K -> 100K -> 1M -> 10M -> 100M -> 1B ===\n\n"); size_t targets[] = {1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000}; int num_tests = 7; for (int t = 0; t < num_tests; t++) { size_t target = targets[t]; printf("\n=== TEST %d: %zu elements ===\n", t+1, target); Vec8_t vec = create(NULL); size_t start_cap = vec.capacity; for (size_t i = 0; i < target; i++) { vec = add_back(&vec, 'x'); if (vec.arr == NULL) { printf("CRASHED at %zu elements!\n", i); return 1; } } printf("SUCCESS: %zu elements, capacity %zu\n", vec.size, vec.capacity); printf("Memory: %.2f MB\n", get_physical_mem() / 1024.0 / 1024.0); delete(&vec); } printf("\n=== ALL TESTS PASSED ===\n"); printf("Final memory: %.2f MB\n", get_physical_mem() / 1024.0 / 1024.0); return 0; }