gravatar
deba@inf.elte.hu
deba@inf.elte.hu
New implementation of GRAPH_TYPEDEFS
0 3 0
default
3 files changed with 119 insertions and 14 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -21,73 +21,178 @@
21 21

	
22 22
#include <iterator>
23 23
#include <vector>
24 24
#include <map>
25 25
#include <cmath>
26 26
#include <algorithm>
27 27

	
28 28
#include <lemon/bits/invalid.h>
29 29
#include <lemon/bits/utility.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/bits/traits.h>
32 32

	
33 33
#include <lemon/bits/alteration_notifier.h>
34 34
#include <lemon/bits/default_map.h>
35 35

	
36 36
///\ingroup gutils
37 37
///\file
38 38
///\brief Graph utilities.
39 39

	
40 40
namespace lemon {
41 41

	
42 42
  /// \addtogroup gutils
43 43
  /// @{
44 44

	
45
  namespace _graph_utils_bits {
46
    template <typename Graph>
47
    struct Node { typedef typename Graph::Node type; };
48

	
49
    template <typename Graph>
50
    struct NodeIt { typedef typename Graph::NodeIt type; };
51

	
52
    template <typename Graph>
53
    struct Arc { typedef typename Graph::Arc type; };
54

	
55
    template <typename Graph>
56
    struct ArcIt { typedef typename Graph::ArcIt type; };
57

	
58
    template <typename Graph>
59
    struct Edge { typedef typename Graph::Edge type; };
60

	
61
    template <typename Graph>
62
    struct EdgeIt { typedef typename Graph::EdgeIt type; };
63

	
64
    template <typename Graph>
65
    struct OutArcIt { typedef typename Graph::OutArcIt type; };
66

	
67
    template <typename Graph>
68
    struct InArcIt { typedef typename Graph::InArcIt type; };
69

	
70
    template <typename Graph>
71
    struct IncEdgeIt { typedef typename Graph::IncEdgeIt type; };
72

	
73
    template <typename Graph>
74
    struct BoolNodeMap { 
75
      typedef typename Graph::template NodeMap<bool> type; 
76
    };
77

	
78
    template <typename Graph>
79
    struct IntNodeMap { 
80
      typedef typename Graph::template NodeMap<int> type; 
81
    };
82

	
83
    template <typename Graph>
84
    struct DoubleNodeMap { 
85
      typedef typename Graph::template NodeMap<double> type; 
86
    };
87

	
88
    template <typename Graph>
89
    struct BoolArcMap { 
90
      typedef typename Graph::template ArcMap<bool> type; 
91
    };
92

	
93
    template <typename Graph>
94
    struct IntArcMap { 
95
      typedef typename Graph::template ArcMap<int> type; 
96
    };
97

	
98
    template <typename Graph>
99
    struct DoubleArcMap { 
100
      typedef typename Graph::template ArcMap<double> type; 
101
    };
102

	
103
    template <typename Graph>
104
    struct BoolEdgeMap { 
105
      typedef typename Graph::template EdgeMap<bool> type; 
106
    };
107

	
108
    template <typename Graph>
109
    struct IntEdgeMap { 
110
      typedef typename Graph::template EdgeMap<int> type; 
111
    };
112

	
113
    template <typename Graph>
114
    struct DoubleEdgeMap { 
115
      typedef typename Graph::template EdgeMap<double> type; 
116
    };
117

	
118
    
119
  }
120

	
45 121
  ///Creates convenience typedefs for the digraph types and iterators
46 122

	
47 123
  ///This \c \#define creates convenience typedefs for the following types
48 124
  ///of \c Digraph: \c Node,  \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
49 125
  ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap, 
50 126
  ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap. 
51 127
#define DIGRAPH_TYPEDEFS(Digraph)					\
52
  typedef Digraph::Node Node;						\
53
  typedef Digraph::NodeIt NodeIt;					\
54
  typedef Digraph::Arc Arc;						\
55
  typedef Digraph::ArcIt ArcIt;						\
56
  typedef Digraph::InArcIt InArcIt;					\
57
  typedef Digraph::OutArcIt OutArcIt
128
  typedef typename ::lemon::_graph_utils_bits::				\
129
  Node<Digraph>::type Node;						\
130
  typedef typename ::lemon::_graph_utils_bits::				\
131
  NodeIt<Digraph>::type	NodeIt;						\
132
  typedef typename ::lemon::_graph_utils_bits::				\
133
  Arc<Digraph>::type Arc;						\
134
  typedef typename ::lemon::_graph_utils_bits::				\
135
  ArcIt<Digraph>::type ArcIt;						\
136
  typedef typename ::lemon::_graph_utils_bits::				\
137
  OutArcIt<Digraph>::type OutArcIt;					\
138
  typedef typename ::lemon::_graph_utils_bits::				\
139
  InArcIt<Digraph>::type InArcIt;					\
140
  typedef typename ::lemon::_graph_utils_bits::				\
141
  BoolNodeMap<Digraph>::type BoolNodeMap;				\
142
  typedef typename ::lemon::_graph_utils_bits::				\
143
  IntNodeMap<Digraph>::type IntNodeMap;					\
144
  typedef typename ::lemon::_graph_utils_bits::				\
145
  DoubleNodeMap<Digraph>::type DoubleNodeMap;				\
146
  typedef typename ::lemon::_graph_utils_bits::				\
147
  BoolArcMap<Digraph>::type BoolArcMap;					\
148
  typedef typename ::lemon::_graph_utils_bits::				\
149
  IntArcMap<Digraph>::type IntArcMap;					\
150
  typedef typename ::lemon::_graph_utils_bits::				\
151
  DoubleArcMap<Digraph>::type DoubleArcMap
152

	
58 153

	
59 154
  ///Creates convenience typedefs for the graph types and iterators
60 155

	
61 156
  ///This \c \#define creates the same convenience typedefs as defined
62 157
  ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
63 158
  ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
64 159
  ///\c DoubleEdgeMap.
65 160
#define GRAPH_TYPEDEFS(Graph)						\
66 161
  DIGRAPH_TYPEDEFS(Graph);						\
67
  typedef Graph::Edge Edge;						\
68
  typedef Graph::EdgeIt EdgeIt;						\
69
  typedef Graph::IncEdgeIt IncEdgeIt
162
  typedef typename ::lemon::_graph_utils_bits::				\
163
  Edge<Graph>::type Edge;						\
164
  typedef typename ::lemon::_graph_utils_bits::				\
165
  EdgeIt<Graph>::type EdgeIt;						\
166
  typedef typename ::lemon::_graph_utils_bits::				\
167
  IncEdgeIt<Graph>::type IncEdgeIt					\
168
  typedef typename ::lemon::_graph_utils_bits::				\
169
  BoolEdgeMap<Graph>::type BoolEdgeMap;					\
170
  typedef typename ::lemon::_graph_utils_bits::				\
171
  IntEdgeMap<Graph>::type IntEdgeMap;					\
172
  typedef typename ::lemon::_graph_utils_bits::				\
173
  DoubleEdgeMap<Graph>::type DoubleEdgeMap
174

	
70 175

	
71 176
  /// \brief Function to count the items in the graph.
72 177
  ///
73 178
  /// This function counts the items (nodes, arcs etc) in the graph.
74 179
  /// The complexity of the function is O(n) because
75 180
  /// it iterates on all of the items.
76 181
  template <typename Graph, typename Item>
77 182
  inline int countItems(const Graph& g) {
78 183
    typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
79 184
    int num = 0;
80 185
    for (ItemIt it(g); it != INVALID; ++it) {
81 186
      ++num;
82 187
    }
83 188
    return num;
84 189
  }
85 190

	
86 191
  // Node counting:
87 192

	
88 193
  namespace _graph_utils_bits {
89 194
    
90 195
    template <typename Graph, typename Enable = void>
91 196
    struct CountNodesSelector {
92 197
      static int count(const Graph &g) {
93 198
        return countItems<Graph, typename Graph::Node>(g);
... ...
@@ -2035,49 +2140,49 @@
2035 2140
  ///It is possible to find \e all parallel arcs between two nodes with
2036 2141
  ///the \c findFirst() and \c findNext() members.
2037 2142
  ///
2038 2143
  ///See the \ref ArcLookUp and \ref AllArcLookUp classes if your
2039 2144
  ///digraph is not changed so frequently.
2040 2145
  ///
2041 2146
  ///This class uses a self-adjusting binary search tree, Sleator's
2042 2147
  ///and Tarjan's Splay tree for guarantee the logarithmic amortized
2043 2148
  ///time bound for arc lookups. This class also guarantees the
2044 2149
  ///optimal time bound in a constant factor for any distribution of
2045 2150
  ///queries.
2046 2151
  ///
2047 2152
  ///\param G The type of the underlying digraph.  
2048 2153
  ///
2049 2154
  ///\sa ArcLookUp  
2050 2155
  ///\sa AllArcLookUp  
2051 2156
  template<class G>
2052 2157
  class DynArcLookUp 
2053 2158
    : protected ItemSetTraits<G, typename G::Arc>::ItemNotifier::ObserverBase
2054 2159
  {
2055 2160
  public:
2056 2161
    typedef typename ItemSetTraits<G, typename G::Arc>
2057 2162
    ::ItemNotifier::ObserverBase Parent;
2058 2163

	
2059
    DIGRAPH_TYPEDEFS(typename G);
2164
    DIGRAPH_TYPEDEFS(G);
2060 2165
    typedef G Digraph;
2061 2166

	
2062 2167
  protected:
2063 2168

	
2064 2169
    class AutoNodeMap : public DefaultMap<G, Node, Arc> {
2065 2170
    public:
2066 2171

	
2067 2172
      typedef DefaultMap<G, Node, Arc> Parent;
2068 2173

	
2069 2174
      AutoNodeMap(const G& digraph) : Parent(digraph, INVALID) {}
2070 2175
      
2071 2176
      virtual void add(const Node& node) {
2072 2177
	Parent::add(node);
2073 2178
	Parent::set(node, INVALID);
2074 2179
      }
2075 2180

	
2076 2181
      virtual void add(const std::vector<Node>& nodes) {
2077 2182
	Parent::add(nodes);
2078 2183
	for (int i = 0; i < int(nodes.size()); ++i) {
2079 2184
	  Parent::set(nodes[i], INVALID);
2080 2185
	}
2081 2186
      }
2082 2187

	
2083 2188
      virtual void build() {
... ...
@@ -2472,49 +2577,49 @@
2472 2577

	
2473 2578
  ///Fast arc look up between given endpoints.
2474 2579
  
2475 2580
  ///\ingroup gutils
2476 2581
  ///Using this class, you can find an arc in a digraph from a given
2477 2582
  ///source to a given target in time <em>O(log d)</em>,
2478 2583
  ///where <em>d</em> is the out-degree of the source node.
2479 2584
  ///
2480 2585
  ///It is not possible to find \e all parallel arcs between two nodes.
2481 2586
  ///Use \ref AllArcLookUp for this purpose.
2482 2587
  ///
2483 2588
  ///\warning This class is static, so you should refresh() (or at least
2484 2589
  ///refresh(Node)) this data structure
2485 2590
  ///whenever the digraph changes. This is a time consuming (superlinearly
2486 2591
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2487 2592
  ///
2488 2593
  ///\param G The type of the underlying digraph.
2489 2594
  ///
2490 2595
  ///\sa DynArcLookUp
2491 2596
  ///\sa AllArcLookUp  
2492 2597
  template<class G>
2493 2598
  class ArcLookUp 
2494 2599
  {
2495 2600
  public:
2496
    DIGRAPH_TYPEDEFS(typename G);
2601
    DIGRAPH_TYPEDEFS(G);
2497 2602
    typedef G Digraph;
2498 2603

	
2499 2604
  protected:
2500 2605
    const Digraph &_g;
2501 2606
    typename Digraph::template NodeMap<Arc> _head;
2502 2607
    typename Digraph::template ArcMap<Arc> _left;
2503 2608
    typename Digraph::template ArcMap<Arc> _right;
2504 2609
    
2505 2610
    class ArcLess {
2506 2611
      const Digraph &g;
2507 2612
    public:
2508 2613
      ArcLess(const Digraph &_g) : g(_g) {}
2509 2614
      bool operator()(Arc a,Arc b) const 
2510 2615
      {
2511 2616
	return g.target(a)<g.target(b);
2512 2617
      }
2513 2618
    };
2514 2619
    
2515 2620
  public:
2516 2621
    
2517 2622
    ///Constructor
2518 2623

	
2519 2624
    ///Constructor.
2520 2625
    ///
... ...
@@ -2589,49 +2694,49 @@
2589 2694

	
2590 2695
  ///Fast look up of all arcs between given endpoints.
2591 2696
  
2592 2697
  ///\ingroup gutils
2593 2698
  ///This class is the same as \ref ArcLookUp, with the addition
2594 2699
  ///that it makes it possible to find all arcs between given endpoints.
2595 2700
  ///
2596 2701
  ///\warning This class is static, so you should refresh() (or at least
2597 2702
  ///refresh(Node)) this data structure
2598 2703
  ///whenever the digraph changes. This is a time consuming (superlinearly
2599 2704
  ///proportional (<em>O(m</em>log<em>m)</em>) to the number of arcs).
2600 2705
  ///
2601 2706
  ///\param G The type of the underlying digraph.
2602 2707
  ///
2603 2708
  ///\sa DynArcLookUp
2604 2709
  ///\sa ArcLookUp  
2605 2710
  template<class G>
2606 2711
  class AllArcLookUp : public ArcLookUp<G>
2607 2712
  {
2608 2713
    using ArcLookUp<G>::_g;
2609 2714
    using ArcLookUp<G>::_right;
2610 2715
    using ArcLookUp<G>::_left;
2611 2716
    using ArcLookUp<G>::_head;
2612 2717

	
2613
    DIGRAPH_TYPEDEFS(typename G);
2718
    DIGRAPH_TYPEDEFS(G);
2614 2719
    typedef G Digraph;
2615 2720
    
2616 2721
    typename Digraph::template ArcMap<Arc> _next;
2617 2722
    
2618 2723
    Arc refreshNext(Arc head,Arc next=INVALID)
2619 2724
    {
2620 2725
      if(head==INVALID) return next;
2621 2726
      else {
2622 2727
	next=refreshNext(_right[head],next);
2623 2728
// 	_next[head]=next;
2624 2729
	_next[head]=( next!=INVALID && _g.target(next)==_g.target(head))
2625 2730
	  ? next : INVALID;
2626 2731
	return refreshNext(_left[head],head);
2627 2732
      }
2628 2733
    }
2629 2734
    
2630 2735
    void refreshNext()
2631 2736
    {
2632 2737
      for(NodeIt n(_g);n!=INVALID;++n) refreshNext(_head[n]);
2633 2738
    }
2634 2739
    
2635 2740
  public:
2636 2741
    ///Constructor
2637 2742

	
Ignore white space 6 line context
... ...
@@ -281,49 +281,49 @@
281 281
      if (!isIdentifierFirstChar(c))
282 282
	throw DataFormatError("Wrong char in identifier");
283 283
      
284 284
      os << c;
285 285
      
286 286
      while (is.get(c) && !isWhiteSpace(c)) {
287 287
	if (!isIdentifierChar(c)) 
288 288
	  throw DataFormatError("Wrong char in identifier");	  
289 289
	os << c;
290 290
      }
291 291
      if (!is) is.clear();
292 292
     
293 293
      str = os.str();
294 294
      return is;
295 295
    }
296 296
    
297 297
  }
298 298
  
299 299
  /// \e
300 300
  template <typename _Digraph>
301 301
  class DigraphReader {
302 302
  public:
303 303

	
304 304
    typedef _Digraph Digraph;
305
    DIGRAPH_TYPEDEFS(typename Digraph);
305
    DIGRAPH_TYPEDEFS(Digraph);
306 306
    
307 307
  private:
308 308

	
309 309

	
310 310
    std::istream* _is;
311 311
    bool local_is;
312 312

	
313 313
    Digraph& _digraph;
314 314

	
315 315
    std::string _nodes_caption;
316 316
    std::string _arcs_caption;
317 317
    std::string _attributes_caption;
318 318

	
319 319
    typedef std::map<std::string, Node> NodeIndex;
320 320
    NodeIndex _node_index;
321 321
    typedef std::map<std::string, Arc> ArcIndex;
322 322
    ArcIndex _arc_index;
323 323
    
324 324
    typedef std::vector<std::pair<std::string, 
325 325
      _reader_bits::MapStorageBase<Node>*> > NodeMaps;    
326 326
    NodeMaps _node_maps; 
327 327

	
328 328
    typedef std::vector<std::pair<std::string,
329 329
      _reader_bits::MapStorageBase<Arc>*> >ArcMaps;
Ignore white space 48 line context
... ...
@@ -216,49 +216,49 @@
216 216
    
217 217
    std::ostream& writeToken(std::ostream& os, const std::string& str) {
218 218

	
219 219
      if (requireEscape(str)) {
220 220
	os << '\"';
221 221
	for (std::string::const_iterator it = str.begin(); 
222 222
	     it != str.end(); ++it) {
223 223
	  writeEscape(os, *it);
224 224
	}	
225 225
	os << '\"';
226 226
      } else {
227 227
	os << str;
228 228
      }
229 229
      return os;
230 230
    }
231 231

	
232 232
  }
233 233
  
234 234
  /// \e
235 235
  template <typename _Digraph>
236 236
  class DigraphWriter {
237 237
  public:
238 238

	
239 239
    typedef _Digraph Digraph;
240
    DIGRAPH_TYPEDEFS(typename Digraph);
240
    DIGRAPH_TYPEDEFS(Digraph);
241 241
    
242 242
  private:
243 243

	
244 244

	
245 245
    std::ostream* _os;
246 246
    bool local_os;
247 247

	
248 248
    Digraph& _digraph;
249 249

	
250 250
    std::string _nodes_caption;
251 251
    std::string _arcs_caption;
252 252
    std::string _attributes_caption;
253 253
    
254 254
    typedef std::map<Node, std::string> NodeIndex;
255 255
    NodeIndex _node_index;
256 256
    typedef std::map<Arc, std::string> ArcIndex;
257 257
    ArcIndex _arc_index;
258 258

	
259 259
    typedef std::vector<std::pair<std::string, 
260 260
      _writer_bits::MapStorageBase<Node>* > > NodeMaps;    
261 261
    NodeMaps _node_maps; 
262 262

	
263 263
    typedef std::vector<std::pair<std::string, 
264 264
      _writer_bits::MapStorageBase<Arc>* > >ArcMaps;
0 comments (0 inline)