Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
  }
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
	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());
	}