Add files via upload
This commit is contained in:
51
dynamic_array.h
Normal file
51
dynamic_array.h
Normal file
@@ -0,0 +1,51 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user