#include "linked_list_generic.h" #include #include #define LINKED_LIST_PRIMITIVE_DEFINE( T ) \ void init_linked_list_##T( linked_list_##T##_t *p_list ) { \ p_list->p_head = NULL; \ p_list->p_tail = NULL; \ p_list->size = 0; \ } \ \ T front_##T( linked_list_##T##_t *p_list, bool *p_valid ) { \ T front_value; \ \ if ( p_list->size == 0 ) { \ *p_valid = false; \ } else { \ *p_valid = true; \ front_value = p_list->p_head->value; \ } \ \ return front_value; \ } \ \ T back_##T( linked_list_##T##_t *p_list, bool *p_valid ) { \ T back_value; \ \ if ( p_list->size == 0 ) { \ *p_valid = false; \ } else { \ *p_valid = true; \ back_value = p_list->p_tail->value; \ } \ \ return back_value; \ } \ \ void push_front_##T( linked_list_##T##_t *p_list, T new_value ) { \ if ( p_list->size == 0 ) { \ p_list->p_head \ = (node_##T##_t *)malloc( sizeof( node_##T##_t ) ); \ \ p_list->p_head->value = new_value; \ p_list->p_tail = p_list->p_head; \ \ p_list->size = 1; \ } else { \ node_##T##_t *p_new_node \ = (node_##T##_t *)malloc( sizeof( node_##T##_t ) ); \ \ p_new_node->value = new_value; \ p_new_node->p_next = p_list->p_head; \ \ p_list->p_head = p_new_node; \ ++( p_list->size ); \ } \ } \ \ void push_back_##T( linked_list_##T##_t *p_list, T new_value ) { \ if ( p_list->size == 0 ) { \ push_front_##T( p_list, new_value ); \ } else { \ p_list->p_tail->p_next \ = (node_##T##_t *)malloc( sizeof( node_##T##_t ) ); \ p_list->p_tail = p_list->p_tail->p_next; \ \ p_list->p_tail->value = new_value; \ p_list->p_tail->p_next = NULL; \ \ ++( p_list->size ); \ } \ } \ \ void pop_front_##T( linked_list_##T##_t *p_list ) { \ if ( p_list->size == 1 ) { \ free( p_list->p_head ); \ \ p_list->p_head = NULL; \ p_list->p_tail = NULL; \ p_list->size = 0; \ } else if ( p_list->size > 1 ) { \ node_##T##_t *p_to_delete = p_list->p_head; \ \ p_list->p_head = p_list->p_head->p_next; \ --( p_list->size ); \ \ free( p_to_delete ); \ } \ } \ \ node_##T##_t *find_##T( linked_list_##T##_t *p_list, \ T sought_value ) { \ node_##T##_t *p_node; \ \ for ( p_node = p_list->p_head; \ p_node != NULL; \ p_node = p_node->p_next \ ) { \ if ( p_node->value == sought_value ) { \ break; \ } \ } \ \ return p_node; \ } LINKED_LIST_PRIMITIVE_DEFINE( int ) LINKED_LIST_PRIMITIVE_DEFINE( double )