Changeset 59:41c7f9c09a12 in lemon-0.x for src/work/list_graph.hh
- Timestamp:
- 02/04/04 13:46:33 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@74
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/work/list_graph.hh
r46 r59 1 #ifndef MARCI_LIST_GRAPH_HH2 #define MARCI_LIST_GRAPH_HH1 #ifndef LIST_GRAPH_HH 2 #define LIST_GRAPH_HH 3 3 4 4 #include <iostream> 5 5 6 6 namespace marci { 7 8 template <typename It>9 int number_of(It _it) {10 int i=0;11 for( ; _it.valid(); ++_it) { ++i; }12 return i;13 }14 7 15 8 template <typename It> … … 21 14 22 15 class ListGraph { 16 23 17 class node_item; 24 18 class edge_item; 19 25 20 public: 21 26 22 class NodeIt; 27 23 class EachNodeIt; … … 31 27 class InEdgeIt; 32 28 class SymEdgeIt; 33 34 template <typename T> 29 template <typename ValueType> class NodeMap; 30 template <typename ValueType> class EdgeMap; 31 32 private: 33 34 template <typename ValueType> friend class NodeMap; 35 template <typename ValueType> friend class EdgeMap; 36 37 template <typename ValueType> 35 38 class NodeMap { 36 //typedef typename Graph::NodeIt NodeIt;37 //typedef typename Graph::EachNodeIt EachNodeIt;38 39 const ListGraph& G; 39 std::vector<T> container; 40 public: 41 NodeMap(const ListGraph& _G) : G(_G) { 42 int i=0; 43 for(EachNodeIt it=G.template first<EachNodeIt>(); it.valid(); ++it) ++i; 44 container.resize(i); 45 } 46 NodeMap(const ListGraph& _G, const T a) : G(_G) { 47 for(EachNodeIt it=G.template first<EachNodeIt>(); it.valid(); ++it) { 48 container.push_back(a); 49 } 50 } 51 void set(const NodeIt nit, const T a) { container[G.id(nit)]=a; } 52 T get(const NodeIt nit) const { return container[G.id(nit)]; } 53 }; 54 55 template <typename T> 40 std::vector<ValueType> container; 41 public: 42 NodeMap(const ListGraph& _G) : G(_G), container(_G.node_id) { } 43 NodeMap(const ListGraph& _G, const ValueType a) : 44 G(_G), container(_G.node_id, a) { } 45 void set(const NodeIt nit, const ValueType a) { container[G.id(nit)]=a; } 46 ValueType get(const NodeIt nit) const { return container[G.id(nit)]; } 47 }; 48 49 template <typename ValueType> 56 50 class EdgeMap { 57 //typedef typename Graph::EdgeIt EdgeIt;58 //typedef typename Graph::EachEdgeIt EachEdgeIt;59 51 const ListGraph& G; 60 std::vector<T> container; 61 public: 62 EdgeMap(const ListGraph& _G) : G(_G) { 63 int i=0; 64 for(EachEdgeIt it=G.template first<EachEdgeIt>(); it.valid(); ++it) ++i; 65 container.resize(i); 66 } 67 EdgeMap(const ListGraph& _G, const T a) : G(_G) { 68 for(EachEdgeIt it=G.template first<EachEdgeIt>(); it.valid(); ++it) { 69 container.push_back(a); 70 } 71 } 72 void set(const EdgeIt eit, const T a) { container[G.id(eit)]=a; } 73 T get(const EdgeIt eit) const { return container[G.id(eit)]; } 74 }; 75 76 //typedef template<typename T> NodePropertyVector<ListGraph, T> NodeMap; 77 //template <typename T> 78 //typedef NodePropertyVector<ListGraph, T> NodeMap; 79 //template <typename T> 80 //typedef typename NodePropertyVector<ListGraph, T> NodeMap; 81 //template <typename T> 82 //typedef NodePropertyVector<typename ListGraph, T> NodeMap; 83 //template <typename T> 84 //typedef typename NodePropertyVector<typename ListGraph, T> NodeMap; 85 //template <typename T> 86 //typedef template NodePropertyVector<ListGraph, T> NodeMap; 87 //template <typename T> 88 //typedef template typename NodePropertyVector<ListGraph, T> NodeMap; 89 //template <typename T> 90 //typedef template NodePropertyVector<typename ListGraph, T> NodeMap; 91 //template <typename T> 92 //typedef template typename NodePropertyVector<typename ListGraph, T> NodeMap; 93 //template <typename T> 94 //typedef EdgePropertyVector<ListGraph, T> EdgeMap; 95 96 private: 52 std::vector<ValueType> container; 53 public: 54 EdgeMap(const ListGraph& _G) : G(_G), container(_G.edge_id) { } 55 EdgeMap(const ListGraph& _G, const ValueType a) : 56 G(_G), container(_G.edge_id, a) { } 57 void set(const EdgeIt eit, const ValueType a) { container[G.id(eit)]=a; } 58 ValueType get(const EdgeIt eit) const { return container[G.id(eit)]; } 59 }; 60 97 61 int node_id; 98 62 int edge_id; … … 114 78 friend std::ostream& operator<<(std::ostream& os, const NodeIt& i); 115 79 friend std::ostream& operator<<(std::ostream& os, const EdgeIt& i); 116 ListGraph* G;80 //ListGraph* G; 117 81 int id; 118 82 edge_item* _first_out_edge; … … 136 100 friend class SymEdgeIt; 137 101 friend std::ostream& operator<<(std::ostream& os, const EdgeIt& i); 138 ListGraph* G;102 //ListGraph* G; 139 103 int id; 140 104 node_item* _tail; … … 257 221 /* functions to construct iterators from the graph, or from each other */ 258 222 259 EachNodeIt firstNode() const { return EachNodeIt(_first_node); } 260 EachEdgeIt firstEdge() const { 261 node_item* v=_first_node; 262 edge_item* edge=v->_first_out_edge; 263 while (v && !edge) { v=v->_next_node; if (v) edge=v->_first_out_edge; } 264 return EachEdgeIt(v, edge); 265 } 223 //EachNodeIt firstNode() const { return EachNodeIt(*this); } 224 //EachEdgeIt firstEdge() const { return EachEdgeIt(*this); } 266 225 267 226 //OutEdgeIt firstOutEdge(const NodeIt v) const { return OutEdgeIt(v); } 268 InEdgeIt firstInEdge(const NodeIt v) const { return InEdgeIt(v); }269 SymEdgeIt firstSymEdge(const NodeIt v) const { return SymEdgeIt(v); }227 //InEdgeIt firstInEdge(const NodeIt v) const { return InEdgeIt(v); } 228 //SymEdgeIt firstSymEdge(const NodeIt v) const { return SymEdgeIt(v); } 270 229 NodeIt tail(const EdgeIt e) const { return e.tailNode(); } 271 230 NodeIt head(const EdgeIt e) const { return e.headNode(); } … … 288 247 /* for experimental purpose */ 289 248 290 void getFirst(EachNodeIt& v) const { v=EachNodeIt( _first_node); }291 void getFirst(EachEdgeIt& e) const { e= firstEdge(); }249 void getFirst(EachNodeIt& v) const { v=EachNodeIt(*this); } 250 void getFirst(EachEdgeIt& e) const { e=EachEdgeIt(*this); } 292 251 void getFirst(OutEdgeIt& e, const NodeIt& v) const { e=OutEdgeIt(v); } 293 252 void getFirst(InEdgeIt& e, const NodeIt& v) const { e=InEdgeIt(v); } … … 387 346 class EachNodeIt : public NodeIt { 388 347 friend class ListGraph; 348 protected: 349 EachNodeIt(const ListGraph& G) : NodeIt(G._first_node) { } 389 350 public: 390 351 EachNodeIt() : NodeIt() { } 391 352 EachNodeIt(node_item* v) : NodeIt(v) { } 392 EachNodeIt(const ListGraph& G) : NodeIt(G._first_node) { }393 353 EachNodeIt& operator++() { node=node->_next_node; return *this; } 394 354 }; … … 423 383 class EachEdgeIt : public EdgeIt { 424 384 friend class ListGraph; 425 node_item* v; 426 public: 427 EachEdgeIt() : EdgeIt(), v(0) { } 428 EachEdgeIt(node_item* _v, edge_item* _e) : EdgeIt(_e), v(_v) { } 385 protected: 429 386 EachEdgeIt(const ListGraph& G) { 430 v=G._first_node;431 edge=v->_first_out_edge;387 node_item* v=G._first_node; 388 if (v) edge=v->_first_out_edge; else edge=0; 432 389 while (v && !edge) { v=v->_next_node; if (v) edge=v->_first_out_edge; } 433 390 } 391 public: 392 EachEdgeIt() : EdgeIt() { } 393 EachEdgeIt(edge_item* _e) : EdgeIt(_e) { } 434 394 EachEdgeIt& operator++() { 395 node_item* v=edge->_tail; 435 396 edge=edge->_next_out; 436 397 while (v && !edge) { v=v->_next_node; if (v) edge=v->_first_out_edge; } … … 442 403 friend class ListGraph; 443 404 node_item* v; 405 protected: 406 OutEdgeIt(const NodeIt& _v) : v(_v.node) { edge=v->_first_out_edge; } 444 407 public: 445 408 OutEdgeIt() : EdgeIt(), v(0) { } 446 protected:447 OutEdgeIt(const NodeIt& _v) : v(_v.node) { edge=v->_first_out_edge; }448 public:449 409 OutEdgeIt(const ListGraph& G, const NodeIt _v) : v(_v.node) { edge=v->_first_out_edge; } 450 410 OutEdgeIt& operator++() { edge=edge->_next_out; return *this; } … … 458 418 friend class ListGraph; 459 419 node_item* v; 420 protected: 421 InEdgeIt(const NodeIt& _v) : v(_v.node) { edge=v->_first_in_edge; } 460 422 public: 461 423 InEdgeIt() : EdgeIt(), v(0) { } 462 protected:463 InEdgeIt(const NodeIt& _v) : v(_v.node) {464 edge=v->_first_in_edge;465 }466 public:467 424 InEdgeIt(const ListGraph& G, const NodeIt _v) : v(_v.node) { edge=v->_first_in_edge; } 468 425 InEdgeIt& operator++() { edge=edge->_next_in; return *this; } … … 477 434 bool out_or_in; //1 iff out, 0 iff in 478 435 node_item* v; 479 public:480 SymEdgeIt() : EdgeIt(), v(0) { }481 436 protected: 482 437 SymEdgeIt(const NodeIt& _v) : v(_v.node) { … … 486 441 } 487 442 public: 443 SymEdgeIt() : EdgeIt(), v(0) { } 488 444 SymEdgeIt(const ListGraph& G, const NodeIt _v) : v(_v.node) { 489 445 out_or_in=1; … … 550 506 } //namespace marci 551 507 552 #endif // MARCI_LIST_GRAPH_HH508 #endif //LIST_GRAPH_HH
Note: See TracChangeset
for help on using the changeset viewer.