diff --git a/List/Element.c b/List/Element.c index b33b45e..862bae6 100644 --- a/List/Element.c +++ b/List/Element.c @@ -9,15 +9,29 @@ GETTER(Element, Element*, next) GETTER(Element, Element*, previous) GETTER(Element, void*, data) -void set_previous_Element(THIS(Element), Element *previous){ - this->previous = previous; -} - -void set_next_Element(THIS(Element), Element *next){ - this->next = next; -} +SETTER(Element, Element*, previous) +SETTER(Element, Element*, next) void $_free__Element(THIS(Element)){ + List * list = this->list; + if (list != NULL) { + if (list->head == this && list->tail == this) { + list->head = NULL; + list->tail = NULL; + } else if (list->head == this) { + list->head = this->next; + this->previous = NULL; + } else if (list->tail == this) { + list->tail = this->previous; + this->previous->next = NULL; + } else { + this->next->previous = this->previous; + this->previous->next = this->next; + } + list->size --; + } + if (this->data != NULL) + free(this->data); free(this); } @@ -31,7 +45,13 @@ Element *_init_element(void *data, size_t size, List *list){ el->previous = NULL; el->next = NULL; - LINK_ALL(Element, el, get_next, get_previous, get_data, set_next, set_previous) + LINK_ALL(Element, el, + get_next, + get_previous, + get_data, + set_next, + set_previous + ) return el; } diff --git a/List/Element.h b/List/Element.h index 6fc9044..b352337 100644 --- a/List/Element.h +++ b/List/Element.h @@ -15,16 +15,21 @@ struct o_Element { PRIVATE struct o_Element *next; PRIVATE struct o_Element *previous; - PUBLIC struct o_Element *(*get_next)(O_THIS(Element)); - PUBLIC struct o_Element *(*get_previous)(O_THIS(Element)); - PUBLIC void *(*get_data)(O_THIS(Element)); + PUBLIC struct o_Element *(*get_next)(_THIS(Element)); + PUBLIC struct o_Element *(*get_previous)(_THIS(Element)); + PUBLIC void *(*get_data)(_THIS(Element)); - PUBLIC void (*set_previous)(O_THIS(Element), struct o_Element *previous); - PUBLIC void (*set_next)(O_THIS(Element), struct o_Element *next); + PUBLIC void (*set_previous)(_THIS(Element), struct o_Element *previous); + PUBLIC void (*set_next)(_THIS(Element), struct o_Element *next); - PUBLIC void (*$_free_)(O_THIS(Element)); + DESTRUCTOR(Element); }; +FRIENDLY(list, List) +FRIENDLY(data, List) +FRIENDLY(next, List) +FRIENDLY(previous, List) + Element *$_init_Element(void *data, size_t size, List *list); #endif //LO41_ELEMENT_H diff --git a/List/List.c b/List/List.c index b40b351..910f7dd 100644 --- a/List/List.c +++ b/List/List.c @@ -8,16 +8,44 @@ GETTER(List, Element*, tail) GETTER(List, int, size) void $_free__List(THIS(List)){ + this->clear(this); free(this); } +void clear_List(THIS(List)){ + Element * el = this->head; + Element * el_tmp; + while (el != NULL){ + el->list = NULL; + el_tmp = el; + el = el_tmp->next; + DELETE(el_tmp); + } + this->size = 0; +} + +void remove_head_List(THIS(List)){ + DELETE(this->head); +} + +void remove_tail_List(THIS(List)){ + DELETE(this->tail); +} + List *$_init_List(){ List *l = (List*) malloc_or_die(sizeof(List)); l->size = 0; l->head = NULL; l->tail = NULL; - LINK_ALL(List, l, get_head, get_tail, get_size) + LINK_ALL(List, l, + get_head, + get_tail, + get_size, + clear, + remove_head, + remove_tail + ) return l; } diff --git a/List/List.h b/List/List.h index 4058c2b..d74dd70 100644 --- a/List/List.h +++ b/List/List.h @@ -18,12 +18,21 @@ struct o_List { PRIVATE Element *tail; PRIVATE int size; - PUBLIC Element *(*get_head)(O_THIS(List)); - PUBLIC Element *(*get_tail)(O_THIS(List)); - PUBLIC int (*get_size)(O_THIS(List)); - PUBLIC void (*$_free_)(O_THIS(List)); + PUBLIC Element *(*get_head)(_THIS(List)); + PUBLIC Element *(*get_tail)(_THIS(List)); + PUBLIC int (*get_size)(_THIS(List)); + PUBLIC void (*clear)(_THIS(List)); + PUBLIC void (*remove_head)(_THIS(List)); + PUBLIC void (*remove_tail)(_THIS(List)); + + + DESTRUCTOR(List); }; +FRIENDLY(head, Element) +FRIENDLY(tail, Element) +FRIENDLY(size, Element) + List *$_init_List(); #endif //LO41_LIST_H diff --git a/Objects.h b/Objects.h index 797efd1..2c53f84 100644 --- a/Objects.h +++ b/Objects.h @@ -10,8 +10,9 @@ #define NEW(type, ...) $_init_##type(__VA_ARGS__) #define DELETE(obj) obj->$_free_(obj) +#define DESTRUCTOR(type) void (*$_free_)(struct o_##type *this) #define THIS(type) type *this -#define O_THIS(type) struct o_##type *this +#define _THIS(type) struct o_##type *this #define CRASH(message) perror(message) #define SYNCHRONIZE @@ -19,9 +20,13 @@ #define PUBLIC #define PROTECTED +#define FRIENDLY(property, obj) + #define LINK(type, obj, method) obj->method = method##_##type; #define GETTER(obj_type, variable_type, variable) variable_type get_##variable##_##obj_type(obj_type *this){\ return this->variable; } +#define SETTER(obj_type, variable_type, variable) void set_##variable##_##obj_type(obj_type *this, variable_type var){\ + this->variable = var; } void * malloc_or_die(size_t size);