forest-net
an overlay networks for large-scale virtual worlds
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator
ComtreeTable.h
Go to the documentation of this file.
1 
9 #ifndef COMTREETABLE_H
10 #define COMTREETABLE_H
11 
12 #include <set>
13 #include "Forest.h"
14 #include "Dlist.h"
15 #include "Hash.h"
16 #include "HashMap.h"
17 #include "LinkTable.h"
18 
19 using namespace grafalgo;
20 
21 namespace forest {
22 
23 
36 class ComtreeTable {
37 public:
39  struct ClnkInfo {
40  public:
41  ClnkInfo();
42  ~ClnkInfo();
43  string toString() const;
44  friend ostream& operator<<(ostream& out, const ClnkInfo& cli) {
45  return out << cli.toString();
46  }
47 
49  int qnum;
51  };
52 
54  struct Entry {
55  public:
56  Entry();
57  ~Entry();
58  Entry& operator=(const Entry&);
59  Entry& operator=(Entry&&);
60  string toString() const;
61  friend ostream& operator<<(ostream& out, const Entry& e) {
62  return out << e.toString();
63  }
64 
65  int pLnk;
66  int pClnk;
67  bool coreFlag;
68 
69  HashMap<int,ClnkInfo,Hash::s32> *clMap;
71  Dlist *rtrLinks;
72  Dlist *coreLinks;
73  };
74 
75  ComtreeTable(int, int);
76  ~ComtreeTable();
77 
78  // predicates
79  bool validComtree(comt_t) const;
80  bool validCtx(int) const;
81  bool validClnk(int, int) const;
82  bool checkEntry(int) const;
83  bool inCore(int) const;
84  bool isLink(int, int) const;
85  bool isRtrLink(int, int) const;
86  bool isCoreLink(int, int) const;
87 
88  // iteration methods
89  int firstComt() const;
90  int nextComt(int) const;
91  int firstComtLink(int) const;
92  int nextComtLink(int, int) const;
93  int firstRtrLink(int) const;
94  int nextRtrLink(int, int) const;
95  int firstCoreLink(int) const;
96  int nextCoreLink(int, int) const;
97 
98  // access routines
99  int getComtIndex(comt_t) const;
100  Entry& getEntry(int) const;
101  comt_t getComtree(int) const;
102  int getLink(int, int) const;
103  int getPlink(int) const;
104  int getPClink(int) const;
105  int getLinkCount(int) const;
106  int getClnkNum(int, int) const;
107  ClnkInfo& getClnkInfo(int, int) const;
108  int getLinkQ(int, int) const;
109  fAdr_t getDest(int, int) const;
110  RateSpec& getRates(int, int) const;
111  const Dlist& getComtList(int) const;
112 
113  // add/remove/modify table entries
114  int addEntry(comt_t);
115  bool removeEntry(int);
116  bool addLink(int, int, bool, bool);
117  bool removeLink(int, int);
118  void setCoreFlag(int, bool);
119  void setPlink(int, int);
120  void setLinkQ(int, int, int);
121  void purgeLink(int);
122 
123  // input/output of table contents
124  bool read(istream&);
125  string toString() const;
126  string entry2string(int) const;
127 private:
128  int maxLnk;
129  int maxCtx;
130  HashMap<comt_t,Entry,Hash::u32> *comtMap;
132  Dlist *comtList;
133 
136  bool readEntry(istream&);
137  void readLinks(istream&, set<int>&);
138  string links2string(int) const;
139 };
140 
142 inline ComtreeTable::ClnkInfo::ClnkInfo() {
143  dest = 0; qnum = 0;
144 }
145 
147 inline ComtreeTable::ClnkInfo::~ClnkInfo() { }
148 
153 inline string ComtreeTable::ClnkInfo::toString() const {
154  string s = Forest::fAdr2string(dest) + " "
155  + to_string(qnum) + " " + rates.toString();
156  return s;
157 }
158 
160 inline ComtreeTable::Entry::Entry() {
161  pLnk = 0; pClnk = 0; coreFlag = false;
162  clMap = new HashMap<int,ClnkInfo,Hash::s32>;
163  rtrLinks = new Dlist(); coreLinks = new Dlist();
164 }
165 
167 inline ComtreeTable::Entry::~Entry() {
168  delete clMap; delete rtrLinks; delete coreLinks;
169 }
170 
175 inline ComtreeTable::Entry& ComtreeTable::Entry::operator=(const Entry& src) {
176  pLnk = src.pLnk; pClnk = src.pClnk; coreFlag = src.coreFlag;
177  *clMap = *(src.clMap);
178  *rtrLinks = *(src.rtrLinks);
179  *coreLinks = *(src.coreLinks);
180  return *this;
181 }
182 
187 inline ComtreeTable::Entry& ComtreeTable::Entry::operator=(Entry&& src) {
188  pLnk = src.pLnk; pClnk = src.pClnk; coreFlag = src.coreFlag;
189  delete clMap; clMap = src.clMap; src.clMap = nullptr;
190  delete rtrLinks; rtrLinks = src.rtrLinks; src.rtrLinks = nullptr;
191  delete coreLinks; coreLinks = src.coreLinks; src.coreLinks = nullptr;
192  return *this;
193 }
194 
200 inline string ComtreeTable::Entry::toString() const {
201  string s = (coreFlag ? "* " : " ") + to_string(pLnk) + " {";
202  for (int cLnk = clMap->first(); cLnk != 0; cLnk = clMap->next(cLnk)) {
203  if (cLnk != clMap->first()) s += " ";
204  s += to_string(clMap->getKey(cLnk));
205  if (coreLinks->member(cLnk)) s += "*";
206  else if (rtrLinks->member(cLnk)) s += "+";
207  }
208  s += "}";
209  return s;
210 }
211 
216 inline bool ComtreeTable::validComtree(comt_t comt) const {
217  return comtMap->contains(comt);
218 }
219 
224 inline bool ComtreeTable::validCtx(int ctx) const {
225  return comtMap->valid(ctx);
226 }
227 
234 inline bool ComtreeTable::validClnk(int ctx, int cLnk) const {
235  Entry& e = getEntry(ctx);
236  return e.clMap->valid(cLnk);
237 }
238 
243 inline bool ComtreeTable::inCore(int ctx) const {
244  Entry& e = getEntry(ctx); return e.coreFlag;
245 }
246 
252 inline bool ComtreeTable::isLink(int ctx, int lnk) const {
253  if (!validCtx(ctx)) return false;
254  Entry& e = getEntry(ctx);
255  return e.clMap->contains(lnk);
256 }
257 
263 inline bool ComtreeTable::isRtrLink(int ctx, int cLnk) const {
264  if (cLnk == 0 || !validCtx(ctx)) return false;
265  Entry& e = getEntry(ctx);
266  return e.rtrLinks->member(cLnk);
267 }
268 
274 inline bool ComtreeTable::isCoreLink(int ctx, int cLnk) const {
275  if (!validCtx(ctx)) return false;
276  Entry& e = getEntry(ctx);
277  return e.coreLinks->member(cLnk);
278 }
279 
286 inline int ComtreeTable::firstComt() const {
287  return comtMap->first();
288 }
289 
297 inline int ComtreeTable::nextComt(int ctx) const {
298  return comtMap->next(ctx);
299 }
300 
305 inline comt_t ComtreeTable::getComtree(int ctx) const {
306  return comtMap->getKey(ctx);
307 }
308 
313 inline ComtreeTable::Entry& ComtreeTable::getEntry(int ctx) const {
314  return comtMap->getValue(ctx);
315 }
316 
321 inline int ComtreeTable::getComtIndex(comt_t comt) const {
322  return comtMap->find(comt);
323 }
324 
329 inline int ComtreeTable::getLinkCount(int ctx) const {
330  Entry& e = getEntry(ctx);
331  return e.clMap->size();
332 }
333 
340 inline int ComtreeTable::getClnkNum(int comt, int lnk) const {
341  int ctx = getComtIndex(comt);
342  if (ctx == 0) return 0;
343  Entry& e = getEntry(ctx);
344  return e.clMap->find(lnk);
345 }
346 
353 ComtreeTable::getClnkInfo(int ctx, int cLnk) const {
354  Entry& e = getEntry(ctx);
355  return e.clMap->getValue(cLnk);
356 }
357 
363 inline int ComtreeTable::getPlink(int ctx) const { return getEntry(ctx).pLnk; }
364 
371 inline int ComtreeTable::getPClink(int ctx) const {
372  return getEntry(ctx).pClnk;
373 }
374 
380 inline int ComtreeTable::getLink(int ctx, int cLnk) const {
381  Entry& e = getEntry(ctx);
382  return e.clMap->getKey(cLnk);
383 }
384 
390 inline int ComtreeTable::getLinkQ(int ctx, int cLnk) const {
391  return getEntry(ctx).clMap->getValue(cLnk).qnum;
392 }
393 
400 inline fAdr_t ComtreeTable::getDest(int ctx, int cLnk) const {
401  return getEntry(ctx).clMap->getValue(cLnk).dest;
402 }
403 
409 inline RateSpec& ComtreeTable::getRates(int ctx, int cLnk) const {
410  return getEntry(ctx).clMap->getValue(cLnk).rates;
411 }
412 
425 inline int ComtreeTable::firstComtLink(int ctx) const {
426  return getEntry(ctx).clMap->first();
427 }
428 
434 inline int ComtreeTable::nextComtLink(int ctx, int cLnk) const {
435  return getEntry(ctx).clMap->next(cLnk);
436 }
437 
442 inline int ComtreeTable::firstRtrLink(int ctx) const {
443  return getEntry(ctx).rtrLinks->first();
444 }
445 
451 inline int ComtreeTable::nextRtrLink(int ctx, int cLnk) const {
452  return getEntry(ctx).rtrLinks->next(cLnk);
453 }
454 
459 inline int ComtreeTable::firstCoreLink(int ctx) const {
460  return getEntry(ctx).coreLinks->first();
461 }
462 
468 inline int ComtreeTable::nextCoreLink(int ctx, int cLnk) const {
469  return getEntry(ctx).coreLinks->next(cLnk);
470 }
471 
477 inline void ComtreeTable::setPlink(int ctx, int plink) {
478  if (!validCtx(ctx)) return;
479  Entry& e = getEntry(ctx);
480  if (plink == 0) { e.pLnk = 0; e.pClnk = 0; return; }
481  int cLnk = e.clMap->find(plink);
482  if (cLnk == 0 || !e.rtrLinks->member(cLnk)) return;
483  e.pLnk = plink; e.pClnk = cLnk;
484 }
485 
490 inline void ComtreeTable::setCoreFlag(int ctx, bool f) {
491  if (validCtx(ctx)) getEntry(ctx).coreFlag = f;
492 }
493 
499 inline void ComtreeTable::setLinkQ(int ctx, int cLnk, int q) {
500  if (!validCtx(ctx)) return;
501  Entry& e = getEntry(ctx);
502  if (validClnk(ctx,cLnk)) e.clMap->getValue(cLnk).qnum = q;
503 }
504 
505 } // ends namespace
506 
507 #endif