#include "list_ops.h" #include static list_t *allocate_list(size_t length) { list_t *list = malloc(sizeof(list_t) + sizeof(list_element_t) * length); if (list) list->length = length; return list; } list_t *new_list(size_t length, list_element_t elements[]) { list_t *list = allocate_list(length); if (!list) return NULL; if (length && elements) memcpy(list->elements, elements, sizeof(list_element_t) * length); return list; } void delete_list(list_t *list) { free(list); } list_t *append_list(list_t *list1, list_t *list2) { list_t *result = allocate_list(list1->length + list2->length); if (!result) return NULL; memcpy(result->elements, list1->elements, sizeof(list_element_t) * list1->length); memcpy(result->elements + list1->length, list2->elements, sizeof(list_element_t) * list2->length); return result; } list_t *filter_list(list_t *list, bool (*filter)(list_element_t)) { size_t count = 0; for (size_t i = 0; i < list->length; i++) if (filter(list->elements[i])) count++; list_t *result = allocate_list(count); if (!result) return NULL; for (size_t i = 0, j = 0; i < list->length; i++) if (filter(list->elements[i])) result->elements[j++] = list->elements[i]; return result; } size_t length_list(list_t *list) { return list->length; } list_t *map_list(list_t *list, list_element_t (*map)(list_element_t)) { list_t *result = allocate_list(list->length); if (!result) return NULL; for (size_t i = 0; i < list->length; i++) result->elements[i] = map(list->elements[i]); return result; } list_element_t foldl_list(list_t *list, list_element_t initial, list_element_t (*foldl)(list_element_t, list_element_t)) { for (size_t i = 0; i < list->length; i++) initial = foldl(initial, list->elements[i]); return initial; } list_element_t foldr_list(list_t *list, list_element_t initial, list_element_t (*foldr)(list_element_t, list_element_t)) { for (size_t i = list->length; i-- > 0;) initial = foldr(list->elements[i], initial); return initial; } list_t *reverse_list(list_t *list) { list_t *result = allocate_list(list->length); if (!result) return NULL; for (size_t i = 0; i < list->length; i++) result->elements[i] = list->elements[list->length - 1 - i]; return result; }