blob: ab6a2394426cd1799cf4fad2aa1e0f83ca7b3070 [file] [log] [blame]
Alexander Afanasyevad3757f2012-04-17 10:27:59 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2012 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
21
22#ifndef BOOST_GRAPH_CCNX_GLOBAL_ROUTING_HELPER_H
23#define BOOST_GRAPH_CCNX_GLOBAL_ROUTING_HELPER_H
24
Alexander Afanasyev6315ef72012-06-01 20:56:31 -070025/// @cond include_hidden
26
Alexander Afanasyevad3757f2012-04-17 10:27:59 -070027#include <boost/graph/graph_traits.hpp>
28#include <boost/graph/properties.hpp>
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -070029#include <boost/ref.hpp>
Alexander Afanasyevad3757f2012-04-17 10:27:59 -070030
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -070031#include "ns3/ccnx-face.h"
Alexander Afanasyevad3757f2012-04-17 10:27:59 -070032#include "ns3/node-list.h"
33#include "ns3/channel-list.h"
34#include "../model/ccnx-global-router.h"
35#include <list>
36#include <map>
37
38namespace boost
39{
40
41class CcnxGlobalRouterGraph
42{
43public:
44 typedef ns3::Ptr< ns3::CcnxGlobalRouter > Vertice;
45 typedef uint16_t edge_property_type;
46 typedef uint32_t vertex_property_type;
47
48 CcnxGlobalRouterGraph ()
49 {
50 for (ns3::NodeList::Iterator node = ns3::NodeList::Begin (); node != ns3::NodeList::End (); node++)
51 {
52 ns3::Ptr<ns3::CcnxGlobalRouter> gr = (*node)->GetObject<ns3::CcnxGlobalRouter> ();
53 if (gr != 0)
54 m_vertices.push_back (gr);
55 }
56
57 for (ns3::ChannelList::Iterator channel = ns3::ChannelList::Begin (); channel != ns3::ChannelList::End (); channel++)
58 {
59 ns3::Ptr<ns3::CcnxGlobalRouter> gr = (*channel)->GetObject<ns3::CcnxGlobalRouter> ();
60 if (gr != 0)
61 m_vertices.push_back (gr);
62 }
63 }
64
65 const std::list< Vertice > &
66 GetVertices () const
67 {
68 return m_vertices;
69 }
70
71public:
72 std::list< Vertice > m_vertices;
73};
74
75
76class ccnx_global_router_graph_category :
77 public virtual vertex_list_graph_tag,
78 public virtual incidence_graph_tag
79{
80};
81
82
83template<>
84struct graph_traits< CcnxGlobalRouterGraph >
85{
86 // Graph concept
87 typedef CcnxGlobalRouterGraph::Vertice vertex_descriptor;
88 typedef ns3::CcnxGlobalRouter::Incidency edge_descriptor;
89 typedef directed_tag directed_category;
90 typedef disallow_parallel_edge_tag edge_parallel_category;
91 typedef ccnx_global_router_graph_category traversal_category;
92
93 // VertexList concept
94 typedef std::list< vertex_descriptor >::const_iterator vertex_iterator;
95 typedef size_t vertices_size_type;
96
97 // AdjacencyGraph concept
98 typedef ns3::CcnxGlobalRouter::IncidencyList::iterator out_edge_iterator;
99 typedef size_t degree_size_type;
100
101 // typedef size_t edges_size_type;
102};
103
104} // namespace boost
105
106namespace boost
107{
108
109inline
110graph_traits< CcnxGlobalRouterGraph >::vertex_descriptor
111source(
112 graph_traits< CcnxGlobalRouterGraph >::edge_descriptor e,
113 const CcnxGlobalRouterGraph& g)
114{
115 return e.get<0> ();
116}
117
118inline
119graph_traits< CcnxGlobalRouterGraph >::vertex_descriptor
120target(
121 graph_traits< CcnxGlobalRouterGraph >::edge_descriptor e,
122 const CcnxGlobalRouterGraph& g)
123{
124 return e.get<2> ();
125}
126
127inline
128std::pair< graph_traits< CcnxGlobalRouterGraph >::vertex_iterator,
129 graph_traits< CcnxGlobalRouterGraph >::vertex_iterator >
130vertices (const CcnxGlobalRouterGraph&g)
131{
132 return make_pair (g.GetVertices ().begin (), g.GetVertices ().end ());
133}
134
135inline
136graph_traits< CcnxGlobalRouterGraph >::vertices_size_type
137num_vertices(const CcnxGlobalRouterGraph &g)
138{
139 return g.GetVertices ().size ();
140}
141
142
143inline
144std::pair< graph_traits< CcnxGlobalRouterGraph >::out_edge_iterator,
145 graph_traits< CcnxGlobalRouterGraph >::out_edge_iterator >
146out_edges(
147 graph_traits< CcnxGlobalRouterGraph >::vertex_descriptor u,
148 const CcnxGlobalRouterGraph& g)
149{
150 return std::make_pair(u->GetIncidencies ().begin (),
151 u->GetIncidencies ().end ());
152}
153
154inline
155graph_traits< CcnxGlobalRouterGraph >::degree_size_type
156out_degree(
157 graph_traits< CcnxGlobalRouterGraph >::vertex_descriptor u,
158 const CcnxGlobalRouterGraph& g)
159{
160 return u->GetIncidencies ().size ();
161}
162
163
164//////////////////////////////////////////////////////////////
165// Property maps
166
167struct EdgeWeights
168{
169 EdgeWeights (const CcnxGlobalRouterGraph &graph)
170 : m_graph (graph)
171 {
172 }
173
174private:
175 const CcnxGlobalRouterGraph &m_graph;
176};
177
178
179struct VertexIds
180{
181 VertexIds (const CcnxGlobalRouterGraph &graph)
182 : m_graph (graph)
183 {
184 }
185
186private:
187 const CcnxGlobalRouterGraph &m_graph;
188};
189
190template<>
191struct property_map< CcnxGlobalRouterGraph, edge_weight_t >
192{
193 typedef const EdgeWeights const_type;
194 typedef EdgeWeights type;
195};
196
197template<>
198struct property_map< CcnxGlobalRouterGraph, vertex_index_t >
199{
200 typedef const VertexIds const_type;
201 typedef VertexIds type;
202};
203
204
205template<>
206struct property_traits< EdgeWeights >
207{
208 // Metric property map
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700209 typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint16_t > value_type;
210 typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint16_t > reference;
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700211 typedef ns3::CcnxGlobalRouter::Incidency key_type;
212 typedef readable_property_map_tag category;
213};
214
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700215const property_traits< EdgeWeights >::value_type WeightZero (0, 0);
216const property_traits< EdgeWeights >::value_type WeightInf (0, std::numeric_limits<uint16_t>::max ());
217
218struct WeightCompare :
219 public std::binary_function<property_traits< EdgeWeights >::reference,
220 property_traits< EdgeWeights >::reference,
221 bool>
222{
223 bool
224 operator () (property_traits< EdgeWeights >::reference a,
225 property_traits< EdgeWeights >::reference b) const
226 {
227 return a.get<1> () < b.get<1> ();
228 }
229
230 bool
231 operator () (property_traits< EdgeWeights >::reference a,
232 uint32_t b) const
233 {
234 return a.get<1> () < b;
235 }
236
237 bool
238 operator () (uint32_t a,
239 uint32_t b) const
240 {
241 return a < b;
242 }
243
244};
245
246struct WeightCombine :
247 public std::binary_function<uint32_t,
248 property_traits< EdgeWeights >::reference,
249 uint32_t>
250{
251 uint32_t
252 operator () (uint32_t a, property_traits< EdgeWeights >::reference b) const
253 {
254 return a + b.get<1> ();
255 }
256
257 tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t >
258 operator () (tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > a,
259 property_traits< EdgeWeights >::reference b) const
260 {
261 if (a.get<0> () == 0)
262 return make_tuple (b.get<0> (), a.get<1> () + b.get<1> ());
263 else
264 return make_tuple (a.get<0> (), a.get<1> () + b.get<1> ());
265 }
266};
267
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700268template<>
269struct property_traits< VertexIds >
270{
271 // Metric property map
272 typedef uint32_t value_type;
273 typedef uint32_t reference;
274 typedef ns3::Ptr< ns3::CcnxGlobalRouter > key_type;
275 typedef readable_property_map_tag category;
276};
277
278
279inline EdgeWeights
280get(edge_weight_t,
281 const CcnxGlobalRouterGraph &g)
282{
283 return EdgeWeights (g);
284}
285
286
287inline VertexIds
288get(vertex_index_t,
289 const CcnxGlobalRouterGraph &g)
290{
291 return VertexIds (g);
292}
293
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700294template<class M, class K, class V>
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700295inline void
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700296put (reference_wrapper< M > mapp,
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700297 K a, V p)
298{
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700299 mapp.get ()[a] = p;
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700300}
301
302// void
303// put (cref< std::map< ns3::Ptr<ns3::CcnxGlobalRouter>, ns3::Ptr<ns3::CcnxGlobalRouter> > > map,
304
305uint32_t
306get (const boost::VertexIds&, ns3::Ptr<ns3::CcnxGlobalRouter> &gr)
307{
308 return gr->GetId ();
309}
310
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700311inline property_traits< EdgeWeights >::reference
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700312get(const boost::EdgeWeights&, ns3::CcnxGlobalRouter::Incidency &edge)
313{
314 if (edge.get<1> () == 0)
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700315 return property_traits< EdgeWeights >::reference (0, 0);
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700316 else
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700317 return property_traits< EdgeWeights >::reference (edge.get<1> (), edge.get<1> ()->GetMetric ());
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700318}
319
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700320struct PredecessorsMap :
321 public std::map< ns3::Ptr< ns3::CcnxGlobalRouter >, ns3::Ptr< ns3::CcnxGlobalRouter > >
322{
323};
324
325template<>
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700326struct property_traits< reference_wrapper<PredecessorsMap> >
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700327{
328 // Metric property map
329 typedef ns3::Ptr< ns3::CcnxGlobalRouter > value_type;
330 typedef ns3::Ptr< ns3::CcnxGlobalRouter > reference;
331 typedef ns3::Ptr< ns3::CcnxGlobalRouter > key_type;
332 typedef read_write_property_map_tag category;
333};
334
335
336struct DistancesMap :
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700337 public std::map< ns3::Ptr< ns3::CcnxGlobalRouter >, tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > >
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700338{
339};
340
341template<>
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700342struct property_traits< reference_wrapper<DistancesMap> >
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700343{
344 // Metric property map
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700345 typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > value_type;
346 typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > reference;
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700347 typedef ns3::Ptr< ns3::CcnxGlobalRouter > key_type;
348 typedef read_write_property_map_tag category;
349};
350
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700351inline tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t >
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700352get (DistancesMap &map, ns3::Ptr<ns3::CcnxGlobalRouter> key)
353{
354 boost::DistancesMap::iterator i = map.find (key);
355 if (i == map.end ())
Alexander Afanasyeva5abcd92012-04-17 13:34:43 -0700356 return tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > (0, std::numeric_limits<uint32_t>::max ());
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700357 else
358 return i->second;
359}
360
361} // namespace boost
362
Alexander Afanasyev6315ef72012-06-01 20:56:31 -0700363/// @endcond
364
Alexander Afanasyevad3757f2012-04-17 10:27:59 -0700365#endif // BOOST_GRAPH_CCNX_GLOBAL_ROUTING_HELPER_H