/* Web Polygraph http://www.web-polygraph.org/ * (C) 2003-2006 The Measurement Factory * Licensed under the Apache License, Version 2.0 */ #ifndef POLYGRAPH__RUNTIME_ADDRMAPITEMS_H #define POLYGRAPH__RUNTIME_ADDRMAPITEMS_H #include "xstd/Array.h" #include "xstd/NetAddr.h" class AddrMapSym; class AddrMap; // base class for all address map items class AddrMapItem { public: AddrMapItem(const NetAddr &aName); virtual ~AddrMapItem() {} virtual int addrCount() const = 0; virtual const NetAddr &addrAt(int addrIdx) const = 0; const NetAddr &name() const { return theName; } virtual const NetAddr &selectAddr() const = 0; protected: NetAddr theName; }; // name->name mapping (useful for "no-op" maps) class Name2NameMapItem: public AddrMapItem { public: Name2NameMapItem(const NetAddr &aName); virtual int addrCount() const { return 1; } virtual const NetAddr &addrAt(int) const { return name(); } virtual const NetAddr &selectAddr() const { return name(); } }; // name->addr mapping (useful for simple 1:1 maps) class Name2AddrMapItem: public AddrMapItem { public: Name2AddrMapItem(const NetAddr &aName, const NetAddr &addr); virtual int addrCount() const { return 1; } virtual const NetAddr &addrAt(int) const { return theAddr; } virtual const NetAddr &selectAddr() const { return theAddr; } protected: NetAddr theAddr; }; // name->addrs mapping (useful for 1:N maps) class Name2AddrsMapItem: public AddrMapItem { public: Name2AddrsMapItem(const NetAddr &aName, const Array &anAddrs); virtual ~Name2AddrsMapItem(); virtual int addrCount() const { return theAddrs.count(); } virtual const NetAddr &addrAt(int addrIdx) const { return *theAddrs[addrIdx]; } virtual const NetAddr &selectAddr() const; protected: Array theAddrs; }; #endif