#include "stdafx.h"
#include "nwl_router_list.h"
 
RouterList::RouterList()
{
	first = 0;
}

RouterList::~RouterList()
{
	Clear();
}

void RouterList::Clear()
{
	while( first )
	{
		RouterListEntry * new_first = first->next;
		delete first->router;
		delete first;
		first = new_first;
	}
}

Router & RouterList::AddRouter( const RouterPosition & router_position )
{
	assert( GetRouter( router_position ) == 0 );
	
	if( !first )
	{
		first = new RouterListEntry;
		first->next = 0;
		first->router = new Router( router_position );
		return *first->router;
	}
	else
	{	
		RouterListEntry * last = first;
		while( last->next )
			last = last->next;
		last->next = new RouterListEntry;
		last->next->next = 0;
		last->next->router = new Router( router_position ); 
		return *last->next->router;
	}
}

void RouterList::RemoveRouter( const RouterPosition & router_psotion )
{
	assert( first );

	if( first->router->GetPosition() == router_psotion )
	{
		RouterListEntry * new_first = first->next;
		delete first->router;
		delete first;
		first = new_first;
	}

	RouterListEntry * entry = first;

	while( entry->next && entry->next->router->GetPosition() != router_psotion )
	{
		entry = entry->next;	
	}

	assert( entry->next );

	RouterListEntry * del_entry = entry->next;

	entry->next = del_entry->next;
	delete del_entry->router;
	delete del_entry;
}

unsigned int RouterList::GetRouterNum() const
{
	unsigned int counter = 0;
	RouterListEntry * entry = first;
	while( entry )
	{
		counter++;
		entry = entry->next;
	}
	return counter;
}

Router * RouterList::GetRouter( const RouterPosition & router_psotion ) const
{
	RouterListEntry * entry = first;
	while( entry && entry->router->GetPosition() != router_psotion )
	{
		entry = entry->next;
	}
	return entry ? entry->router : 0;
}


