52 lines
1.8 KiB
C
52 lines
1.8 KiB
C
#ifndef ARRAY_H
|
|
#define ARRAY_H
|
|
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include "type_info.h"
|
|
|
|
typedef struct DynamicArray {
|
|
char *data;
|
|
const TypeInfo *type;
|
|
size_t capacity; // ёмкость
|
|
size_t size; // текущий размер
|
|
} DynamicArray;
|
|
|
|
// Создание/уничтожение
|
|
DynamicArray* da_create(const TypeInfo *type, size_t initial_capacity);
|
|
void da_destroy(DynamicArray *arr);
|
|
|
|
// Доступ к элементам
|
|
void* da_get(const DynamicArray *arr, const size_t index);
|
|
bool da_set(DynamicArray *arr, const size_t index, const void *value);
|
|
size_t da_size(const DynamicArray *arr);
|
|
|
|
// Модификация
|
|
bool da_push_back(DynamicArray *arr, const void *value);
|
|
bool da_insert(DynamicArray *arr, const size_t index, const void *value);
|
|
bool da_remove(DynamicArray *arr, const size_t index);
|
|
|
|
// Операции
|
|
// Сортировка (используется compare из TypeInfo)
|
|
void da_sort(DynamicArray *arr);
|
|
|
|
// map: применить f к каждому элементу и вернуть новый массив
|
|
typedef void (*MapFunc)(void *dest, const void *src);
|
|
DynamicArray* da_map(const DynamicArray *arr, MapFunc f);
|
|
|
|
// where: фильтрация по предикату
|
|
typedef bool (*Predicate)(const void *elem);
|
|
DynamicArray* da_where(const DynamicArray *arr, Predicate pred);
|
|
|
|
// reduce: свёртка массива в один элемент
|
|
typedef void (*ReduceFunc)(void *accumulator, const void *elem);
|
|
void da_reduce(const DynamicArray *arr, ReduceFunc f, void *initial, void *result);
|
|
|
|
// Конкатенация: возвращает новый массив
|
|
DynamicArray* da_concat(const DynamicArray *a, const DynamicArray *b);
|
|
|
|
// Вспомогательные функции
|
|
void da_print(const DynamicArray *arr);
|
|
|
|
#endif // ARRAY_H
|