/** 
 @file list.c
 @brief ENet linked list functions
*/
#define ENET_BUILDING_LIB 1
#include "enet/enet.h"

/** 
    @defgroup list ENet linked list utility functions
    @ingroup private
    @{
*/
void enet_list_clear(ENetList* list)
{
	list->sentinel.next = &list->sentinel;
	list->sentinel.previous = &list->sentinel;
}

ENetListIterator
enet_list_insert(ENetListIterator position, void* data)
{
	ENetListIterator result = (ENetListIterator)data;

	result->previous = position->previous;
	result->next = position;

	result->previous->next = result;
	position->previous = result;

	return result;
}

void* enet_list_remove(ENetListIterator position)
{
	position->previous->next = position->next;
	position->next->previous = position->previous;

	return position;
}

ENetListIterator
enet_list_move(ENetListIterator position, void* dataFirst, void* dataLast)
{
	ENetListIterator first = (ENetListIterator)dataFirst,
					 last = (ENetListIterator)dataLast;

	first->previous->next = last->next;
	last->next->previous = first->previous;

	first->previous = position->previous;
	last->next = position;

	first->previous->next = first;
	position->previous = last;

	return first;
}

size_t
enet_list_size(ENetList* list)
{
	size_t size = 0;
	ENetListIterator position;

	for (position = enet_list_begin(list);
		 position != enet_list_end(list);
		 position = enet_list_next(position))
		++size;

	return size;
}

/** @} */
