void list_add_first(list_t* l, void* ve) { LIST_ASSERT(ve != NULL); element_t* e = (element_t*) ve; if (l->first_element == NULL) { l->last_element = e; e->next = NULL; } else { l->first_element->prev = e; e->next = l->first_element; } l->first_element = e; e->prev = NULL; l->length++; LIST_ASSERT(l->first_element != NULL); }
void list_insert_before(list_t* l, void* ve, void* ve_before) { LIST_ASSERT(ve != NULL); LIST_ASSERT(ve_before != NULL); element_t* e = (element_t*) ve; element_t* e_before = (element_t*) ve_before; e->next = e_before; e->prev = e_before->prev; if (e_before->prev != NULL) { e_before->prev->next = e; } else { l->first_element = e; } e_before->prev = e; l->length++; LIST_ASSERT(l->first_element != NULL); }
void list_delete(list_t* l, void* ve) { LIST_ASSERT(ve != NULL); element_t* e = (element_t*) ve; if (e == l->first_element) { // removing first element in list l->first_element = l->first_element->next; } else { e->prev->next = e->next; } if (e->next == NULL) { // no element after this l->last_element = e->prev; } else { e->next->prev = e->prev; } e->prev = NULL; e->next = NULL; l->length--; if (l->length == 0) { LIST_ASSERT(l->first_element == NULL); } else { LIST_ASSERT(l->first_element != NULL); } }
void list_move_last(list_t* l, void* ve) { LIST_ASSERT(ve != NULL); element_t* e = (element_t*) ve; if (e == l->last_element) { return; } // delete element, knowing it cannot be the only or the last one in list if (e == l->first_element) { // removing first element in list l->first_element = l->first_element->next; } else { e->prev->next = e->next; } e->next->prev = e->prev; // add element to end, knowing list is not empty l->last_element->next = e; e->prev = l->last_element; l->last_element = e; e->next = NULL; }
TestList() { typedef List<char, DebugAllocator<int> > IntList; IntList a; a.push_back('1'); a.push_back('2'); a.push_back('3'); LIST_ASSERT(*a.begin() == '1'); LIST_ASSERT(*++a.begin() == '2'); LIST_ASSERT(*++++a.begin() == '3'); LIST_ASSERT(++++++a.begin() == a.end()); IntList b; b.push_back('a'); b.push_back('b'); b.push_back('c'); LIST_ASSERT(*b.begin() == 'a'); LIST_ASSERT(*++b.begin() == 'b'); LIST_ASSERT(*++++b.begin() == 'c'); LIST_ASSERT(++++++b.begin() == b.end()); // swap full lists a.swap(b); LIST_ASSERT(*a.begin() == 'a'); LIST_ASSERT(*++a.begin() == 'b'); LIST_ASSERT(*++++a.begin() == 'c'); LIST_ASSERT(++++++a.begin() == a.end()); LIST_ASSERT(*b.begin() == '1'); LIST_ASSERT(*++b.begin() == '2'); LIST_ASSERT(*++++b.begin() == '3'); LIST_ASSERT(++++++b.begin() == b.end()); // swap to/from empty list IntList c; c.swap(b); LIST_ASSERT(b.empty()); LIST_ASSERT(*c.begin() == '1'); LIST_ASSERT(*++c.begin() == '2'); LIST_ASSERT(*++++c.begin() == '3'); LIST_ASSERT(++++++c.begin() == c.end()); c.swap(b); LIST_ASSERT(c.empty()); LIST_ASSERT(*b.begin() == '1'); LIST_ASSERT(*++b.begin() == '2'); LIST_ASSERT(*++++b.begin() == '3'); LIST_ASSERT(++++++b.begin() == b.end()); IntList d; c.swap(d); LIST_ASSERT(c.empty()); LIST_ASSERT(d.empty()); c.splice(c.end(), d); LIST_ASSERT(c.empty()); LIST_ASSERT(d.empty()); // splice full with empty b.splice(b.end(), c); LIST_ASSERT(c.empty()); LIST_ASSERT(*b.begin() == '1'); LIST_ASSERT(*++b.begin() == '2'); LIST_ASSERT(*++++b.begin() == '3'); LIST_ASSERT(++++++b.begin() == b.end()); // splice empty with full c.splice(c.end(), b); LIST_ASSERT(b.empty()); LIST_ASSERT(*c.begin() == '1'); LIST_ASSERT(*++c.begin() == '2'); LIST_ASSERT(*++++c.begin() == '3'); LIST_ASSERT(++++++c.begin() == c.end()); // splice full with full c.splice(c.end(), a); LIST_ASSERT(a.empty()); LIST_ASSERT(*c.begin() == '1'); LIST_ASSERT(*++c.begin() == '2'); LIST_ASSERT(*++++c.begin() == '3'); LIST_ASSERT(*++++++c.begin() == 'a'); LIST_ASSERT(*++++++++c.begin() == 'b'); LIST_ASSERT(*++++++++++c.begin() == 'c'); LIST_ASSERT(++++++++++++c.begin() == c.end()); c.pop_back(); LIST_ASSERT(!c.empty()); c.pop_back(); LIST_ASSERT(!c.empty()); c.pop_back(); LIST_ASSERT(!c.empty()); c.pop_back(); LIST_ASSERT(!c.empty()); c.pop_back(); LIST_ASSERT(!c.empty()); c.pop_back(); LIST_ASSERT(c.empty()); }