00001
00002
00003
00004
00005
00006
00007 #ifndef __RLOOKUP_H__
00008 #define __RLOOKUP_H__
00009
00010 #include "routealgo/rnode.h"
00011 #include "routealgo/rbitmap.h"
00012
00013 #include <iostream>
00014 #ifdef USE_HASH_MAP
00015 #include <hash_map>
00016 #include <hash_set>
00017 #else
00018 #include <map>
00019 #include <set>
00020 #endif
00021
00022 typedef enum {
00023 RL_NULL, RL_FIXED, RL_BITMAP, RL_HASH, RL_NEXTHOP, RL_LAST}
00024 RLookup_Types;
00025
00026 typedef pair<nodeid_t, nodeid_t> LookupPair_t;
00027
00028
00029 class RLookup {
00030 public :
00031 RLookup();
00032 virtual ~RLookup();
00033 virtual RLookup_Types WhatType() const = 0;
00034 virtual void Populate(
00035 RoutingVec_t& r,
00036 RoutingVec_t& p,
00037 nodeid_t d = NODE_NONE,
00038 nodeid_t o = NODE_NONE,
00039 nodeid_t f = NODE_NONE,
00040 nodeid_t l = NODE_NONE)
00041 = 0;
00042 virtual void Populate(istream& is);
00043 virtual nodeid_t Lookup(nodeid_t) = 0;
00044 virtual size_t Size() = 0;
00045 virtual size_t NumberEntries(){return 0;}
00046 virtual void Log( ostream&);
00047 static void Analyze(RoutingVec_t&,
00048 RoutingVec_t&,
00049 nodeid_t&, nodeid_t&, nodeid_t, nodeid_t&,nodeid_t&);
00050
00051 };
00052
00053
00054
00055
00056 class NOLookup : public RLookup {
00057 public :
00058 NOLookup();
00059 virtual ~NOLookup();
00060 virtual RLookup_Types WhatType() const;
00061 virtual void Populate(
00062 RoutingVec_t& r,
00063 RoutingVec_t& p,
00064 nodeid_t d = NODE_NONE,
00065 nodeid_t o = NODE_NONE,
00066 nodeid_t f = NODE_NONE,
00067 nodeid_t l = NODE_NONE);
00068 virtual nodeid_t Lookup(nodeid_t);
00069 virtual size_t Size();
00070 virtual void Log( ostream&);
00071 };
00072
00073
00074
00075 class FRLookup : public RLookup {
00076 public :
00077 FRLookup();
00078 virtual ~FRLookup();
00079 nodeid_t Default() const { return m_Default;}
00080 virtual RLookup_Types WhatType() const;
00081 virtual void Populate(
00082 RoutingVec_t& r,
00083 RoutingVec_t& p,
00084 nodeid_t d = NODE_NONE,
00085 nodeid_t o = NODE_NONE,
00086 nodeid_t f = NODE_NONE,
00087 nodeid_t l = NODE_NONE);
00088 virtual nodeid_t Lookup(nodeid_t);
00089 virtual size_t Size();
00090 virtual void Log( ostream&);
00091 static size_t EstimateSize(
00092 RoutingVec_t& r,
00093 RoutingVec_t& p,
00094 nodeid_t d,
00095 nodeid_t n,
00096 nodeid_t o,
00097 nodeid_t f,
00098 nodeid_t l);
00099
00100 private:
00101 nodeid_t m_Default;
00102 };
00103
00104
00105
00106 class BMLookup : public RLookup {
00107 public :
00108 BMLookup();
00109 virtual ~BMLookup();
00110 virtual RLookup_Types WhatType() const;
00111 virtual void Populate(
00112 RoutingVec_t& r,
00113 RoutingVec_t& p,
00114 nodeid_t d = NODE_NONE,
00115 nodeid_t o = NODE_NONE,
00116 nodeid_t f = NODE_NONE,
00117 nodeid_t l = NODE_NONE);
00118 virtual nodeid_t Lookup(nodeid_t);
00119 virtual size_t Size();
00120 virtual size_t NumberEntries();
00121 virtual void Log( ostream&);
00122 static size_t EstimateSize(
00123 RoutingVec_t& r,
00124 RoutingVec_t& p,
00125 nodeid_t d,
00126 nodeid_t n,
00127 nodeid_t o,
00128 nodeid_t f,
00129 nodeid_t l);
00130
00131 private:
00132 nodeid_t m_Default;
00133 nodeid_t m_FirstNonDefault;
00134 nodeid_t m_LastNonDefault;
00135 RoutingVec_t m_NVec;
00136 BitMap* m_pBitMap;
00137 };
00138
00139
00140
00141
00142
00143 #ifdef USE_HASH_MAP
00144 typedef hash_map<nodeid_t, nodeid_t,
00145 hash<nodeid_t>, equal_to<nodeid_t> > RouteMap_t;
00146 #else
00147 typedef map<nodeid_t, nodeid_t, equal_to<nodeid_t> > RouteMap_t;
00148 #endif
00149
00150 typedef RouteMap_t::iterator RouteMap_it;
00151 typedef RouteMap_t::value_type RoutePair_t;
00152
00153 class HMLookup : public RLookup {
00154 public :
00155 HMLookup();
00156 virtual ~HMLookup();
00157 virtual RLookup_Types WhatType() const;
00158 virtual void Populate(
00159 RoutingVec_t& r,
00160 RoutingVec_t& p,
00161 nodeid_t d = NODE_NONE,
00162 nodeid_t o = NODE_NONE,
00163 nodeid_t f = NODE_NONE,
00164 nodeid_t l = NODE_NONE);
00165 virtual nodeid_t Lookup(nodeid_t);
00166 virtual size_t Size();
00167 virtual size_t NumberEntries();
00168 virtual void Log( ostream&);
00169 static size_t EstimateSize(
00170 RoutingVec_t& r,
00171 RoutingVec_t& p,
00172 nodeid_t d,
00173 nodeid_t n,
00174 nodeid_t o,
00175 nodeid_t f,
00176 nodeid_t l);
00177
00178 private:
00179 nodeid_t m_Default;
00180 RouteMap_t m_RouteMap;
00181 };
00182
00183
00184
00185 class NHLookup : public RLookup {
00186 public :
00187 NHLookup();
00188 virtual ~NHLookup();
00189 virtual RLookup_Types WhatType() const;
00190 virtual void Populate(
00191 RoutingVec_t& r,
00192 RoutingVec_t& p,
00193 nodeid_t d = NODE_NONE,
00194 nodeid_t o = NODE_NONE,
00195 nodeid_t f = NODE_NONE,
00196 nodeid_t l = NODE_NONE);
00197 virtual void Populate(istream& is);
00198 virtual nodeid_t Lookup(nodeid_t);
00199 virtual size_t Size();
00200 virtual size_t NumberEntries();
00201 virtual void Log( ostream&);
00202 static size_t EstimateSize(
00203 RoutingVec_t& r,
00204 RoutingVec_t& p,
00205 nodeid_t d,
00206 nodeid_t n,
00207 nodeid_t o,
00208 nodeid_t f,
00209 nodeid_t l);
00210 private:
00211 RoutingVec_t m_RouteTable;
00212 };
00213
00214
00215
00216 #endif