mirror of
				https://gitlab.com/klmp200/LO41.git
				synced 2025-10-30 16:53:54 +00:00 
			
		
		
		
	Les lists font des trucs à peut près
J'ai rajouté le friendly aussi, comme ne C++
This commit is contained in:
		| @@ -9,15 +9,29 @@ GETTER(Element, Element*, next) | |||||||
| GETTER(Element, Element*, previous) | GETTER(Element, Element*, previous) | ||||||
| GETTER(Element, void*, data) | GETTER(Element, void*, data) | ||||||
|  |  | ||||||
| void set_previous_Element(THIS(Element), Element *previous){ | SETTER(Element, Element*, previous) | ||||||
| 	this->previous = previous; | SETTER(Element, Element*, next) | ||||||
| } |  | ||||||
|  |  | ||||||
| void set_next_Element(THIS(Element), Element *next){ |  | ||||||
| 	this->next = next; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void $_free__Element(THIS(Element)){ | 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); | 	free(this); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -31,7 +45,13 @@ Element *_init_element(void *data, size_t size, List *list){ | |||||||
| 	el->previous = NULL; | 	el->previous = NULL; | ||||||
| 	el->next = 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; | 	return el; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -15,16 +15,21 @@ struct o_Element { | |||||||
| 	PRIVATE struct o_Element *next; | 	PRIVATE struct o_Element *next; | ||||||
| 	PRIVATE struct o_Element *previous; | 	PRIVATE struct o_Element *previous; | ||||||
|  |  | ||||||
| 	PUBLIC struct o_Element *(*get_next)(O_THIS(Element)); | 	PUBLIC struct o_Element *(*get_next)(_THIS(Element)); | ||||||
| 	PUBLIC struct o_Element *(*get_previous)(O_THIS(Element)); | 	PUBLIC struct o_Element *(*get_previous)(_THIS(Element)); | ||||||
| 	PUBLIC void *(*get_data)(O_THIS(Element)); | 	PUBLIC void *(*get_data)(_THIS(Element)); | ||||||
|  |  | ||||||
| 	PUBLIC void (*set_previous)(O_THIS(Element), struct o_Element *previous); | 	PUBLIC void (*set_previous)(_THIS(Element), struct o_Element *previous); | ||||||
| 	PUBLIC void (*set_next)(O_THIS(Element), struct o_Element *next); | 	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); | Element *$_init_Element(void *data, size_t size, List *list); | ||||||
|  |  | ||||||
| #endif //LO41_ELEMENT_H | #endif //LO41_ELEMENT_H | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								List/List.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								List/List.c
									
									
									
									
									
								
							| @@ -8,16 +8,44 @@ GETTER(List, Element*, tail) | |||||||
| GETTER(List, int, size) | GETTER(List, int, size) | ||||||
|  |  | ||||||
| void $_free__List(THIS(List)){ | void $_free__List(THIS(List)){ | ||||||
|  | 	this->clear(this); | ||||||
| 	free(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 *$_init_List(){ | ||||||
| 	List *l = (List*) malloc_or_die(sizeof(List)); | 	List *l = (List*) malloc_or_die(sizeof(List)); | ||||||
| 	l->size = 0; | 	l->size = 0; | ||||||
| 	l->head = NULL; | 	l->head = NULL; | ||||||
| 	l->tail = 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; | 	return l; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										17
									
								
								List/List.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								List/List.h
									
									
									
									
									
								
							| @@ -18,12 +18,21 @@ struct o_List { | |||||||
| 	PRIVATE Element *tail; | 	PRIVATE Element *tail; | ||||||
| 	PRIVATE int size; | 	PRIVATE int size; | ||||||
|  |  | ||||||
| 	PUBLIC Element *(*get_head)(O_THIS(List)); | 	PUBLIC Element *(*get_head)(_THIS(List)); | ||||||
| 	PUBLIC Element *(*get_tail)(O_THIS(List)); | 	PUBLIC Element *(*get_tail)(_THIS(List)); | ||||||
| 	PUBLIC int (*get_size)(O_THIS(List)); | 	PUBLIC int (*get_size)(_THIS(List)); | ||||||
| 	PUBLIC void (*$_free_)(O_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(); | List *$_init_List(); | ||||||
|  |  | ||||||
| #endif //LO41_LIST_H | #endif //LO41_LIST_H | ||||||
|   | |||||||
| @@ -10,8 +10,9 @@ | |||||||
|  |  | ||||||
| #define NEW(type, ...) $_init_##type(__VA_ARGS__) | #define NEW(type, ...) $_init_##type(__VA_ARGS__) | ||||||
| #define DELETE(obj) obj->$_free_(obj) | #define DELETE(obj) obj->$_free_(obj) | ||||||
|  | #define DESTRUCTOR(type) void (*$_free_)(struct o_##type *this) | ||||||
| #define THIS(type) 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 CRASH(message) perror(message) | ||||||
|  |  | ||||||
| #define SYNCHRONIZE | #define SYNCHRONIZE | ||||||
| @@ -19,9 +20,13 @@ | |||||||
| #define PUBLIC | #define PUBLIC | ||||||
| #define PROTECTED | #define PROTECTED | ||||||
|  |  | ||||||
|  | #define FRIENDLY(property, obj) | ||||||
|  |  | ||||||
| #define LINK(type, obj, method) obj->method = method##_##type; | #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){\ | #define GETTER(obj_type, variable_type, variable) variable_type get_##variable##_##obj_type(obj_type *this){\ | ||||||
| 													return this->variable; } | 													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); | void * malloc_or_die(size_t size); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user