|  |  | @ -3,26 +3,23 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <stdbool.h> |  |  |  | #include <stdbool.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <string.h> |  |  |  | #include <string.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <stddef.h> |  |  |  | #include <stddef.h> | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | #include <sys/types.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | #include <wlr/types/wlr_list.h> |  |  |  | #include <wlr/types/wlr_list.h> | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | struct wlr_list *wlr_list_create(void) { |  |  |  | bool wlr_list_init(struct wlr_list *list) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	struct wlr_list *list = malloc(sizeof(struct wlr_list)); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!list) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return NULL; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	list->capacity = 10; |  |  |  | 	list->capacity = 10; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	list->length = 0; |  |  |  | 	list->length = 0; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	list->items = malloc(sizeof(void *) * list->capacity); |  |  |  | 	list->items = malloc(sizeof(void *) * list->capacity); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (!list->items) { |  |  |  | 	if (list->items == NULL) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		free(list); |  |  |  | 		return false; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		return NULL; |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return list; |  |  |  | 	return true; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | static bool list_resize(struct wlr_list *list) { |  |  |  | static bool list_resize(struct wlr_list *list) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	if (list->length == list->capacity) { |  |  |  | 	if (list->length == list->capacity) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		void *new_items = realloc(list->items, sizeof(void*) * (list->capacity + 10)); |  |  |  | 		void *new_items = realloc(list->items, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			sizeof(void *) * (list->capacity + 10)); | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (!new_items) { |  |  |  | 		if (!new_items) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return false; |  |  |  | 			return false; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
	
		
		
			
				
					|  |  | @ -32,24 +29,17 @@ static bool list_resize(struct wlr_list *list) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return true; |  |  |  | 	return true; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void wlr_list_free(struct wlr_list *list) { |  |  |  | void wlr_list_finish(struct wlr_list *list) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (list == NULL) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	free(list->items); |  |  |  | 	free(list->items); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	free(list); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void wlr_list_foreach(struct wlr_list *list, void (*callback)(void *item)) { |  |  |  | void wlr_list_for_each(struct wlr_list *list, void (*callback)(void *item)) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	if (list == NULL || callback == NULL) { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	for (size_t i = 0; i < list->length; i++) { |  |  |  | 	for (size_t i = 0; i < list->length; i++) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		callback(list->items[i]); |  |  |  | 		callback(list->items[i]); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | int wlr_list_add(struct wlr_list *list, void *item) { |  |  |  | ssize_t wlr_list_push(struct wlr_list *list, void *item) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	if (!list_resize(list)) { |  |  |  | 	if (!list_resize(list)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return -1; |  |  |  | 		return -1; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
	
		
		
			
				
					|  |  | @ -57,15 +47,12 @@ int wlr_list_add(struct wlr_list *list, void *item) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return list->length; |  |  |  | 	return list->length; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | int wlr_list_push(struct wlr_list *list, void *item) { |  |  |  | ssize_t wlr_list_insert(struct wlr_list *list, size_t index, void *item) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 	return wlr_list_add(list, item); |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | int wlr_list_insert(struct wlr_list *list, size_t index, void *item) { |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	if (!list_resize(list)) { |  |  |  | 	if (!list_resize(list)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		return -1; |  |  |  | 		return -1; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	} |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 	memmove(&list->items[index + 1], &list->items[index], sizeof(void*) * (list->length - index)); |  |  |  | 	memmove(&list->items[index + 1], &list->items[index], | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		sizeof(void *) * (list->length - index)); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	list->length++; |  |  |  | 	list->length++; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	list->items[index] = item; |  |  |  | 	list->items[index] = item; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return list->length; |  |  |  | 	return list->length; | 
			
		
	
	
		
		
			
				
					|  |  | @ -73,24 +60,31 @@ int wlr_list_insert(struct wlr_list *list, size_t index, void *item) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void wlr_list_del(struct wlr_list *list, size_t index) { |  |  |  | void wlr_list_del(struct wlr_list *list, size_t index) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	list->length--; |  |  |  | 	list->length--; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	memmove(&list->items[index], &list->items[index + 1], sizeof(void*) * (list->length - index)); |  |  |  | 	memmove(&list->items[index], &list->items[index + 1], | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		sizeof(void *) * (list->length - index)); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void *wlr_list_pop(struct wlr_list *list) { |  |  |  | void *wlr_list_pop(struct wlr_list *list) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	void *_ = list->items[list->length - 1]; |  |  |  | 	if (list->length == 0) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		return NULL; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	void *last = list->items[list->length - 1]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	wlr_list_del(list, list->length - 1); |  |  |  | 	wlr_list_del(list, list->length - 1); | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return _; |  |  |  | 	return last; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void *wlr_list_peek(struct wlr_list *list) { |  |  |  | void *wlr_list_peek(struct wlr_list *list) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	if (list->length == 0) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		return NULL; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return list->items[list->length - 1]; |  |  |  | 	return list->items[list->length - 1]; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | int wlr_list_cat(struct wlr_list *list, struct wlr_list *source) { |  |  |  | ssize_t wlr_list_cat(struct wlr_list *list, const struct wlr_list *source) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	size_t old_len = list->length; |  |  |  | 	size_t old_len = list->length; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	size_t i; |  |  |  | 	size_t i; | 
			
		
	
		
		
			
				
					
					|  |  |  | 	for (i = 0; i < source->length; ++i) { |  |  |  | 	for (i = 0; i < source->length; ++i) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (wlr_list_add(list, source->items[i]) == -1) { |  |  |  | 		if (wlr_list_push(list, source->items[i]) == -1) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 			list->length = old_len; |  |  |  | 			list->length = old_len; | 
			
		
	
		
		
			
				
					
					|  |  |  | 			return -1; |  |  |  | 			return -1; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		} |  |  |  | 		} | 
			
		
	
	
		
		
			
				
					|  |  | @ -98,13 +92,13 @@ int wlr_list_cat(struct wlr_list *list, struct wlr_list *source) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	return list->length; |  |  |  | 	return list->length; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | void wlr_list_qsort(struct wlr_list *list, int compare(const void *left, const void *right)) { |  |  |  | void wlr_list_qsort(struct wlr_list *list, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 		int compare(const void *left, const void *right)) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 	qsort(list->items, list->length, sizeof(void *), compare); |  |  |  | 	qsort(list->items, list->length, sizeof(void *), compare); | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | int wlr_list_seq_find(struct wlr_list *list, |  |  |  | ssize_t wlr_list_find(struct wlr_list *list, | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		int compare(const void *item, const void *data), |  |  |  | 		int compare(const void *item, const void *data), const void *data) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | 		const void *data) { |  |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 	for (size_t i = 0; i < list->length; i++) { |  |  |  | 	for (size_t i = 0; i < list->length; i++) { | 
			
		
	
		
		
			
				
					
					|  |  |  | 		void *item = list->items[i]; |  |  |  | 		void *item = list->items[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 		if (compare(item, data) == 0) { |  |  |  | 		if (compare(item, data) == 0) { | 
			
		
	
	
		
		
			
				
					|  |  | 
 |