/* Web Polygraph http://www.web-polygraph.org/ * (C) 2003-2006 The Measurement Factory * Licensed under the Apache License, Version 2.0 */ #ifndef POLYGRAPH__RUNTIME_ADDRMAP_H #define POLYGRAPH__RUNTIME_ADDRMAP_H #include "xstd/Array.h" class NetAddr; class AddrMapSym; class AddrMap; class AddrMapItem; // addr iterator for the map below class AddrMapAddrIter { public: AddrMapAddrIter(const AddrMap &aMap, int aName); operator void *() const { return atEnd() ? 0 : (void*)-1; } AddrMapAddrIter &operator ++() { next(); return *this; } const NetAddr &addr(); const NetAddr &name(); protected: bool atEnd() const; void next() { ++theAddr; } protected: const AddrMap &theMap; int theName; int theAddr; }; // name -> address map // note that find() has to optimize the map if items were added // so calling add/query often run-time is not a good idea class AddrMap { public: typedef Array Addrs; public: AddrMap(); ~AddrMap(); void configure(const Array &maps); int nameCount() const; const NetAddr &nameAt(int nameIdx) const; // use iterator instead const NetAddr &addrAt(int nameIdx, int addrIdx) const; int addrCountAt(int nameIdx) const; bool has(const NetAddr &name) const; bool find(const NetAddr &name, int &idx) const; void add(const NetAddr &name); // name->name bool findAddr(const NetAddr &addr) const; const NetAddr &selectAddr(int nameIdx) const; AddrMapAddrIter addrIter(int nameIdx) const; AddrMapAddrIter addrIter(const NetAddr &name) const; protected: void config1to1(const NetAddr &name, const NetAddr &addr); void configRoundRobin(const Addrs &names, const Addrs &addrs); void configure1toN(const NetAddr &name, const Addrs &addrs); const AddrMapItem &itemAt(int nameIdx) const; protected: Array theMap; mutable bool isSorted; }; extern AddrMap *TheAddrMap; #endif