#ifndef _MANET_GRAPH
#define _MANET_GRAPH
#include "protoGraph.h"
#include "protoAddress.h"
class NetGraph : public ProtoGraph
{
public:
virtual ~NetGraph();
class Cost
{
public:
virtual ~Cost();
virtual const char* GetCostKey() const = 0;
virtual unsigned int GetCostKeysize() const = 0;
virtual bool GetCostKeySigned() const = 0;
virtual bool GetCostKeyComplement2() const = 0;
virtual ProtoTree::Endian GetCostKeyEndian() const = 0;
virtual Cost& operator=(const Cost& cost) = 0;
virtual void Minimize() = 0;
virtual void operator+=(const Cost& cost) = 0;
virtual bool operator>(const Cost& cost) const = 0;
virtual bool operator==(const Cost& cost) const = 0;
bool operator!=(const Cost& cost) const
{return (!(cost == *this));}
bool operator>=(const Cost& cost) const
{return ((*this > cost) || (*this == cost));}
bool operator<(const Cost& cost) const
{return ((*this >= cost) ? false : true);}
bool operator<=(const Cost& cost) const
{return ((*this > cost) ? false : true);}
protected:
Cost();
};
template <class SIMPLE_TYPE>
class SimpleCostTemplate : public Cost
{
public:
SimpleCostTemplate() : value(0) {}
SimpleCostTemplate(SIMPLE_TYPE theValue) : value(theValue) {}
virtual ~SimpleCostTemplate() {}
void SetValue(SIMPLE_TYPE theValue)
{value = theValue;}
SIMPLE_TYPE GetValue() const
{return value;}
operator SIMPLE_TYPE() const
{return value;}
SimpleCostTemplate& operator=(SIMPLE_TYPE theValue)
{
value = theValue;
return *this;
}
SimpleCostTemplate& operator=(const SimpleCostTemplate& cost)
{
value = cost.value;
return *this;
}
const char* GetCostKey() const
{return ((char*)&value);}
unsigned int GetCostKeysize() const
{return (sizeof(SIMPLE_TYPE) << 3);}
virtual bool GetCostKeySigned() const
{return true;}
virtual bool GetCostKeyComplement2() const
{return false;}
virtual ProtoTree::Endian GetCostKeyEndian() const
{return ProtoTree::GetNativeEndian();}
Cost& operator=(const Cost& cost)
{
ASSERT(NULL != dynamic_cast<const SimpleCostTemplate*>(&cost));
value = static_cast<const SimpleCostTemplate&>(cost).value;
return *this;
}
void Minimize()
{ value = 0;}
bool operator==(const Cost& cost) const
{
ASSERT(NULL != dynamic_cast<const SimpleCostTemplate*>(&cost));
return (value == static_cast<const SimpleCostTemplate&>(cost).value);
}
bool operator>(const Cost& cost) const
{
ASSERT(NULL != dynamic_cast<const SimpleCostTemplate*>(&cost));
return (value > static_cast<const SimpleCostTemplate&>(cost).value);
}
void operator+=(const Cost& cost)
{
ASSERT(NULL != dynamic_cast<const SimpleCostTemplate*>(&cost));
value += static_cast<const SimpleCostTemplate&>(cost).value;
}
protected:
SIMPLE_TYPE value;
};
class SimpleCostDouble : public SimpleCostTemplate<double>
{
public:
SimpleCostDouble() {}
SimpleCostDouble(double theValue) : SimpleCostTemplate<double>(theValue) {}
};
class SimpleCostUINT32 : public SimpleCostTemplate<UINT32>
{
public:
SimpleCostUINT32() {}
SimpleCostUINT32(UINT32 theValue) : SimpleCostTemplate<UINT32>(theValue) {}
bool GetCostKeySigned() const
{return false;}
};
class SimpleCostUINT8 : public SimpleCostTemplate<UINT8>
{
public:
SimpleCostUINT8() {}
SimpleCostUINT8(UINT8 theValue) : SimpleCostTemplate<UINT8>(theValue) {}
bool GetCostKeySigned() const
{return false;}
};
class Interface;
class Link;
class AdjacencyIterator : public ProtoGraph::AdjacencyIterator
{
public:
AdjacencyIterator(Interface& iface);
virtual ~AdjacencyIterator();
Interface* GetNextAdjacency()
{return static_cast<Interface*>(ProtoGraph::AdjacencyIterator::GetNextAdjacency());}
Link* GetNextAdjacencyLink()
{return static_cast<Link*>(ProtoGraph::AdjacencyIterator::GetNextAdjacencyEdge());}
Interface* GetNextConnector()
{return static_cast<Interface*>(ProtoGraph::AdjacencyIterator::GetNextConnector());}
};
class Link : public Edge
{
public:
virtual ~Link();
virtual const Cost& GetCost() const = 0;
void SetCost(const Cost& cost);
Interface* GetSrc() const
{return static_cast<Interface*>(Edge::GetSrc());}
Interface* GetDst() const
{return static_cast<Interface*>(Edge::GetDst());}
virtual const char* GetKey() const
{return GetCost().GetCostKey();}
virtual unsigned int GetKeysize() const
{return (GetCost().GetCostKeysize());}
virtual ProtoTree::Endian GetEndian() const
{return GetCost().GetCostKeyEndian();}
virtual bool UseSignBit() const
{return GetCost().GetCostKeySigned();}
virtual bool UseComplement2() const
{return GetCost().GetCostKeyComplement2();}
protected:
Link();
virtual Cost& AccessCost() = 0;
};
class Node;
class Interface : public ProtoGraph::Vertice, public ProtoSortedTree::Item
{
friend class NetGraph;
public:
Interface(Node& theNode, const ProtoAddress& addr);
Interface(Node& theNode);
virtual ~Interface();
const ProtoAddress& GetAddress() const
{return default_addr_item.GetAddress();}
const ProtoAddress& GetAnyAddress() const
{return GetAddress();}
ProtoAddressList& GetAddressList()
{return addr_list;}
bool SetName(const char* theName);
const char* GetName() const
{return name_ptr;}
void ClearName();
bool AddAddress(const ProtoAddress& theAddress);
bool RemoveAddress(const ProtoAddress& theAddress);
bool Contains(const ProtoAddress& theAddress) const
{return addr_list.Contains(theAddress);}
const ProtoAddress& GetDefaultAddress() const
{return default_addr_item.GetAddress();}
Node& GetNode() const
{return *node;}
const Node* GetNodePtr() const
{return node;}
bool ChangeNode(Node& theNode);
bool HasLinkTo(const Interface& dstIface) const
{return ProtoGraph::Vertice::HasEdgeTo(dstIface);}
Link* GetLinkTo(const Interface& dstIface) const
{return static_cast<Link*>(ProtoGraph::Vertice::GetEdgeTo(dstIface));}
class SimpleList : public Vertice::SimpleList
{
public:
SimpleList(ItemPool* itemPool = NULL);
virtual ~SimpleList();
Interface* GetHead() const
{return static_cast<Interface*>(Vertice::SimpleList::GetHead());}
Interface* RemoveHead()
{return static_cast<Interface*>(Vertice::SimpleList::RemoveHead());}
class Iterator : public Vertice::SimpleList::Iterator
{
public:
Iterator(const SimpleList& theList);
virtual ~Iterator();
Interface* GetNextInterface()
{return static_cast<Interface*>(GetNextVertice());}
};
};
class SortedList : public Vertice::SortedList
{
public:
SortedList(ItemPool* itemPool = NULL);
virtual ~SortedList();
Interface* FindInterface(const ProtoAddress& addr) const
{return static_cast<Interface*>(FindVertice(addr.GetRawHostAddress(), addr.GetLength() << 3));}
Interface* GetHead() const
{return static_cast<Interface*>(Vertice::SortedList::GetHead());}
Interface* RemoveHead()
{return static_cast<Interface*>(Vertice::SortedList::RemoveHead());}
class Iterator : public Vertice::SortedList::Iterator
{
public:
Iterator(SortedList& theList);
virtual ~Iterator();
Interface* GetNextInterface()
{return static_cast<Interface*>(GetNextVertice());}
};
};
class PriorityQueue : public Vertice::SortedList
{
public:
class ItemFactory;
PriorityQueue(ItemFactory& itemFactory);
virtual ~PriorityQueue();
bool Insert(Interface& iface, const Cost& cost);
void Remove(Interface& iface)
{SortedList::Remove(iface);}
Interface* RemoveHead()
{return static_cast<Interface*>(SortedList::RemoveHead());}
bool IsEmpty() const
{return iface_list.IsEmpty();}
Interface* GetHead() const
{return static_cast<Interface*>(SortedList::GetHead());}
const Cost* GetCost(const Interface& iface) const
{
Item* item = static_cast<Item*>(GetQueueState(iface));
return ((NULL != item) ? &(item->GetCost()) : NULL);
}
void TransferInterface(Interface& iface, PriorityQueue& dstQueue)
{SortedList::TransferVertice(iface, dstQueue);}
void TransferItem(Item& item, PriorityQueue& dstQueue)
{SortedList::TransferItem(item, dstQueue);}
Interface* GetNextHop(const Interface& iface) const
{
Item* item = static_cast<Item*>(GetQueueState(iface));
return ((NULL != item) ? item->GetNextHop() : NULL);
}
Link* GetNextHopLink(const Interface& iface) const
{
Item* item = static_cast<Item*>(GetQueueState(iface));
return ((NULL != item) ? item->GetNextHopLink() : NULL);
}
Interface* GetPrevHop(const Interface& iface) const
{
Item* item = static_cast<Item*>(GetQueueState(iface));
return ((NULL != item) ? item->GetPrevHop() : NULL);
}
void SetRouteInfo(Interface& iface, Link* nextHopLink, Interface* prevHop)
{
Item* item = static_cast<Item*>(GetQueueState(iface));
ASSERT(NULL != item);
item->SetNextHopLink(nextHopLink);
item->SetPrevHop(prevHop);
}
void Adjust(Interface& iface, const Cost& newCost);
bool AdjustDownward(Interface& iface, const Cost& newCost,const Interface* newPrevHop = NULL);
bool AdjustUpward(Interface& iface, const Cost& newCost);
bool Append(Interface& iface);
class Item : public SortedList::Item
{
public:
virtual ~Item();
virtual const Cost& GetCost() const = 0;
virtual void SetCost(const Cost& cost) = 0;
const char* GetKey() const
{return GetCost().GetCostKey();}
unsigned int GetKeysize() const
{return GetCost().GetCostKeysize();}
virtual ProtoTree::Endian GetEndian() const
{return GetCost().GetCostKeyEndian();}
virtual bool UseSignBit() const
{return GetCost().GetCostKeySigned();}
virtual bool UseComplement2() const
{return GetCost().GetCostKeyComplement2();}
Interface* GetInterface() const
{return static_cast<Interface*>(GetVertice());}
void SetPrevHop(Interface* prevHop)
{prev_hop = prevHop;}
Interface* GetPrevHop() const
{return prev_hop;}
void SetNextHopLink(Link* nextHopLink)
{next_hop_link = nextHopLink;}
Link* GetNextHopLink() const
{return next_hop_link;}
Interface* GetNextHop() const
{return ((NULL != next_hop_link) ? next_hop_link->GetDst() : NULL);}
protected:
Item();
virtual Cost& AccessCost() = 0;
private:
Interface* prev_hop; Link* next_hop_link;
};
class ItemFactory
{
public:
virtual ~ItemFactory();
void Destroy()
{item_pool.Destroy();}
Item* GetItem();
void PutItem(Item& item)
{item_pool.PutItem(item);}
protected:
ItemFactory();
virtual Item* CreateItem() const = 0;
SortedList::ItemPool item_pool;
};
class Iterator : public SortedList::Iterator
{
public:
Iterator(PriorityQueue& priorityQueue);
virtual ~Iterator();
Interface* GetNextInterface()
{return static_cast<Interface*>(SortedList::Iterator::GetNextVertice());}
Item* GetNextItem()
{return static_cast<Item*>(SortedList::Iterator::GetNextItem());}
};
protected:
ProtoSortedTree iface_list; ItemFactory& item_factory;
private:
using Vertice::SortedList::Remove;
};
protected:
virtual const char* GetVerticeKey() const;
virtual unsigned int GetVerticeKeysize() const;
private:
virtual const char* GetKey() const
{return GetVerticeKey();}
virtual unsigned int GetKeysize() const
{return GetVerticeKeysize();}
Node* node;
NetGraph* graph;
ProtoAddressList addr_list;
ProtoAddressList::Item default_addr_item;
char* name_ptr;
};
class Node
{
public:
Node();
virtual ~Node();
void Consume(Node& foodNode);
Interface* FindInterface(const ProtoAddress& addr) const;
Interface* FindInterfaceByName(const char* theName);
Interface* FindInterfaceByString(const char* theString);
bool AddInterface(Interface& iface, bool makeDefault = false);
void RemoveInterface(Interface& iface);
bool AppendInterface(Interface& iface, bool makeDefault = false)
{return AddInterface(iface, makeDefault);}
bool Contains(const Interface& iface) const
{return (iface.GetNodePtr() == this);}
Interface* GetAnyInterface() const
{return static_cast<Interface*>(iface_list.GetRoot());}
Interface* GetDefaultInterface() const
{return static_cast<Interface*>(default_interface_ptr);}
bool IsSymmetricNeighbor(Node& node);
class InterfaceIterator : public ProtoSortedTree::Iterator
{
public:
InterfaceIterator(Node& theNode);
virtual ~InterfaceIterator();
bool HasEmptyList()
{return HasEmptyTree();}
void Reset()
{ProtoSortedTree::Iterator::Reset();}
Interface* GetNextInterface()
{return static_cast<Interface*>(GetNextItem());}
};
friend class InterfaceIterator;
friend class NetGraph::Interface;
class NeighborIterator
{
public:
NeighborIterator(Node& theNode);
virtual ~NeighborIterator();
void Reset();
Interface* GetNextNeighborInterface();
Link* GetNextNeighborLink();
private:
InterfaceIterator iface_iterator;
AdjacencyIterator adj_iterator;
};
protected:
ProtoSortedTree iface_list;
ProtoAddressList extra_addr_list;
private:
bool AddExtraInterfaceAddress(const Interface& iface,const ProtoAddress& addr)
{return extra_addr_list.Insert(addr, &iface);}
void RemoveExtraInterfaceAddress(const ProtoAddress& addr)
{extra_addr_list.Remove(addr);}
bool SetDefaultInterface(Interface& iface);
Interface* default_interface_ptr;
};
bool InsertNode(Node& node, Interface* iface = NULL); bool InsertInterface(Interface& iface); void RemoveNode(Node& node, Interface* iface = NULL);
void RemoveInterface(Interface& iface);
Interface* FindInterface(const ProtoAddress& addr) const
{return ((Interface*)addr_list.GetUserData(addr));}
Node* FindNode(const ProtoAddress& theAddress)
{
Interface* iface = FindInterface(theAddress);
return ((NULL != iface) ? &iface->GetNode() : NULL);
}
Interface* FindInterfaceByName(const char *theName);
Interface* FindInterfaceByString(const char *theString);
Node* FindNodeByName(const char *theName)
{
Interface* iface = FindInterfaceByName(theName);
return ((NULL != iface) ? &iface->GetNode() : NULL);
}
Node* FindNodeByString(const char* theString)
{
Interface* iface = FindInterfaceByString(theString);
return ((NULL != iface) ? &iface->GetNode() : NULL);
}
class InterfaceIterator : public ProtoGraph::VerticeIterator
{
public:
InterfaceIterator(NetGraph& theGraph);
virtual ~InterfaceIterator();
Interface* GetNextInterface()
{return static_cast<Interface*>(GetNextVertice());}
};
class SimpleTraversal : protected ProtoGraph::SimpleTraversal
{
public:
SimpleTraversal(const NetGraph& theGraph,
Interface& startIface,
bool traverseNodes = true,
bool collapseNodes = true,
bool depthFirst = false);
virtual ~SimpleTraversal();
bool Reset()
{return Reset(false);}
Interface* GetNextInterface(unsigned int* level = NULL);
protected:
virtual bool AllowLink(const Interface& srcIface, const Interface& dstIface, Link* link)
{return true;}
bool Reset(bool constructor);
bool traverse_nodes; bool collapse_nodes;
};
class DijkstraTraversal : public Interface::PriorityQueue::ItemFactory
{
public:
virtual ~DijkstraTraversal();
void TraverseNodes(bool traverse);
bool Reset(Interface* startIface = NULL);
Interface* GetNextInterface();
bool PrevHopIsValid(Interface& currentIface);
void Update(Interface& startIface);
void Update(Interface& ifaceA, Interface& ifaceB);
virtual bool AllowLink(const Interface& srcIface, const Link& link)
{return true;}
Interface* GetNextHop(const Interface& dstIface) {return (queue_visited.GetNextHop(dstIface));}
Interface* GetPrevHop(const Interface& dstIface) {return (queue_visited.GetPrevHop(dstIface));}
const Cost* GetCost(const Interface& dstIface) const
{return (queue_visited.GetCost(dstIface));}
bool TreeWalkReset();
Interface* TreeWalkNext(unsigned int* level = NULL);
protected:
DijkstraTraversal(NetGraph& theGraph,
Interface* startIface);
DijkstraTraversal(NetGraph& theGraph,
Node& startNode,
Interface* startIface = NULL);
virtual Cost& AccessCostTemp() = 0;
NetGraph& manet_graph;
Interface* start_iface;
Interface::PriorityQueue queue_pending;
Interface::PriorityQueue queue_visited;
Interface* trans_iface;
unsigned int current_level;
bool dijkstra_completed;
bool in_update;
bool traverse_nodes;
bool reset_required;
};
template <class COST_TYPE, class IFACE_TYPE = Interface>
class LinkTemplate : public Link
{
public:
LinkTemplate() {}
virtual ~LinkTemplate() {}
const COST_TYPE& GetCost() const
{return cost;}
void SetCost(COST_TYPE& theCost)
{cost = theCost;}
IFACE_TYPE* GetSrc() const
{return static_cast<IFACE_TYPE*>(Edge::GetSrc());}
IFACE_TYPE* GetDst() const
{return static_cast<IFACE_TYPE*>(Edge::GetDst());}
private:
virtual Cost& AccessCost()
{return static_cast<Cost&>(cost);}
COST_TYPE cost;
};
template <class COST_TYPE, class MY_TYPE, class LINK_TYPE = Link, class NODE_TYPE = Node>
class InterfaceTemplate : public Interface
{
public:
InterfaceTemplate(NODE_TYPE& theNode, const ProtoAddress& addr) : Interface(theNode, addr) {}
InterfaceTemplate(NODE_TYPE& theNode) : Interface(theNode) {}
virtual ~InterfaceTemplate() {}
LINK_TYPE* GetLinkTo(const InterfaceTemplate& dst) const
{return static_cast<LINK_TYPE*>(Interface::GetLinkTo(dst));}
NODE_TYPE& GetNode() const
{return static_cast<NODE_TYPE&>(Interface::GetNode());}
const NODE_TYPE* GetNodePtr() const
{return static_cast<NODE_TYPE&>(Interface::GetNodePtr());}
const COST_TYPE* GetCostTo(const InterfaceTemplate& dst) const
{
LINK_TYPE* link = GetLinkTo(dst);
return (NULL != link) ? static_cast<const COST_TYPE*>(&(link->GetCost())) : (COST_TYPE*)NULL;
}
static MY_TYPE* GetSrc(Link& theLink)
{return static_cast<MY_TYPE*>(theLink.GetSrc());}
static MY_TYPE* GetDst(Link& theLink)
{return static_cast<MY_TYPE*>(theLink.GetDst());}
class SimpleList : public NetGraph::Interface::SimpleList
{
public:
SimpleList(ItemPool* itemPool = NULL) : NetGraph::Interface::SimpleList(itemPool) {}
virtual ~SimpleList() {}
MY_TYPE* GetHead() const
{return static_cast<MY_TYPE*>(NetGraph::Interface::SimpleList::GetHead());}
MY_TYPE* RemoveHead()
{return static_cast<MY_TYPE*>(NetGraph::Interface::SimpleList::RemoveHead());}
class Iterator : public NetGraph::Interface::SimpleList::Iterator
{
public:
Iterator(const SimpleList& theList) : NetGraph::Interface::SimpleList::Iterator(theList) {}
virtual ~Iterator() {}
MY_TYPE* GetNextInterface()
{return static_cast<MY_TYPE*>(NetGraph::Interface::SimpleList::Iterator::GetNextInterface());}
};
};
class SortedList : public NetGraph::Interface::SortedList
{
public:
SortedList(ItemPool* itemPool = NULL) : NetGraph::Interface::SortedList(itemPool) {}
virtual ~SortedList() {}
MY_TYPE* FindInterface(const ProtoAddress& addr) const
{return static_cast<MY_TYPE*>(FindVertice(addr.GetRawHostAddress(), addr.GetLength() << 3));}
MY_TYPE* FindInterfaceByName(const char* name)
{return static_cast<MY_TYPE*>(FindVertice(name,(strlen(name) & 0x01) ? (strlen(name) << 3) : ((strlen(name)+1) << 3)));}
MY_TYPE* GetHead() const
{return static_cast<MY_TYPE*>(Vertice::SortedList::GetHead());}
MY_TYPE* RemoveHead()
{return static_cast<MY_TYPE*>(Vertice::SortedList::RemoveHead());}
class Iterator : public NetGraph::Interface::SortedList::Iterator
{
public:
Iterator(SortedList& theList) : NetGraph::Interface::SortedList::Iterator(theList) {}
virtual ~Iterator() {}
MY_TYPE* GetNextInterface()
{return static_cast<MY_TYPE*>(NetGraph::Interface::SortedList::Iterator::GetNextInterface());}
};
};
class PriorityQueue : public NetGraph::Interface::PriorityQueue
{
public:
PriorityQueue() : NetGraph::Interface::PriorityQueue(builtin_item_factory) {}
PriorityQueue(ItemFactory& itemFactory) : NetGraph::Interface::PriorityQueue(itemFactory) {}
virtual ~PriorityQueue() {}
class Item : public NetGraph::Interface::PriorityQueue::Item
{
public:
Item() {}
virtual ~Item() {}
const Cost& GetCost() const
{return static_cast<const Cost&>(cost);}
void SetCost(const Cost& theCost)
{cost = static_cast<const COST_TYPE&>(theCost);}
private:
virtual Cost& AccessCost()
{return static_cast<Cost&>(cost);}
COST_TYPE cost;
};
class ItemFactory : public NetGraph::Interface::PriorityQueue::ItemFactory
{
public:
ItemFactory() {}
virtual ~ItemFactory() {}
protected:
NetGraph::Interface::PriorityQueue::Item* CreateItem() const
{return static_cast<NetGraph::Interface::PriorityQueue:: Item*>(new Item);}
};
private:
ItemFactory builtin_item_factory;
};
};
template <class COST_TYPE, class NODE_TYPE = NetGraph::Node>
class DefaultInterfaceTemplate : public InterfaceTemplate<COST_TYPE, NODE_TYPE, DefaultInterfaceTemplate<COST_TYPE> >
{
public:
DefaultInterfaceTemplate(NODE_TYPE& theNode, const ProtoAddress& addr)
: InterfaceTemplate<COST_TYPE, NODE_TYPE, DefaultInterfaceTemplate>(theNode, addr) {}
virtual ~DefaultInterfaceTemplate() {}
};
template <class IFACE_TYPE = Interface, class LINK_TYPE = Link>
class NodeTemplate : public Node
{
public:
NodeTemplate() {}
virtual ~NodeTemplate() {}
IFACE_TYPE* FindInterface(const ProtoAddress& addr) const
{return static_cast<IFACE_TYPE*>(NetGraph::Node::FindInterface(addr));}
IFACE_TYPE* FindInterfaceByName(const char* theName)
{return static_cast<IFACE_TYPE*>(NetGraph::Node::FindInterfaceByName(theName));}
IFACE_TYPE* GetDefaultInterface() const
{return static_cast<IFACE_TYPE*>(NetGraph::Node::GetDefaultInterface());}
class InterfaceIterator : public NetGraph::Node::InterfaceIterator
{
public:
InterfaceIterator(Node& node) : NetGraph::Node::InterfaceIterator(node) {}
virtual ~InterfaceIterator() {}
IFACE_TYPE* GetNextInterface()
{return static_cast<IFACE_TYPE*>(NetGraph::Node::InterfaceIterator::GetNextInterface());}
}; class NeighborIterator : public NetGraph::Node::NeighborIterator
{
public:
NeighborIterator(Node& node) : NetGraph::Node::NeighborIterator(node) {}
virtual ~NeighborIterator() {}
IFACE_TYPE* GetNextNeighborInterface()
{return static_cast<IFACE_TYPE*>(NetGraph::Node::NeighborIterator::GetNextNeighborInterface());}
LINK_TYPE* GetNextNeighborLink()
{return static_cast<LINK_TYPE*>(NetGraph::Node::NeighborIterator::GetNextNeighborLink());}
};
};
protected:
NetGraph();
bool AddInterfaceAddress(const Interface& iface, const ProtoAddress& addr)
{return addr_list.Insert(addr, &iface);}
void RemoveInterfaceAddress(const ProtoAddress& addr)
{addr_list.Remove(addr);}
void SuspendInterface(Interface& iface)
{vertice_list.Remove(iface);}
bool ResumeInterface(Interface& iface)
{return vertice_list.Insert(iface);}
Link* Connect(Interface& srcIface, Interface& dstIface, const Cost& cost);
bool Connect(Interface& srcIface, Interface& dstIface, const Cost& cost, bool duplex);
Link* Reconnect(Interface& srcIface, Interface& dstIface, const Cost& cost);
bool Reconnect(Interface& srcIface, Interface& dstIface, const Cost& cost, bool duplex);
private:
ProtoAddressList addr_list;
};
template <class COST_TYPE = NetGraph::SimpleCostDouble,
class IFACE_TYPE = NetGraph::DefaultInterfaceTemplate<COST_TYPE>,
class LINK_TYPE = NetGraph::LinkTemplate<COST_TYPE, IFACE_TYPE>,
class NODE_TYPE = NetGraph::NodeTemplate<IFACE_TYPE> >
class NetGraphTemplate : public NetGraph
{
public:
NetGraphTemplate() {}
virtual ~NetGraphTemplate() {}
typedef COST_TYPE Cost;
typedef IFACE_TYPE Interface;
typedef LINK_TYPE Link;
typedef NODE_TYPE Node;
NODE_TYPE* FindNode(const ProtoAddress& theAddress)
{return static_cast<NODE_TYPE*>(NetGraph::FindNode(theAddress));}
IFACE_TYPE* FindInterface(const ProtoAddress& addr) const
{return static_cast<IFACE_TYPE*>(NetGraph::FindInterface(addr));}
IFACE_TYPE* FindInterfaceByName(const char* name)
{return static_cast<IFACE_TYPE*>(NetGraph::FindInterfaceByName(name));}
IFACE_TYPE* FindInterfaceByString(const char* theString)
{return static_cast<IFACE_TYPE*>(NetGraph::FindInterfaceByString(theString));}
LINK_TYPE* Connect(IFACE_TYPE& srcIface, IFACE_TYPE& dstIface, const COST_TYPE& cost)
{return static_cast<LINK_TYPE*>(NetGraph::Connect(srcIface, dstIface, cost));}
bool Connect(IFACE_TYPE& srcIface, IFACE_TYPE& dstIface, const COST_TYPE& cost, bool duplex)
{return NetGraph::Connect(srcIface, dstIface, cost, duplex);}
LINK_TYPE* Reconnect(Interface& srcIface, Interface& dstIface, const Cost& cost)
{return static_cast<LINK_TYPE*>(NetGraph::Reconnect(srcIface, dstIface, cost));}
bool Reconnect(IFACE_TYPE& srcIface, IFACE_TYPE& dstIface, const COST_TYPE& cost, bool duplex)
{return NetGraph::Reconnect(srcIface, dstIface, cost, duplex);}
LINK_TYPE* GetLink(IFACE_TYPE& srcIface, IFACE_TYPE& dstIface)
{return static_cast<LINK_TYPE*>(srcIface.GetLinkTo(dstIface));}
class AdjacencyIterator : public NetGraph::AdjacencyIterator
{
public:
AdjacencyIterator(IFACE_TYPE& iface) : NetGraph::AdjacencyIterator(iface) {}
virtual ~AdjacencyIterator() {}
IFACE_TYPE* GetNextAdjacency()
{return static_cast<IFACE_TYPE*>(NetGraph::AdjacencyIterator::GetNextAdjacency());}
LINK_TYPE* GetNextAdjacencyLink()
{return static_cast<LINK_TYPE*>(NetGraph::AdjacencyIterator::GetNextAdjacencyLink());}
IFACE_TYPE* GetNextConnector()
{return static_cast<IFACE_TYPE*>(NetGraph::AdjacencyIterator::GetNextConnector());}
};
class InterfaceIterator : public NetGraph::InterfaceIterator
{
public:
InterfaceIterator(NetGraphTemplate& theGraph) : NetGraph::InterfaceIterator(theGraph) {}
virtual ~InterfaceIterator() {}
IFACE_TYPE* GetNextInterface()
{return static_cast<IFACE_TYPE*>(NetGraph::InterfaceIterator::GetNextVertice());}
};
class SimpleTraversal : public NetGraph::SimpleTraversal
{
public:
SimpleTraversal(const NetGraphTemplate& theGraph,
IFACE_TYPE& startIface,
bool traverseNodes = true,
bool collapseNodes = true,
bool depthFirst = false)
: NetGraph::SimpleTraversal(theGraph, startIface, traverseNodes, collapseNodes, depthFirst) {}
virtual ~SimpleTraversal() {}
IFACE_TYPE* GetNextInterface(unsigned int* level = NULL)
{return static_cast<IFACE_TYPE*>(NetGraph::SimpleTraversal::GetNextInterface(level));}
};
class DijkstraTraversal : public NetGraph::DijkstraTraversal
{
public:
DijkstraTraversal(NetGraphTemplate& theGraph,
Node& startNode,
IFACE_TYPE* startIface = NULL)
: NetGraph::DijkstraTraversal(theGraph, startNode, startIface)
{
Reset();
}
virtual ~DijkstraTraversal() {}
IFACE_TYPE* GetNextInterface()
{return static_cast<IFACE_TYPE*>(NetGraph::DijkstraTraversal::GetNextInterface());}
const COST_TYPE* GetCost(const IFACE_TYPE& iface) const
{return static_cast<const COST_TYPE*>(NetGraph::DijkstraTraversal::GetCost(iface));}
IFACE_TYPE* GetNextHop(const IFACE_TYPE& dstIface) {return static_cast<IFACE_TYPE*>(queue_visited.GetNextHop(dstIface));}
IFACE_TYPE* GetPrevHop(const IFACE_TYPE& dstIface) {return static_cast<IFACE_TYPE*>(queue_visited.GetPrevHop(dstIface));}
IFACE_TYPE* TreeWalkNext(unsigned int* level = NULL)
{return static_cast<IFACE_TYPE*>(NetGraph::DijkstraTraversal::TreeWalkNext(level));}
protected:
Cost& AccessCostTemp()
{return static_cast<Cost&>(cost_temp);}
NetGraph::Interface::PriorityQueue::Item* CreateItem() const
{return static_cast<NetGraph::Interface::PriorityQueue::Item*>(new typename IFACE_TYPE::PriorityQueue::Item);}
COST_TYPE cost_temp;
};
protected:
virtual Edge* CreateEdge() const
{return static_cast<Edge*>(new LINK_TYPE);}
};
class ManetInterface; class ManetNode;
class ManetLink : public NetGraph::LinkTemplate<NetGraph::SimpleCostDouble, ManetInterface> {};
class ManetInterface : public NetGraph::InterfaceTemplate<NetGraph::SimpleCostDouble, ManetInterface, ManetLink, ManetNode>
{
public:
ManetInterface(ManetNode& theNode, const ProtoAddress& addr)
: NetGraph::InterfaceTemplate<NetGraph::SimpleCostDouble, ManetInterface, ManetLink, ManetNode>(theNode, addr) {}
ManetInterface(ManetNode& theNode)
: NetGraph::InterfaceTemplate<NetGraph::SimpleCostDouble, ManetInterface, ManetLink, ManetNode>(theNode) {}
};
class ManetNode : public NetGraph::NodeTemplate<ManetInterface> {};
class ManetGraph : public NetGraphTemplate<NetGraph::SimpleCostDouble, ManetInterface, ManetLink, ManetNode> {};
#endif