#ifndef Q_ROUTING_BELLMAN_FORD_POLICY_H
#define Q_ROUTING_BELLMAN_FORD_POLICY_H

class BellmanFordPolicy : public Policy {
public:
	BellmanFordPolicy( Network * network );
	virtual ~BellmanFordPolicy();

	virtual void Init();
	virtual void Reset();
	virtual void NetworkChange();
	
	virtual bool OneStep( Router & router , Packet ** packet ) const;
};

class BellmanFordExtraData : public RouterExtraData 
{
public:
	BellmanFordExtraData();
	virtual ~BellmanFordExtraData();

	void Clear();
	void SetRoutersNum( int routers_num );
	int GetRoutersNum();
	void AddRouter( Router * router );
	Router * GetNextHop( Router * packet_destination );
	int GetNextHopDistance( Router * packet_destination );
	void SetNextHop( Router * destination ,
					 Router * new_next_hop ,
					 int distance );

private:
	class Entry { 
		public:
			Entry() { destination_router = next_hop = 0; distance = 99999; }
			Router * destination_router; 
			Router * next_hop;
			int distance;
	};
	
	int entries_num; // one per network router
	Entry * routers_list;

	Entry * GetRouterEntry( Router * destination );
};

#endif //Q_ROUTING_BELLMAN_FORD_POLICY_H