static void add_points_to_pool(point_pool* pool, point_index new_points_index, size_t count) {
point_index n = new_points_index + (point_index)count - 1;
pool->points[n].next = pool->free_points;
for (--n; n > new_points_index - 1; --n) {
pool->points[n].next = n + 1;
}
pool->free_points = new_points_index;
}
point_pool* create_point_pool(size_t prealocate_count, size_t step) {
point_pool* pool = (point_pool*)malloc(sizeof(point_pool));
if (pool == 0) return 0;
pool->points = (point*)malloc(sizeof(point) * prealocate_count);
if (pool->points == 0) {
free((void*)pool);
return 0;
}
pool->free_points = POINT_END_INDEX;
pool->total = prealocate_count;
pool->step = step;
add_points_to_pool(pool, 0, prealocate_count);
return pool;
}
Рассмотрим работу:
point_pool* my_pool = create_point_pool(5, 5);
После создания бассейна без свободных мест конструктор вызывает:
add_points_to_pool(pool, 0, 5);
В дальнейшем:
n = 0 + 5 - 1 = 4
pool->points[4].next = <T>
и цикл от 3 пока n > (new_point_index = 0) - 1, то есть пока n > 0xFFFFFFFF, то есть ни одного раза? Впрочем, это мелочи, суть ясна.
pool->points[3].next = 4;
pool->points[2].next = 3;
pool->points[1].next = 2;
pool->points[0].next = 1;
free_points = 0;
Далее необходимо найти в бассейне конкретную свободную точку:
point_index my_index = alloc_point(my_pool);
idx = 5;
Вызывает:
remove_point_from_list(&(pool->free_points), &(pool->points[0]));
В результате: free_points = 1. А возвращается 0;
Вот теперь по индексу 0 можно что-то записать.
API не очень очевидное, позже попробую понять, как это работать будет в случае удаления данных из середины. Пока вижу расширяющийся вверх список до фрагментации.