#include "stdafx.h"
#include "nwl_router_list.h"
#include "nwl_connection_list.h"
#include "nwl_network.h"

Network::Network()
{
	router_list = new RouterList;
	connection_list = new ConnectionList;
}

Network::~Network()
{
	delete router_list;
	delete connection_list;
}

void Network::RemoveAllPackets()
{
	RouterListIterator router_iterator( router_list );
	for( router_iterator.Begin() ; !router_iterator.IsEnd() ; router_iterator++ )
		router_iterator.GetRouter()->RemoveAllPackets();

	ConnectionListIterator connection_iterator( connection_list );
	for( connection_iterator.Begin() ; !connection_iterator.IsEnd() ; connection_iterator++ )
		connection_iterator.GetConnection()->RemoveAllPackets();

}

void Network::AddRouter( const RouterPosition & router_position )
{
	router_list->AddRouter( router_position );
}

void Network::RemoveRouter( const RouterPosition & router_position )
{
	// remove all connection of this router
	Router & router = GetRouter( router_position );
	for( int i=0 ; i<router.GetConnectionNum() ; i++ )
	{
		Connection & connection = router.GetConnection( i );
		RemoveConnection( connection.GetA() , connection.GetB() );
	}

	// remov router
	router_list->RemoveRouter( router_position );
}

unsigned int Network::GetRouterNum() const
{
	return router_list->GetRouterNum();
}

Router & Network::GetRouter( const RouterPosition & router_position ) const
{
	Router * ret = router_list->GetRouter( router_position );
	assert( ret );
	return *ret;
}

Router & Network::GetRouter( int x , int y ) const
{
	Router * ret = router_list->GetRouter( RouterPosition(x,y) );
	assert( ret );
	return *ret;
}


void Network::InitRouterListIterator( RouterListIterator & iterator )
{
	iterator.Init( router_list );
}

void Network::AddConnection( Router & a , Router & b )
{
	Connection & connection = connection_list->AddConnection( a, b );
	a.AddConnection( connection );
	b.AddConnection( connection );
}

void Network::RemoveConnection( Router & a , Router & b )
{
	Connection & connection = GetConnection( a , b );
	a.RemoveConnection( connection );
	b.RemoveConnection( connection );
	connection_list->RemoveConnection( a , b );
}
		
unsigned int Network::GetConnectionNum()
{
	return connection_list->GetConnectionNum();
}

Connection & Network::GetConnection( const Router & a , const Router & b ) const
{
	Connection * ret = connection_list->GetConnection( a , b );
	assert( ret );
	return *ret;
}

void Network::InitConnectionListIterator( ConnectionListIterator & iterator )
{
	iterator.Init( connection_list );
}


