|         |      1 // -*- c++ -*- | 
|         |      2 #ifndef HUGO_GRAPH_WRAPPER_H | 
|         |      3 #define HUGO_GRAPH_WRAPPER_H | 
|         |      4  | 
|         |      5 #include <invalid.h> | 
|         |      6  | 
|         |      7 namespace hugo { | 
|         |      8  | 
|         |      9   template<typename Graph> | 
|         |     10   class TrivGraphWrapper { | 
|         |     11   protected: | 
|         |     12     Graph* graph; | 
|         |     13    | 
|         |     14   public: | 
|         |     15     typedef Graph BaseGraph; | 
|         |     16  | 
|         |     17     typedef typename Graph::Node Node; | 
|         |     18     class NodeIt : public Graph::NodeIt {  | 
|         |     19     public: | 
|         |     20       NodeIt() { } | 
|         |     21       NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { } | 
|         |     22       NodeIt(const Invalid& i) : Graph::NodeIt(i) { } | 
|         |     23       NodeIt(const TrivGraphWrapper<Graph>& _G) :  | 
|         |     24 	Graph::NodeIt(*(_G.graph)) { } | 
|         |     25     }; | 
|         |     26     typedef typename Graph::Edge Edge; | 
|         |     27     //typedef typename Graph::OutEdgeIt OutEdgeIt; | 
|         |     28     class OutEdgeIt : public Graph::OutEdgeIt {  | 
|         |     29     public: | 
|         |     30       OutEdgeIt() { } | 
|         |     31       OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { } | 
|         |     32       OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { } | 
|         |     33       OutEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) :  | 
|         |     34 	Graph::OutEdgeIt(*(_G.graph), n) { } | 
|         |     35     }; | 
|         |     36     //typedef typename Graph::InEdgeIt InEdgeIt; | 
|         |     37     class InEdgeIt : public Graph::InEdgeIt {  | 
|         |     38     public: | 
|         |     39       InEdgeIt() { } | 
|         |     40       InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { } | 
|         |     41       InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { } | 
|         |     42       InEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) :  | 
|         |     43 	Graph::InEdgeIt(*(_G.graph), n) { } | 
|         |     44     }; | 
|         |     45     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |     46     //typedef typename Graph::EdgeIt EdgeIt; | 
|         |     47     class EdgeIt : public Graph::EdgeIt {  | 
|         |     48     public: | 
|         |     49       EdgeIt() { } | 
|         |     50       EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { } | 
|         |     51       EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { } | 
|         |     52       EdgeIt(const TrivGraphWrapper<Graph>& _G) :  | 
|         |     53 	Graph::EdgeIt(*(_G.graph)) { } | 
|         |     54     }; | 
|         |     55  | 
|         |     56     //TrivGraphWrapper() : graph(0) { } | 
|         |     57     TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } | 
|         |     58  | 
|         |     59 //    void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |     60 //    Graph& getGraph() const { return (*graph); } | 
|         |     61  | 
|         |     62     NodeIt& first(NodeIt& i) const {  | 
|         |     63       i=NodeIt(*this); | 
|         |     64       return i; | 
|         |     65     } | 
|         |     66     EdgeIt& first(EdgeIt& i) const {  | 
|         |     67       i=EdgeIt(*this); | 
|         |     68       return i; | 
|         |     69     } | 
|         |     70 //     template<typename I> I& first(I& i) const {  | 
|         |     71 //       //return graph->first(i);  | 
|         |     72 //       i=I(*this); | 
|         |     73 //       return i; | 
|         |     74 //     } | 
|         |     75     OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {  | 
|         |     76       i=OutEdgeIt(*this, p); | 
|         |     77       return i; | 
|         |     78     } | 
|         |     79     InEdgeIt& first(InEdgeIt& i, const Node& p) const {  | 
|         |     80       i=InEdgeIt(*this, p); | 
|         |     81       return i; | 
|         |     82     } | 
|         |     83 //     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |     84 //       //return graph->first(i, p); | 
|         |     85 //       i=I(*this, p); | 
|         |     86 //       return i; | 
|         |     87 //     } | 
|         |     88      | 
|         |     89 //    template<typename I> I getNext(const I& i) const {  | 
|         |     90 //      return graph->getNext(i); } | 
|         |     91     template<typename I> I& next(I &i) const { graph->next(i); return i; }     | 
|         |     92  | 
|         |     93     template< typename It > It first() const {  | 
|         |     94       It e; first(e); return e; } | 
|         |     95  | 
|         |     96     template< typename It > It first(const Node& v) const {  | 
|         |     97       It e; first(e, v); return e; } | 
|         |     98  | 
|         |     99     Node head(const Edge& e) const { return graph->head(e); } | 
|         |    100     Node tail(const Edge& e) const { return graph->tail(e); } | 
|         |    101  | 
|         |    102     template<typename I> bool valid(const I& i) const  | 
|         |    103       { return graph->valid(i); } | 
|         |    104    | 
|         |    105     //template<typename I> void setInvalid(const I &i); | 
|         |    106     //{ return graph->setInvalid(i); } | 
|         |    107  | 
|         |    108     int nodeNum() const { return graph->nodeNum(); } | 
|         |    109     int edgeNum() const { return graph->edgeNum(); } | 
|         |    110    | 
|         |    111     template<typename I> Node aNode(const I& e) const {  | 
|         |    112       return graph->aNode(e); } | 
|         |    113     template<typename I> Node bNode(const I& e) const {  | 
|         |    114       return graph->bNode(e); } | 
|         |    115    | 
|         |    116     Node addNode() const { return graph->addNode(); } | 
|         |    117     Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |    118       return graph->addEdge(tail, head); } | 
|         |    119    | 
|         |    120     template<typename I> void erase(const I& i) const { graph->erase(i); } | 
|         |    121    | 
|         |    122     void clear() const { graph->clear(); } | 
|         |    123      | 
|         |    124     template<typename T> class NodeMap : public Graph::NodeMap<T> {  | 
|         |    125     public: | 
|         |    126       NodeMap(const TrivGraphWrapper<Graph>& _G) :   | 
|         |    127 	Graph::NodeMap<T>(*(_G.graph)) { } | 
|         |    128       NodeMap(const TrivGraphWrapper<Graph>& _G, T a) :  | 
|         |    129 	Graph::NodeMap<T>(*(_G.graph), a) { } | 
|         |    130     }; | 
|         |    131  | 
|         |    132     template<typename T> class EdgeMap : public Graph::EdgeMap<T> {  | 
|         |    133     public: | 
|         |    134       EdgeMap(const TrivGraphWrapper<Graph>& _G) :   | 
|         |    135 	Graph::EdgeMap<T>(*(_G.graph)) { } | 
|         |    136       EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) :  | 
|         |    137 	Graph::EdgeMap<T>(*(_G.graph), a) { } | 
|         |    138     }; | 
|         |    139  | 
|         |    140     template<typename Map, typename T> class NodeMapWrapper { | 
|         |    141     protected: | 
|         |    142       Map* map; | 
|         |    143     public: | 
|         |    144       NodeMapWrapper(Map& _map) : map(&_map) { } | 
|         |    145       //template<typename T>  | 
|         |    146       void set(Node n, T a) { map->set(n, a); } | 
|         |    147       //template<typename T> | 
|         |    148       T get(Node n) const { return map->get(n); } | 
|         |    149     }; | 
|         |    150  | 
|         |    151     template<typename Map, typename T> class EdgeMapWrapper { | 
|         |    152     protected: | 
|         |    153       Map* map; | 
|         |    154     public: | 
|         |    155       EdgeMapWrapper(Map& _map) : map(&_map) { } | 
|         |    156       //template<typename T>  | 
|         |    157       void set(Edge n, T a) { map->set(n, a); } | 
|         |    158       //template<typename T> | 
|         |    159       T get(Edge n) const { return map->get(n); } | 
|         |    160     }; | 
|         |    161   }; | 
|         |    162  | 
|         |    163   template<typename GraphWrapper> | 
|         |    164   class GraphWrapperSkeleton { | 
|         |    165   protected: | 
|         |    166     GraphWrapper gw; | 
|         |    167    | 
|         |    168   public: | 
|         |    169     //typedef typename GraphWrapper::BaseGraph BaseGraph; | 
|         |    170  | 
|         |    171 //     typedef typename GraphWrapper::Node Node; | 
|         |    172 //     typedef typename GraphWrapper::NodeIt NodeIt; | 
|         |    173  | 
|         |    174 //     typedef typename GraphWrapper::Edge Edge; | 
|         |    175 //     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; | 
|         |    176 //     typedef typename GraphWrapper::InEdgeIt InEdgeIt; | 
|         |    177 //     //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; | 
|         |    178 //     typedef typename GraphWrapper::EdgeIt EdgeIt; | 
|         |    179  | 
|         |    180     typedef typename GraphWrapper::Node Node; | 
|         |    181     class NodeIt : public GraphWrapper::NodeIt {  | 
|         |    182     public: | 
|         |    183       NodeIt() { } | 
|         |    184       NodeIt(const typename GraphWrapper::NodeIt& n) :  | 
|         |    185 	GraphWrapper::NodeIt(n) { } | 
|         |    186       NodeIt(const Invalid& i) : GraphWrapper::NodeIt(i) { } | 
|         |    187       NodeIt(const GraphWrapperSkeleton<GraphWrapper>& _G) :  | 
|         |    188 	GraphWrapper::NodeIt(_G.gw) { } | 
|         |    189     }; | 
|         |    190     typedef typename GraphWrapper::Edge Edge; | 
|         |    191     //typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; | 
|         |    192     class OutEdgeIt : public GraphWrapper::OutEdgeIt {  | 
|         |    193     public: | 
|         |    194       OutEdgeIt() { } | 
|         |    195       OutEdgeIt(const typename GraphWrapper::OutEdgeIt& e) :  | 
|         |    196 	GraphWrapper::OutEdgeIt(e) { } | 
|         |    197       OutEdgeIt(const Invalid& i) : GraphWrapper::OutEdgeIt(i) { } | 
|         |    198       OutEdgeIt(const GraphWrapperSkeleton<GraphWrapper>& _G, const Node& n) :  | 
|         |    199 	GraphWrapper::OutEdgeIt(_G.gw, n) { } | 
|         |    200     }; | 
|         |    201     //typedef typename GraphWrapper::InEdgeIt InEdgeIt; | 
|         |    202     class InEdgeIt : public GraphWrapper::InEdgeIt {  | 
|         |    203     public: | 
|         |    204       InEdgeIt() { } | 
|         |    205       InEdgeIt(const typename GraphWrapper::InEdgeIt& e) :  | 
|         |    206 	GraphWrapper::InEdgeIt(e) { } | 
|         |    207       InEdgeIt(const Invalid& i) : GraphWrapper::InEdgeIt(i) { } | 
|         |    208       InEdgeIt(const GraphWrapperSkeleton<GraphWrapper>& _G, const Node& n) :  | 
|         |    209 	GraphWrapper::InEdgeIt(_G.gw, n) { } | 
|         |    210     }; | 
|         |    211     //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; | 
|         |    212     //typedef typename GraphWrapper::EdgeIt EdgeIt; | 
|         |    213     class EdgeIt : public GraphWrapper::EdgeIt {  | 
|         |    214     public: | 
|         |    215       EdgeIt() { } | 
|         |    216       EdgeIt(const typename GraphWrapper::EdgeIt& e) :  | 
|         |    217 	GraphWrapper::EdgeIt(e) { } | 
|         |    218       EdgeIt(const Invalid& i) : GraphWrapper::EdgeIt(i) { } | 
|         |    219       EdgeIt(const GraphWrapperSkeleton<GraphWrapper>& _G) :  | 
|         |    220 	GraphWrapper::EdgeIt(_G.gw) { } | 
|         |    221     }; | 
|         |    222  | 
|         |    223  | 
|         |    224     //GraphWrapperSkeleton() : gw() { } | 
|         |    225     GraphWrapperSkeleton(GraphWrapper _gw) : gw(_gw) { } | 
|         |    226  | 
|         |    227     //void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); } | 
|         |    228     //BaseGraph& getGraph() const { return gw.getGraph(); } | 
|         |    229      | 
|         |    230     template<typename I> I& first(I& i) const {        | 
|         |    231       i=I(*this); | 
|         |    232       return i; | 
|         |    233     } | 
|         |    234     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |    235       i=I(*this, p); | 
|         |    236       return i;  | 
|         |    237     } | 
|         |    238      | 
|         |    239 //    template<typename I> I getNext(const I& i) const { return gw.getNext(i); } | 
|         |    240     template<typename I> I& next(I &i) const { gw.next(i); return i; }     | 
|         |    241  | 
|         |    242     template< typename It > It first() const {  | 
|         |    243       It e; this->first(e); return e; } | 
|         |    244  | 
|         |    245     template< typename It > It first(const Node& v) const {  | 
|         |    246       It e; this->first(e, v); return e; } | 
|         |    247  | 
|         |    248     Node head(const Edge& e) const { return gw.head(e); } | 
|         |    249     Node tail(const Edge& e) const { return gw.tail(e); } | 
|         |    250  | 
|         |    251     template<typename I> bool valid(const I& i) const { return gw.valid(i); } | 
|         |    252    | 
|         |    253     //template<typename I> void setInvalid(const I &i); | 
|         |    254     //{ return graph->setInvalid(i); } | 
|         |    255  | 
|         |    256     int nodeNum() const { return gw.nodeNum(); } | 
|         |    257     int edgeNum() const { return gw.edgeNum(); } | 
|         |    258    | 
|         |    259     template<typename I> Node aNode(const I& e) const { return gw.aNode(e); } | 
|         |    260     template<typename I> Node bNode(const I& e) const { return gw.bNode(e); } | 
|         |    261    | 
|         |    262     Node addNode() const { return gw.addNode(); } | 
|         |    263     Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |    264       return gw.addEdge(tail, head); } | 
|         |    265    | 
|         |    266     template<typename I> void erase(const I& i) const { gw.erase(i); } | 
|         |    267    | 
|         |    268     void clear() const { gw.clear(); } | 
|         |    269      | 
|         |    270     template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {  | 
|         |    271     public: | 
|         |    272       NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) :   | 
|         |    273 	GraphWrapper::NodeMap<T>(_G.gw) { } | 
|         |    274       NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) :  | 
|         |    275 	GraphWrapper::NodeMap<T>(_G.gw, a) { } | 
|         |    276     }; | 
|         |    277  | 
|         |    278     template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> {  | 
|         |    279     public: | 
|         |    280       EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) :   | 
|         |    281 	GraphWrapper::EdgeMap<T>(_G.gw) { } | 
|         |    282       EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) :  | 
|         |    283 	GraphWrapper::EdgeMap<T>(_G.gw, a) { } | 
|         |    284     }; | 
|         |    285   }; | 
|         |    286  | 
|         |    287 //   template<typename Graph> | 
|         |    288 //   class RevGraphWrapper | 
|         |    289 //   { | 
|         |    290 //   protected: | 
|         |    291 //     Graph* graph; | 
|         |    292    | 
|         |    293 //   public: | 
|         |    294 //     typedef Graph BaseGraph; | 
|         |    295  | 
|         |    296 //     typedef typename Graph::Node Node;     | 
|         |    297 //     typedef typename Graph::NodeIt NodeIt; | 
|         |    298    | 
|         |    299 //     typedef typename Graph::Edge Edge; | 
|         |    300 //     typedef typename Graph::OutEdgeIt InEdgeIt; | 
|         |    301 //     typedef typename Graph::InEdgeIt OutEdgeIt; | 
|         |    302 //     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |    303 //     typedef typename Graph::EdgeIt EdgeIt; | 
|         |    304  | 
|         |    305 //     //RevGraphWrapper() : graph(0) { } | 
|         |    306 //     RevGraphWrapper(Graph& _graph) : graph(&_graph) { } | 
|         |    307  | 
|         |    308 //     void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |    309 //     Graph& getGraph() const { return (*graph); } | 
|         |    310      | 
|         |    311 //     template<typename I> I& first(I& i) const { return graph->first(i); } | 
|         |    312 //     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |    313 //       return graph->first(i, p); } | 
|         |    314  | 
|         |    315 //     template<typename I> I getNext(const I& i) const {  | 
|         |    316 //       return graph->getNext(i); } | 
|         |    317 //     template<typename I> I& next(I &i) const { return graph->next(i); }     | 
|         |    318  | 
|         |    319 //     template< typename It > It first() const {  | 
|         |    320 //       It e; first(e); return e; } | 
|         |    321  | 
|         |    322 //     template< typename It > It first(const Node& v) const {  | 
|         |    323 //       It e; first(e, v); return e; } | 
|         |    324  | 
|         |    325 //     Node head(const Edge& e) const { return graph->tail(e); } | 
|         |    326 //     Node tail(const Edge& e) const { return graph->head(e); } | 
|         |    327    | 
|         |    328 //     template<typename I> bool valid(const I& i) const  | 
|         |    329 //       { return graph->valid(i); } | 
|         |    330    | 
|         |    331 //     //template<typename I> void setInvalid(const I &i); | 
|         |    332 //     //{ return graph->setInvalid(i); } | 
|         |    333    | 
|         |    334 //     template<typename I> Node aNode(const I& e) const {  | 
|         |    335 //       return graph->aNode(e); } | 
|         |    336 //     template<typename I> Node bNode(const I& e) const {  | 
|         |    337 //       return graph->bNode(e); } | 
|         |    338  | 
|         |    339 //     Node addNode() const { return graph->addNode(); } | 
|         |    340 //     Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |    341 //       return graph->addEdge(tail, head); } | 
|         |    342    | 
|         |    343 //     int nodeNum() const { return graph->nodeNum(); } | 
|         |    344 //     int edgeNum() const { return graph->edgeNum(); } | 
|         |    345    | 
|         |    346 //     template<typename I> void erase(const I& i) const { graph->erase(i); } | 
|         |    347    | 
|         |    348 //     void clear() const { graph->clear(); } | 
|         |    349  | 
|         |    350 //     template<typename T> class NodeMap : public Graph::NodeMap<T> {  | 
|         |    351 //     public: | 
|         |    352 //       NodeMap(const RevGraphWrapper<Graph>& _G) :  | 
|         |    353 // 	Graph::NodeMap<T>(_G.getGraph()) { } | 
|         |    354 //       NodeMap(const RevGraphWrapper<Graph>& _G, T a) :  | 
|         |    355 // 	Graph::NodeMap<T>(_G.getGraph(), a) { } | 
|         |    356 //     }; | 
|         |    357  | 
|         |    358 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> {  | 
|         |    359 //     public: | 
|         |    360 //       EdgeMap(const RevGraphWrapper<Graph>& _G) :  | 
|         |    361 // 	Graph::EdgeMap<T>(_G.getGraph()) { } | 
|         |    362 //       EdgeMap(const RevGraphWrapper<Graph>& _G, T a) :  | 
|         |    363 // 	Graph::EdgeMap<T>(_G.getGraph(), a) { } | 
|         |    364 //     }; | 
|         |    365 //   }; | 
|         |    366  | 
|         |    367 //   template<typename /*Graph*/GraphWrapper | 
|         |    368 //   /*=typename GraphWrapperSkeleton< TrivGraphWrapper<Graph>*/ > | 
|         |    369 //   class RevGraphWrapper :  | 
|         |    370 //     public GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/ { | 
|         |    371 //   protected: | 
|         |    372 //     //Graph* graph; | 
|         |    373      | 
|         |    374 //   public: | 
|         |    375 //     //typedef Graph BaseGraph; | 
|         |    376  | 
|         |    377 //     //typedef typename Graph::Node Node;     | 
|         |    378 //     //typedef typename Graph::NodeIt NodeIt; | 
|         |    379    | 
|         |    380 //     //typedef typename Graph::Edge Edge; | 
|         |    381 //     typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/::OutEdgeIt InEdgeIt; | 
|         |    382 //     typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/::InEdgeIt OutEdgeIt; | 
|         |    383 //     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |    384 //     //typedef typename Graph::EdgeIt EdgeIt; | 
|         |    385  | 
|         |    386 //     //RevGraphWrapper() : graph(0) { } | 
|         |    387 //     RevGraphWrapper(GraphWrapper _gw/*BaseGraph& _graph*/) : GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper<Graph> >*/(_gw/*TrivGraphWrapper<Graph>(_graph)*/) { } | 
|         |    388      | 
|         |    389 //     //void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |    390 //     //Graph& getGraph() const { return (*graph); } | 
|         |    391      | 
|         |    392 //     //template<typename I> I& first(I& i) const { return graph->first(i); } | 
|         |    393 //     //template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |    394 //     //  return graph->first(i, p); } | 
|         |    395  | 
|         |    396 //     //template<typename I> I getNext(const I& i) const {  | 
|         |    397 //     //  return graph->getNext(i); } | 
|         |    398 //     //template<typename I> I& next(I &i) const { return graph->next(i); }     | 
|         |    399  | 
|         |    400 //     //template< typename It > It first() const {  | 
|         |    401 //     //  It e; first(e); return e; } | 
|         |    402  | 
|         |    403 //     //template< typename It > It first(const Node& v) const {  | 
|         |    404 //     //  It e; first(e, v); return e; } | 
|         |    405  | 
|         |    406 //     //Node head(const Edge& e) const { return graph->tail(e); } | 
|         |    407 //     //Node tail(const Edge& e) const { return graph->head(e); } | 
|         |    408    | 
|         |    409 //     //template<typename I> bool valid(const I& i) const  | 
|         |    410 //     //  { return graph->valid(i); } | 
|         |    411    | 
|         |    412 //     //template<typename I> void setInvalid(const I &i); | 
|         |    413 //     //{ return graph->setInvalid(i); } | 
|         |    414    | 
|         |    415 //     //template<typename I> Node aNode(const I& e) const {  | 
|         |    416 //     //  return graph->aNode(e); } | 
|         |    417 //     //template<typename I> Node bNode(const I& e) const {  | 
|         |    418 //     //  return graph->bNode(e); } | 
|         |    419  | 
|         |    420 //     //Node addNode() const { return graph->addNode(); } | 
|         |    421 //     //Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |    422 //     //  return graph->addEdge(tail, head); } | 
|         |    423    | 
|         |    424 //     //int nodeNum() const { return graph->nodeNum(); } | 
|         |    425 //     //int edgeNum() const { return graph->edgeNum(); } | 
|         |    426    | 
|         |    427 //     //template<typename I> void erase(const I& i) const { graph->erase(i); } | 
|         |    428    | 
|         |    429 //     //void clear() const { graph->clear(); } | 
|         |    430  | 
|         |    431 //     template<typename T> class NodeMap :  | 
|         |    432 //       public GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>  | 
|         |    433 //     {  | 
|         |    434 //     public: | 
|         |    435 //       NodeMap(const RevGraphWrapper<GraphWrapper>& _gw) :  | 
|         |    436 // 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>(_gw) { } | 
|         |    437 //       NodeMap(const RevGraphWrapper<GraphWrapper>& _gw, T a) :  | 
|         |    438 // 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::NodeMap<T>(_gw, a) { } | 
|         |    439 //     }; | 
|         |    440      | 
|         |    441 //     template<typename T> class EdgeMap :  | 
|         |    442 //       public GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T> {  | 
|         |    443 //     public: | 
|         |    444 //       EdgeMap(const RevGraphWrapper<GraphWrapper>& _gw) :  | 
|         |    445 // 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T>(_gw) { } | 
|         |    446 //       EdgeMap(const RevGraphWrapper<GraphWrapper>& _gw, T a) :  | 
|         |    447 // 	GraphWrapper/*Skeleton< TrivGraphWrapper<Graph> >*/::EdgeMap<T>(_gw, a) { } | 
|         |    448 //     }; | 
|         |    449 //   }; | 
|         |    450  | 
|         |    451   template<typename GraphWrapper> | 
|         |    452   class RevGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> { | 
|         |    453   public: | 
|         |    454     typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node; | 
|         |    455     typedef typename GraphWrapperSkeleton<GraphWrapper>::Edge Edge; | 
|         |    456     //FIXME  | 
|         |    457     //If GraphWrapper::OutEdgeIt is not defined | 
|         |    458     //and we do not want to use RevGraphWrapper::InEdgeIt, | 
|         |    459     //this won't work, because of typedef | 
|         |    460     //OR | 
|         |    461     //graphs have to define their non-existing iterators to void | 
|         |    462     //Unfortunately all the typedefs are instantiated in templates,  | 
|         |    463     //unlike other stuff | 
|         |    464     typedef typename GraphWrapperSkeleton<GraphWrapper>::OutEdgeIt InEdgeIt; | 
|         |    465     typedef typename GraphWrapperSkeleton<GraphWrapper>::InEdgeIt OutEdgeIt; | 
|         |    466  | 
|         |    467     RevGraphWrapper(GraphWrapper _gw) :  | 
|         |    468       GraphWrapperSkeleton<GraphWrapper>(_gw) { }   | 
|         |    469  | 
|         |    470     Node head(const Edge& e) const  | 
|         |    471       { return GraphWrapperSkeleton<GraphWrapper>::tail(e); } | 
|         |    472     Node tail(const Edge& e) const  | 
|         |    473       { return GraphWrapperSkeleton<GraphWrapper>::head(e); } | 
|         |    474   }; | 
|         |    475  | 
|         |    476   //Subgraph on the same node-set and partial edge-set | 
|         |    477   template<typename GraphWrapper, typename EdgeFilterMap> | 
|         |    478   class SubGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> { | 
|         |    479   protected: | 
|         |    480     EdgeFilterMap* filter_map; | 
|         |    481   public: | 
|         |    482     typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node; | 
|         |    483     typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt; | 
|         |    484     typedef typename GraphWrapperSkeleton<GraphWrapper>::Edge Edge; | 
|         |    485     typedef typename GraphWrapperSkeleton<GraphWrapper>::EdgeIt EdgeIt; | 
|         |    486     typedef typename GraphWrapperSkeleton<GraphWrapper>::InEdgeIt InEdgeIt; | 
|         |    487     typedef typename GraphWrapperSkeleton<GraphWrapper>::OutEdgeIt OutEdgeIt; | 
|         |    488  | 
|         |    489     SubGraphWrapper(GraphWrapper _gw, EdgeFilterMap& _filter_map) :  | 
|         |    490       GraphWrapperSkeleton<GraphWrapper>(_gw), filter_map(&_filter_map) { }   | 
|         |    491  | 
|         |    492     template<typename I> I& first(I& i) const {  | 
|         |    493       gw.first(i);  | 
|         |    494       while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } | 
|         |    495       return i; | 
|         |    496     } | 
|         |    497     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |    498       gw.first(i, p);  | 
|         |    499       while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } | 
|         |    500       return i; | 
|         |    501     } | 
|         |    502      | 
|         |    503     //template<typename I> I getNext(const I& i) const {  | 
|         |    504     //  return gw.getNext(i);  | 
|         |    505     //} | 
|         |    506     template<typename I> I& next(I &i) const {  | 
|         |    507       gw.next(i);  | 
|         |    508       while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } | 
|         |    509       return i; | 
|         |    510     } | 
|         |    511      | 
|         |    512     template< typename It > It first() const {  | 
|         |    513       It e; this->first(e); return e; } | 
|         |    514      | 
|         |    515     template< typename It > It first(const Node& v) const {  | 
|         |    516       It e; this->first(e, v); return e; } | 
|         |    517   }; | 
|         |    518  | 
|         |    519 //   template<typename GraphWrapper> | 
|         |    520 //   class UndirGraphWrapper { | 
|         |    521 //   protected: | 
|         |    522 //     //Graph* graph; | 
|         |    523 //     GraphWrapper gw; | 
|         |    524  | 
|         |    525 //   public: | 
|         |    526 //     typedef GraphWrapper BaseGraph; | 
|         |    527  | 
|         |    528 //     typedef typename GraphWrapper::Node Node; | 
|         |    529 //     typedef typename GraphWrapper::NodeIt NodeIt; | 
|         |    530  | 
|         |    531 //     //typedef typename Graph::Edge Edge; | 
|         |    532 //     //typedef typename Graph::OutEdgeIt OutEdgeIt; | 
|         |    533 //     //typedef typename Graph::InEdgeIt InEdgeIt; | 
|         |    534 //     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |    535 //     //typedef typename Graph::EdgeIt EdgeIt; | 
|         |    536  | 
|         |    537 //     //private: | 
|         |    538 //     typedef typename GraphWrapper::Edge GraphEdge; | 
|         |    539 //     typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt; | 
|         |    540 //     typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt; | 
|         |    541 //     //public: | 
|         |    542  | 
|         |    543 //     //UndirGraphWrapper() : graph(0) { } | 
|         |    544 //     UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { } | 
|         |    545  | 
|         |    546 //     //void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |    547 //     //Graph& getGraph() const { return (*graph); } | 
|         |    548    | 
|         |    549 //     class Edge { | 
|         |    550 //       friend class UndirGraphWrapper<GraphWrapper>; | 
|         |    551 //       bool out_or_in; //true iff out | 
|         |    552 //       GraphOutEdgeIt out; | 
|         |    553 //       GraphInEdgeIt in; | 
|         |    554 //     public: | 
|         |    555 //       Edge() : out_or_in(), out(), in() { } | 
|         |    556 //       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } | 
|         |    557 //       operator GraphEdge() const { | 
|         |    558 // 	if (out_or_in) return(out); else return(in); | 
|         |    559 //       } | 
|         |    560 //       friend bool operator==(const Edge& u, const Edge& v) {  | 
|         |    561 // 	if (v.out_or_in)  | 
|         |    562 // 	  return (u.out_or_in && u.out==v.out); | 
|         |    563 // 	else | 
|         |    564 // 	  return (!u.out_or_in && u.in==v.in); | 
|         |    565 //       }  | 
|         |    566 //       friend bool operator!=(const Edge& u, const Edge& v) {  | 
|         |    567 // 	if (v.out_or_in)  | 
|         |    568 // 	  return (!u.out_or_in || u.out!=v.out); | 
|         |    569 // 	else | 
|         |    570 // 	  return (u.out_or_in || u.in!=v.in); | 
|         |    571 //       }  | 
|         |    572 //     }; | 
|         |    573  | 
|         |    574 //     class OutEdgeIt : public Edge { | 
|         |    575 //       friend class UndirGraphWrapper<GraphWrapper>; | 
|         |    576 //     public: | 
|         |    577 //       OutEdgeIt() : Edge() { } | 
|         |    578 //       OutEdgeIt(const Invalid& i) : Edge(i) { } | 
|         |    579 //       OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n)  | 
|         |    580 // 	: Edge() {  | 
|         |    581 // 	out_or_in=true; | 
|         |    582 // 	_G.gw.first(out, n); | 
|         |    583 // 	if (!(_G.gw.valid(out))) { | 
|         |    584 // 	  out_or_in=false; | 
|         |    585 // 	  _G.gw.first(in, n); | 
|         |    586 // 	} | 
|         |    587 //       } | 
|         |    588 //     }; | 
|         |    589  | 
|         |    590 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { | 
|         |    591 //       e.out_or_in=true; | 
|         |    592 //       gw.first(e.out, n); | 
|         |    593 //       if (!(gw.valid(e.out))) { | 
|         |    594 // 	e.out_or_in=false; | 
|         |    595 // 	gw.first(e.in, n); | 
|         |    596 //       } | 
|         |    597 //       return e; | 
|         |    598 //     } | 
|         |    599  | 
|         |    600 //     OutEdgeIt& next(OutEdgeIt& e) const { | 
|         |    601 //       if (e.out_or_in) { | 
|         |    602 // 	Node n=gw.tail(e.out); | 
|         |    603 // 	gw.next(e.out); | 
|         |    604 // 	if (!gw.valid(e.out)) { | 
|         |    605 // 	  e.out_or_in=false; | 
|         |    606 // 	  gw.first(e.in, n); | 
|         |    607 // 	} | 
|         |    608 //       } else { | 
|         |    609 // 	gw.next(e.in); | 
|         |    610 //       } | 
|         |    611 //       return e; | 
|         |    612 //     } | 
|         |    613  | 
|         |    614 //     Node aNode(const OutEdgeIt& e) const {  | 
|         |    615 //       if (e.out_or_in) return gw.tail(e); else return gw.head(e); } | 
|         |    616 //     Node bNode(const OutEdgeIt& e) const {  | 
|         |    617 //       if (e.out_or_in) return gw.head(e); else return gw.tail(e); } | 
|         |    618  | 
|         |    619 //     typedef OutEdgeIt InEdgeIt;  | 
|         |    620  | 
|         |    621 //     template<typename I> I& first(I& i) const { return gw.first(i); } | 
|         |    622 // //     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |    623 // //       return graph->first(i, p); } | 
|         |    624      | 
|         |    625 //     template<typename I> I getNext(const I& i) const {  | 
|         |    626 //       return gw.getNext(i); } | 
|         |    627 //     template<typename I> I& next(I &i) const { return gw.next(i); }     | 
|         |    628  | 
|         |    629 //     template< typename It > It first() const {  | 
|         |    630 //       It e; first(e); return e; } | 
|         |    631  | 
|         |    632 //     template< typename It > It first(const Node& v) const {  | 
|         |    633 //       It e; first(e, v); return e; } | 
|         |    634  | 
|         |    635 //     Node head(const Edge& e) const { return gw.head(e); } | 
|         |    636 //     Node tail(const Edge& e) const { return gw.tail(e); } | 
|         |    637  | 
|         |    638 //     template<typename I> bool valid(const I& i) const  | 
|         |    639 //       { return gw.valid(i); } | 
|         |    640    | 
|         |    641 //     //template<typename I> void setInvalid(const I &i); | 
|         |    642 //     //{ return graph->setInvalid(i); } | 
|         |    643  | 
|         |    644 //     int nodeNum() const { return gw.nodeNum(); } | 
|         |    645 //     int edgeNum() const { return gw.edgeNum(); } | 
|         |    646    | 
|         |    647 // //     template<typename I> Node aNode(const I& e) const {  | 
|         |    648 // //       return graph->aNode(e); } | 
|         |    649 // //     template<typename I> Node bNode(const I& e) const {  | 
|         |    650 // //       return graph->bNode(e); } | 
|         |    651    | 
|         |    652 //     Node addNode() const { return gw.addNode(); } | 
|         |    653 // // FIXME: ez igy nem jo, mert nem | 
|         |    654 // //    Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |    655 // //      return graph->addEdge(tail, head); } | 
|         |    656    | 
|         |    657 //     template<typename I> void erase(const I& i) const { gw.erase(i); } | 
|         |    658    | 
|         |    659 //     void clear() const { gw.clear(); } | 
|         |    660      | 
|         |    661 //     template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {  | 
|         |    662 //     public: | 
|         |    663 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) :  | 
|         |    664 // 	GraphWrapper::NodeMap<T>(_G.gw) { } | 
|         |    665 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :  | 
|         |    666 // 	GraphWrapper::NodeMap<T>(_G.gw, a) { } | 
|         |    667 //     }; | 
|         |    668  | 
|         |    669 //     template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> {  | 
|         |    670 //     public: | 
|         |    671 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) :  | 
|         |    672 // 	GraphWrapper::EdgeMap<T>(_G.gw) { } | 
|         |    673 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :  | 
|         |    674 // 	GraphWrapper::EdgeMap<T>(_G.gw, a) { } | 
|         |    675 //     }; | 
|         |    676 //   }; | 
|         |    677  | 
|         |    678  | 
|         |    679   template<typename GraphWrapper> | 
|         |    680   class UndirGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> { | 
|         |    681   protected: | 
|         |    682 //    GraphWrapper gw; | 
|         |    683  | 
|         |    684   public: | 
|         |    685     //typedef GraphWrapper BaseGraph; | 
|         |    686  | 
|         |    687     typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node; | 
|         |    688     typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt; | 
|         |    689  | 
|         |    690     //private: | 
|         |    691     //FIXME ezeknek valojaban a GraphWrapper megfelelo dolgai kellene hogy  | 
|         |    692     //legyenek, at kell irni | 
|         |    693     typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/ | 
|         |    694     GraphWrapper::Edge GraphEdge; | 
|         |    695     typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/  | 
|         |    696     GraphWrapper::OutEdgeIt GraphOutEdgeIt; | 
|         |    697     typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/  | 
|         |    698     GraphWrapper::InEdgeIt GraphInEdgeIt; | 
|         |    699     //public: | 
|         |    700  | 
|         |    701     //UndirGraphWrapper() : graph(0) { } | 
|         |    702     UndirGraphWrapper(GraphWrapper _gw) :  | 
|         |    703       GraphWrapperSkeleton<GraphWrapper>(_gw) { }   | 
|         |    704  | 
|         |    705     //UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { } | 
|         |    706  | 
|         |    707     //void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |    708     //Graph& getGraph() const { return (*graph); } | 
|         |    709    | 
|         |    710     class Edge { | 
|         |    711       friend class UndirGraphWrapper<GraphWrapper>; | 
|         |    712     protected: | 
|         |    713       bool out_or_in; //true iff out | 
|         |    714       GraphOutEdgeIt out; | 
|         |    715       GraphInEdgeIt in; | 
|         |    716     public: | 
|         |    717       Edge() : out_or_in(), out(), in() { } | 
|         |    718       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } | 
|         |    719       operator GraphEdge() const { | 
|         |    720 	if (out_or_in) return(out); else return(in); | 
|         |    721       } | 
|         |    722 //FIXME | 
|         |    723 //2 edges are equal if they "refer" to the same physical edge  | 
|         |    724 //is it good? | 
|         |    725       friend bool operator==(const Edge& u, const Edge& v) {  | 
|         |    726 	if (v.out_or_in)  | 
|         |    727 	  if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in); | 
|         |    728 	//return (u.out_or_in && u.out==v.out); | 
|         |    729 	else | 
|         |    730 	  if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in); | 
|         |    731 	//return (!u.out_or_in && u.in==v.in); | 
|         |    732       }  | 
|         |    733       friend bool operator!=(const Edge& u, const Edge& v) {  | 
|         |    734 	if (v.out_or_in)  | 
|         |    735 	  if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in); | 
|         |    736 	//return (!u.out_or_in || u.out!=v.out); | 
|         |    737 	else | 
|         |    738 	  if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in); | 
|         |    739 	//return (u.out_or_in || u.in!=v.in); | 
|         |    740       }  | 
|         |    741     }; | 
|         |    742  | 
|         |    743     class OutEdgeIt : public Edge { | 
|         |    744       friend class UndirGraphWrapper<GraphWrapper>; | 
|         |    745     public: | 
|         |    746       OutEdgeIt() : Edge() { } | 
|         |    747       OutEdgeIt(const Invalid& i) : Edge(i) { } | 
|         |    748       OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n)  | 
|         |    749 	: Edge() {  | 
|         |    750 	out_or_in=true; _G.gw.first(out, n); | 
|         |    751 	if (!(_G.gw.valid(out))) { out_or_in=false; _G.gw.first(in, n);	} | 
|         |    752       } | 
|         |    753     }; | 
|         |    754  | 
|         |    755     typedef OutEdgeIt InEdgeIt;  | 
|         |    756  | 
|         |    757     class EdgeIt : public Edge { | 
|         |    758       friend class UndirGraphWrapper<GraphWrapper>; | 
|         |    759     protected: | 
|         |    760       NodeIt v; | 
|         |    761     public: | 
|         |    762       EdgeIt() : Edge() { } | 
|         |    763       EdgeIt(const Invalid& i) : Edge(i) { } | 
|         |    764       EdgeIt(const UndirGraphWrapper<GraphWrapper>& _G)  | 
|         |    765 	: Edge() {  | 
|         |    766 	out_or_in=true; | 
|         |    767 	//Node v; | 
|         |    768 	_G.first(v); | 
|         |    769 	if (_G.valid(v)) _G.gw.first(out); else out=INVALID; | 
|         |    770 	while (_G.valid(v) && !_G.gw.valid(out)) {  | 
|         |    771 	  _G.gw.next(v);  | 
|         |    772 	  if (_G.valid(v)) _G.gw.first(out);  | 
|         |    773 	} | 
|         |    774       } | 
|         |    775     }; | 
|         |    776  | 
|         |    777     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { | 
|         |    778       e.out_or_in=true; gw.first(e.out, n); | 
|         |    779       if (!(gw.valid(e.out))) { e.out_or_in=false; gw.first(e.in, n); } | 
|         |    780       return e; | 
|         |    781     } | 
|         |    782  | 
|         |    783     EdgeIt& first(EdgeIt& e) const { | 
|         |    784       e.out_or_in=true; | 
|         |    785       //NodeIt v; | 
|         |    786       first(e.v); | 
|         |    787       if (valid(e.v)) gw.first(e.out, e.v); else e.out=INVALID; | 
|         |    788       while (valid(e.v) && !gw.valid(e.out)) {  | 
|         |    789 	gw.next(e.v);  | 
|         |    790 	if (valid(e.v)) gw.first(e.out, e.v);  | 
|         |    791       } | 
|         |    792       return e; | 
|         |    793     } | 
|         |    794  | 
|         |    795     template<typename I> I& first(I& i) const { gw.first(i); return i; } | 
|         |    796     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |    797       gw.first(i, p); return i; } | 
|         |    798  | 
|         |    799     OutEdgeIt& next(OutEdgeIt& e) const { | 
|         |    800       if (e.out_or_in) { | 
|         |    801 	Node n=gw.tail(e.out); | 
|         |    802 	gw.next(e.out); | 
|         |    803 	if (!gw.valid(e.out)) { e.out_or_in=false; gw.first(e.in, n); } | 
|         |    804       } else { | 
|         |    805 	gw.next(e.in); | 
|         |    806       } | 
|         |    807       return e; | 
|         |    808     } | 
|         |    809  | 
|         |    810     EdgeIt& next(EdgeIt& e) const { | 
|         |    811       //NodeIt v=tail(e); | 
|         |    812       gw.next(e.out); | 
|         |    813       while (valid(e.v) && !gw.valid(e.out)) {  | 
|         |    814 	next(e.v);  | 
|         |    815 	if (valid(e.v)) gw.first(e.out, e.v);  | 
|         |    816       } | 
|         |    817       return e; | 
|         |    818     } | 
|         |    819  | 
|         |    820     template<typename I> I& next(I &i) const { return gw.next(i); }     | 
|         |    821 //    template<typename I> I getNext(const I& i) const { return gw.getNext(i); } | 
|         |    822  | 
|         |    823     template< typename It > It first() const {  | 
|         |    824       It e; first(e); return e; } | 
|         |    825  | 
|         |    826     template< typename It > It first(const Node& v) const {  | 
|         |    827       It e; first(e, v); return e; } | 
|         |    828  | 
|         |    829 //    Node head(const Edge& e) const { return gw.head(e); } | 
|         |    830 //    Node tail(const Edge& e) const { return gw.tail(e); } | 
|         |    831  | 
|         |    832 //    template<typename I> bool valid(const I& i) const  | 
|         |    833 //      { return gw.valid(i); } | 
|         |    834    | 
|         |    835 //    int nodeNum() const { return gw.nodeNum(); } | 
|         |    836 //    int edgeNum() const { return gw.edgeNum(); } | 
|         |    837    | 
|         |    838 //     template<typename I> Node aNode(const I& e) const {  | 
|         |    839 //       return graph->aNode(e); } | 
|         |    840 //     template<typename I> Node bNode(const I& e) const {  | 
|         |    841 //       return graph->bNode(e); } | 
|         |    842  | 
|         |    843     Node aNode(const OutEdgeIt& e) const {  | 
|         |    844       if (e.out_or_in) return gw.tail(e); else return gw.head(e); } | 
|         |    845     Node bNode(const OutEdgeIt& e) const {  | 
|         |    846       if (e.out_or_in) return gw.head(e); else return gw.tail(e); } | 
|         |    847    | 
|         |    848 //    Node addNode() const { return gw.addNode(); } | 
|         |    849  | 
|         |    850 // FIXME: ez igy nem jo, mert nem | 
|         |    851 //    Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |    852 //      return graph->addEdge(tail, head); } | 
|         |    853    | 
|         |    854 //    template<typename I> void erase(const I& i) const { gw.erase(i); } | 
|         |    855    | 
|         |    856 //    void clear() const { gw.clear(); } | 
|         |    857      | 
|         |    858 //     template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {  | 
|         |    859 //     public: | 
|         |    860 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) :  | 
|         |    861 // 	GraphWrapper::NodeMap<T>(_G.gw) { } | 
|         |    862 //       NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :  | 
|         |    863 // 	GraphWrapper::NodeMap<T>(_G.gw, a) { } | 
|         |    864 //     }; | 
|         |    865  | 
|         |    866 //     template<typename T> class EdgeMap :  | 
|         |    867 //       public GraphWrapperSkeleton<GraphWrapper>::EdgeMap<T> {  | 
|         |    868 //     public: | 
|         |    869 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) :  | 
|         |    870 // 	GraphWrapperSkeleton<GraphWrapper>::EdgeMap<T>(_G.gw) { } | 
|         |    871 //       EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :  | 
|         |    872 // 	GraphWrapper::EdgeMap<T>(_G.gw, a) { } | 
|         |    873 //     }; | 
|         |    874    }; | 
|         |    875  | 
|         |    876  | 
|         |    877  | 
|         |    878  | 
|         |    879  | 
|         |    880 //   template<typename Graph> | 
|         |    881 //   class SymGraphWrapper | 
|         |    882 //   { | 
|         |    883 //     Graph* graph; | 
|         |    884    | 
|         |    885 //   public: | 
|         |    886 //     typedef Graph BaseGraph; | 
|         |    887  | 
|         |    888 //     typedef typename Graph::Node Node; | 
|         |    889 //     typedef typename Graph::Edge Edge; | 
|         |    890    | 
|         |    891 //     typedef typename Graph::NodeIt NodeIt; | 
|         |    892      | 
|         |    893 //     //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon | 
|         |    894 //     //iranyitatlant, ami van | 
|         |    895 //     //mert csak 1 dolgot lehet be typedef-elni | 
|         |    896 //     typedef typename Graph::OutEdgeIt SymEdgeIt; | 
|         |    897 //     //typedef typename Graph::InEdgeIt SymEdgeIt; | 
|         |    898 //     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |    899 //     typedef typename Graph::EdgeIt EdgeIt; | 
|         |    900  | 
|         |    901 //     int nodeNum() const { return graph->nodeNum(); } | 
|         |    902 //     int edgeNum() const { return graph->edgeNum(); } | 
|         |    903      | 
|         |    904 //     template<typename I> I& first(I& i) const { return graph->first(i); } | 
|         |    905 //     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |    906 //       return graph->first(i, p); } | 
|         |    907 //     //template<typename I> I next(const I i); { return graph->goNext(i); } | 
|         |    908 //     //template<typename I> I &goNext(I &i); { return graph->goNext(i); } | 
|         |    909  | 
|         |    910 //     template< typename It > It first() const {  | 
|         |    911 //       It e; first(e); return e; } | 
|         |    912  | 
|         |    913 //     template< typename It > It first(Node v) const {  | 
|         |    914 //       It e; first(e, v); return e; } | 
|         |    915  | 
|         |    916 //     Node head(const Edge& e) const { return graph->head(e); } | 
|         |    917 //     Node tail(const Edge& e) const { return graph->tail(e); } | 
|         |    918    | 
|         |    919 //     template<typename I> Node aNode(const I& e) const {  | 
|         |    920 //       return graph->aNode(e); } | 
|         |    921 //     template<typename I> Node bNode(const I& e) const {  | 
|         |    922 //       return graph->bNode(e); } | 
|         |    923    | 
|         |    924 //     //template<typename I> bool valid(const I i); | 
|         |    925 //     //{ return graph->valid(i); } | 
|         |    926    | 
|         |    927 //     //template<typename I> void setInvalid(const I &i); | 
|         |    928 //     //{ return graph->setInvalid(i); } | 
|         |    929    | 
|         |    930 //     Node addNode() { return graph->addNode(); } | 
|         |    931 //     Edge addEdge(const Node& tail, const Node& head) {  | 
|         |    932 //       return graph->addEdge(tail, head); } | 
|         |    933    | 
|         |    934 //     template<typename I> void erase(const I& i) { graph->erase(i); } | 
|         |    935    | 
|         |    936 //     void clear() { graph->clear(); } | 
|         |    937    | 
|         |    938 //     template<typename T> class NodeMap : public Graph::NodeMap<T> { }; | 
|         |    939 //     template<typename T> class EdgeMap : public Graph::EdgeMap<T> { }; | 
|         |    940    | 
|         |    941 //     void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |    942 //     Graph& getGraph() { return (*graph); } | 
|         |    943  | 
|         |    944 //     //SymGraphWrapper() : graph(0) { } | 
|         |    945 //     SymGraphWrapper(Graph& _graph) : graph(&_graph) { } | 
|         |    946 //   }; | 
|         |    947  | 
|         |    948  | 
|         |    949   template<typename GraphWrapper, typename Number, typename FlowMap, typename CapacityMap> | 
|         |    950   class ResGraphWrapper : public GraphWrapperSkeleton<GraphWrapper>{ | 
|         |    951   public: | 
|         |    952     //typedef Graph BaseGraph; | 
|         |    953     //typedef TrivGraphWrapper<const Graph> GraphWrapper; | 
|         |    954     typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node; | 
|         |    955     typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt; | 
|         |    956   private: | 
|         |    957     typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/ | 
|         |    958     GraphWrapper::OutEdgeIt OldOutEdgeIt; | 
|         |    959     typedef typename /*GraphWrapperSkeleton<GraphWrapper>*/ | 
|         |    960     GraphWrapper::InEdgeIt OldInEdgeIt; | 
|         |    961   protected: | 
|         |    962     //const Graph* graph; | 
|         |    963     //GraphWrapper gw; | 
|         |    964     FlowMap* flow; | 
|         |    965     const CapacityMap* capacity; | 
|         |    966   public: | 
|         |    967  | 
|         |    968     ResGraphWrapper(const GraphWrapper& _gw, FlowMap& _flow,  | 
|         |    969 		    const CapacityMap& _capacity) :  | 
|         |    970       GraphWrapperSkeleton<GraphWrapper>(_gw),  | 
|         |    971       flow(&_flow), capacity(&_capacity) { } | 
|         |    972  | 
|         |    973     //void setGraph(const Graph& _graph) { graph = &_graph; } | 
|         |    974     //const Graph& getGraph() const { return (*graph); } | 
|         |    975  | 
|         |    976     class Edge;  | 
|         |    977     class OutEdgeIt;  | 
|         |    978     friend class Edge;  | 
|         |    979     friend class OutEdgeIt;  | 
|         |    980  | 
|         |    981     class Edge { | 
|         |    982       friend class ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>; | 
|         |    983     protected: | 
|         |    984       bool out_or_in; //true, iff out | 
|         |    985       OldOutEdgeIt out; | 
|         |    986       OldInEdgeIt in; | 
|         |    987     public: | 
|         |    988       Edge() : out_or_in(true) { }  | 
|         |    989       Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } | 
|         |    990 //       bool valid() const {  | 
|         |    991 // 	return out_or_in && out.valid() || in.valid(); } | 
|         |    992       friend bool operator==(const Edge& u, const Edge& v) {  | 
|         |    993 	if (v.out_or_in)  | 
|         |    994 	  return (u.out_or_in && u.out==v.out); | 
|         |    995 	else | 
|         |    996 	  return (!u.out_or_in && u.in==v.in); | 
|         |    997       }  | 
|         |    998       friend bool operator!=(const Edge& u, const Edge& v) {  | 
|         |    999 	if (v.out_or_in)  | 
|         |   1000 	  return (!u.out_or_in || u.out!=v.out); | 
|         |   1001 	else | 
|         |   1002 	  return (u.out_or_in || u.in!=v.in); | 
|         |   1003       }  | 
|         |   1004     }; | 
|         |   1005  | 
|         |   1006  | 
|         |   1007     class OutEdgeIt : public Edge { | 
|         |   1008       friend class ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>; | 
|         |   1009     public: | 
|         |   1010       OutEdgeIt() { } | 
|         |   1011       //FIXME | 
|         |   1012       OutEdgeIt(const Edge& e) : Edge(e) { } | 
|         |   1013       OutEdgeIt(const Invalid& i) : Edge(i) { } | 
|         |   1014     protected: | 
|         |   1015       OutEdgeIt(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() {  | 
|         |   1016 	resG.gw.first(out, v); | 
|         |   1017 	while( resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); } | 
|         |   1018 	if (!resG.gw.valid(out)) { | 
|         |   1019 	  out_or_in=0; | 
|         |   1020 	  resG.gw.first(in, v); | 
|         |   1021 	  while( resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); } | 
|         |   1022 	} | 
|         |   1023       } | 
|         |   1024 //     public: | 
|         |   1025 //       OutEdgeIt& operator++() {  | 
|         |   1026 // 	if (out_or_in) { | 
|         |   1027 // 	  Node v=/*resG->*/G->aNode(out); | 
|         |   1028 // 	  ++out; | 
|         |   1029 // 	  while( out.valid() && !(Edge::resCap()>0) ) { ++out; } | 
|         |   1030 // 	  if (!out.valid()) { | 
|         |   1031 // 	    out_or_in=0; | 
|         |   1032 // 	    G->first(in, v);  | 
|         |   1033 // 	    while( in.valid() && !(Edge::resCap()>0) ) { ++in; } | 
|         |   1034 // 	  } | 
|         |   1035 // 	} else { | 
|         |   1036 // 	  ++in; | 
|         |   1037 // 	  while( in.valid() && !(Edge::resCap()>0) ) { ++in; }  | 
|         |   1038 // 	} | 
|         |   1039 // 	return *this;  | 
|         |   1040 //       } | 
|         |   1041     }; | 
|         |   1042  | 
|         |   1043     //FIXME This is just for having InEdgeIt | 
|         |   1044     typedef void InEdgeIt; | 
|         |   1045  | 
|         |   1046     class EdgeIt : public Edge { | 
|         |   1047       friend class ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>; | 
|         |   1048       NodeIt v;  | 
|         |   1049     public: | 
|         |   1050       EdgeIt() { } | 
|         |   1051       //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { } | 
|         |   1052       EdgeIt(const Invalid& i) : Edge(i) { } | 
|         |   1053       EdgeIt(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& resG) : Edge() {  | 
|         |   1054 	resG.gw.first(v); | 
|         |   1055 	if (resG.gw.valid(v)) resG.gw.first(out, v); else out=INVALID; | 
|         |   1056 	while (resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); } | 
|         |   1057 	while (resG.gw.valid(v) && !resG.gw.valid(out)) {  | 
|         |   1058 	  resG.gw.next(v);  | 
|         |   1059 	  if (resG.gw.valid(v)) resG.gw.first(out, v);  | 
|         |   1060 	  while (resG.gw.valid(out) && !(resG.resCap(out)>0) ) { resG.gw.next(out); } | 
|         |   1061 	} | 
|         |   1062 	if (!resG.gw.valid(out)) { | 
|         |   1063 	  out_or_in=0; | 
|         |   1064 	  resG.gw.first(v); | 
|         |   1065 	  if (resG.gw.valid(v)) resG.gw.first(in, v); else in=INVALID; | 
|         |   1066 	  while (resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); } | 
|         |   1067 	  while (resG.gw.valid(v) && !resG.gw.valid(in)) {  | 
|         |   1068 	    resG.gw.next(v);  | 
|         |   1069 	    if (resG.gw.valid(v)) resG.gw.first(in, v);  | 
|         |   1070 	    while (resG.gw.valid(in) && !(resG.resCap(in)>0) ) { resG.gw.next(in); } | 
|         |   1071 	  } | 
|         |   1072 	} | 
|         |   1073       } | 
|         |   1074 //       EdgeIt& operator++() {  | 
|         |   1075 // 	if (out_or_in) { | 
|         |   1076 // 	  ++out; | 
|         |   1077 // 	  while (out.valid() && !(Edge::resCap()>0) ) { ++out; } | 
|         |   1078 // 	  while (v.valid() && !out.valid()) {  | 
|         |   1079 // 	    ++v;  | 
|         |   1080 // 	    if (v.valid()) G->first(out, v);  | 
|         |   1081 // 	    while (out.valid() && !(Edge::resCap()>0) ) { ++out; } | 
|         |   1082 // 	  } | 
|         |   1083 // 	  if (!out.valid()) { | 
|         |   1084 // 	    out_or_in=0; | 
|         |   1085 // 	    G->first(v); | 
|         |   1086 // 	    if (v.valid()) G->first(in, v); else in=OldInEdgeIt(); | 
|         |   1087 // 	    while (in.valid() && !(Edge::resCap()>0) ) { ++in; } | 
|         |   1088 // 	    while (v.valid() && !in.valid()) {  | 
|         |   1089 // 	      ++v;  | 
|         |   1090 // 	      if (v.valid()) G->first(in, v);  | 
|         |   1091 // 	      while (in.valid() && !(Edge::resCap()>0) ) { ++in; } | 
|         |   1092 // 	    }   | 
|         |   1093 // 	  } | 
|         |   1094 // 	} else { | 
|         |   1095 // 	  ++in; | 
|         |   1096 // 	  while (in.valid() && !(Edge::resCap()>0) ) { ++in; } | 
|         |   1097 // 	  while (v.valid() && !in.valid()) {  | 
|         |   1098 // 	    ++v;  | 
|         |   1099 // 	    if (v.valid()) G->first(in, v);  | 
|         |   1100 // 	    while (in.valid() && !(Edge::resCap()>0) ) { ++in; } | 
|         |   1101 // 	  } | 
|         |   1102 // 	} | 
|         |   1103 // 	return *this; | 
|         |   1104 //       } | 
|         |   1105     }; | 
|         |   1106  | 
|         |   1107     NodeIt& first(NodeIt& v) const { gw.first(v); return v; } | 
|         |   1108     OutEdgeIt& first(OutEdgeIt& e, Node v) const {  | 
|         |   1109       e=OutEdgeIt(*this, v);  | 
|         |   1110       return e; | 
|         |   1111     } | 
|         |   1112     EdgeIt& first(EdgeIt& e) const {  | 
|         |   1113       e=EdgeIt(*this);  | 
|         |   1114       return e; | 
|         |   1115     } | 
|         |   1116     | 
|         |   1117     NodeIt& next(NodeIt& n) const { return gw.next(n); } | 
|         |   1118  | 
|         |   1119     OutEdgeIt& next(OutEdgeIt& e) const {  | 
|         |   1120       if (e.out_or_in) { | 
|         |   1121 	Node v=gw.aNode(e.out); | 
|         |   1122 	gw.next(e.out); | 
|         |   1123 	while( gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); } | 
|         |   1124 	if (!gw.valid(e.out)) { | 
|         |   1125 	  e.out_or_in=0; | 
|         |   1126 	  gw.first(e.in, v);  | 
|         |   1127 	  while( gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } | 
|         |   1128 	} | 
|         |   1129       } else { | 
|         |   1130 	gw.next(e.in); | 
|         |   1131 	while( gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); }  | 
|         |   1132       } | 
|         |   1133       return e; | 
|         |   1134     } | 
|         |   1135  | 
|         |   1136     EdgeIt& next(EdgeIt& e) const {  | 
|         |   1137       if (e.out_or_in) { | 
|         |   1138 	gw.next(e.out); | 
|         |   1139 	while (gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); } | 
|         |   1140 	  while (gw.valid(e.v) && !gw.valid(e.out)) {  | 
|         |   1141 	    gw.next(e.v);  | 
|         |   1142 	    if (gw.valid(e.v)) gw.first(e.out, e.v);  | 
|         |   1143 	    while (gw.valid(e.out) && !(resCap(e.out)>0) ) { gw.next(e.out); } | 
|         |   1144 	  } | 
|         |   1145 	  if (!gw.valid(e.out)) { | 
|         |   1146 	    e.out_or_in=0; | 
|         |   1147 	    gw.first(e.v); | 
|         |   1148 	    if (gw.valid(e.v)) gw.first(e.in, e.v); else e.in=INVALID; | 
|         |   1149 	    while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } | 
|         |   1150 	    while (gw.valid(e.v) && !gw.valid(e.in)) {  | 
|         |   1151 	      gw.next(e.v);  | 
|         |   1152 	      if (gw.valid(e.v)) gw.first(e.in, e.v);  | 
|         |   1153 	      while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } | 
|         |   1154 	    }   | 
|         |   1155 	  } | 
|         |   1156 	} else { | 
|         |   1157 	  gw.next(e.in); | 
|         |   1158 	  while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } | 
|         |   1159 	  while (gw.valid(e.v) && !gw.valid(e.in)) {  | 
|         |   1160 	    gw.next(e.v);  | 
|         |   1161 	    if (gw.valid(e.v)) gw.first(e.in, e.v);  | 
|         |   1162 	    while (gw.valid(e.in) && !(resCap(e.in)>0) ) { gw.next(e.in); } | 
|         |   1163 	  } | 
|         |   1164 	} | 
|         |   1165 	return e; | 
|         |   1166       } | 
|         |   1167      | 
|         |   1168  | 
|         |   1169     template< typename It > | 
|         |   1170     It first() const {  | 
|         |   1171       It e; | 
|         |   1172       first(e); | 
|         |   1173       return e;  | 
|         |   1174     } | 
|         |   1175  | 
|         |   1176     template< typename It > | 
|         |   1177     It first(Node v) const {  | 
|         |   1178       It e; | 
|         |   1179       first(e, v); | 
|         |   1180       return e;  | 
|         |   1181     } | 
|         |   1182  | 
|         |   1183     Node tail(Edge e) const {  | 
|         |   1184       return ((e.out_or_in) ? gw.aNode(e.out) : gw.aNode(e.in)); } | 
|         |   1185     Node head(Edge e) const {  | 
|         |   1186       return ((e.out_or_in) ? gw.bNode(e.out) : gw.bNode(e.in)); } | 
|         |   1187  | 
|         |   1188     Node aNode(OutEdgeIt e) const {  | 
|         |   1189       return ((e.out_or_in) ? gw.aNode(e.out) : gw.aNode(e.in)); } | 
|         |   1190     Node bNode(OutEdgeIt e) const {  | 
|         |   1191       return ((e.out_or_in) ? gw.bNode(e.out) : gw.bNode(e.in)); } | 
|         |   1192  | 
|         |   1193     int nodeNum() const { return gw.nodeNum(); } | 
|         |   1194     //FIXME | 
|         |   1195     //int edgeNum() const { return gw.edgeNum(); } | 
|         |   1196  | 
|         |   1197  | 
|         |   1198     int id(Node v) const { return gw.id(v); } | 
|         |   1199  | 
|         |   1200     bool valid(Node n) const { return gw.valid(n); } | 
|         |   1201     bool valid(Edge e) const {  | 
|         |   1202       return e.out_or_in ? gw.valid(e.out) : gw.valid(e.in); } | 
|         |   1203  | 
|         |   1204     void augment(const Edge& e, Number a) const { | 
|         |   1205       if (e.out_or_in)   | 
|         |   1206 	flow->set(e.out, flow->get(e.out)+a); | 
|         |   1207       else   | 
|         |   1208 	flow->set(e.in, flow->get(e.in)-a); | 
|         |   1209     } | 
|         |   1210  | 
|         |   1211     Number resCap(const Edge& e) const {  | 
|         |   1212       if (e.out_or_in)  | 
|         |   1213 	return (capacity->get(e.out)-flow->get(e.out));  | 
|         |   1214       else  | 
|         |   1215 	return (flow->get(e.in));  | 
|         |   1216     } | 
|         |   1217  | 
|         |   1218     Number resCap(OldOutEdgeIt out) const {  | 
|         |   1219       return (capacity->get(out)-flow->get(out));  | 
|         |   1220     } | 
|         |   1221      | 
|         |   1222     Number resCap(OldInEdgeIt in) const {  | 
|         |   1223       return (flow->get(in));  | 
|         |   1224     } | 
|         |   1225  | 
|         |   1226 //     template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {  | 
|         |   1227 //     public: | 
|         |   1228 //       NodeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G)  | 
|         |   1229 // 	: GraphWrapper::NodeMap<T>(_G.gw) { } | 
|         |   1230 //       NodeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G,  | 
|         |   1231 // 	      T a) : GraphWrapper::NodeMap<T>(_G.gw, a) { } | 
|         |   1232 //     }; | 
|         |   1233  | 
|         |   1234 //     template <typename T> | 
|         |   1235 //     class NodeMap { | 
|         |   1236 //       typename Graph::NodeMap<T> node_map;  | 
|         |   1237 //     public: | 
|         |   1238 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { } | 
|         |   1239 //       NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { } | 
|         |   1240 //       void set(Node nit, T a) { node_map.set(nit, a); } | 
|         |   1241 //       T get(Node nit) const { return node_map.get(nit); } | 
|         |   1242 //     }; | 
|         |   1243  | 
|         |   1244     template <typename T> | 
|         |   1245     class EdgeMap { | 
|         |   1246       typename GraphWrapper::EdgeMap<T> forward_map, backward_map;  | 
|         |   1247     public: | 
|         |   1248       EdgeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G) : forward_map(_G.gw), backward_map(_G.gw) { } | 
|         |   1249       EdgeMap(const ResGraphWrapper<GraphWrapper, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(_G.gw, a), backward_map(_G.gw, a) { } | 
|         |   1250       void set(Edge e, T a) {  | 
|         |   1251 	if (e.out_or_in)  | 
|         |   1252 	  forward_map.set(e.out, a);  | 
|         |   1253 	else  | 
|         |   1254 	  backward_map.set(e.in, a);  | 
|         |   1255       } | 
|         |   1256       T get(Edge e) {  | 
|         |   1257 	if (e.out_or_in)  | 
|         |   1258 	  return forward_map.get(e.out);  | 
|         |   1259 	else  | 
|         |   1260 	  return backward_map.get(e.in);  | 
|         |   1261       } | 
|         |   1262     }; | 
|         |   1263   }; | 
|         |   1264  | 
|         |   1265   //Subgraph on the same node-set and partial edge-set | 
|         |   1266   template<typename GraphWrapper, typename FirstOutEdgesMap> | 
|         |   1267   class ErasingFirstGraphWrapper : public GraphWrapperSkeleton<GraphWrapper> { | 
|         |   1268   protected: | 
|         |   1269     FirstOutEdgesMap* first_out_edges; | 
|         |   1270   public: | 
|         |   1271     typedef typename GraphWrapperSkeleton<GraphWrapper>::Node Node; | 
|         |   1272     typedef typename GraphWrapperSkeleton<GraphWrapper>::NodeIt NodeIt; | 
|         |   1273     typedef typename GraphWrapperSkeleton<GraphWrapper>::Edge Edge; | 
|         |   1274     typedef typename GraphWrapperSkeleton<GraphWrapper>::EdgeIt EdgeIt; | 
|         |   1275     typedef typename GraphWrapperSkeleton<GraphWrapper>::InEdgeIt InEdgeIt; | 
|         |   1276     typedef typename GraphWrapperSkeleton<GraphWrapper>::OutEdgeIt OutEdgeIt; | 
|         |   1277  | 
|         |   1278     ErasingFirstGraphWrapper(GraphWrapper _gw, FirstOutEdgesMap& _first_out_edges) :  | 
|         |   1279       GraphWrapperSkeleton<GraphWrapper>(_gw), first_out_edges(&_first_out_edges) { }   | 
|         |   1280  | 
|         |   1281     template<typename I> I& first(I& i) const {  | 
|         |   1282       gw.first(i);  | 
|         |   1283       //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } | 
|         |   1284       return i; | 
|         |   1285     } | 
|         |   1286     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { | 
|         |   1287       e=first_out_edges->get(n); | 
|         |   1288       return e; | 
|         |   1289     } | 
|         |   1290     template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |   1291       gw.first(i, p);  | 
|         |   1292       //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } | 
|         |   1293       return i; | 
|         |   1294     } | 
|         |   1295      | 
|         |   1296     //template<typename I> I getNext(const I& i) const {  | 
|         |   1297     //  return gw.getNext(i);  | 
|         |   1298     //} | 
|         |   1299     template<typename I> I& next(I &i) const {  | 
|         |   1300       gw.next(i);  | 
|         |   1301       //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } | 
|         |   1302       return i; | 
|         |   1303     } | 
|         |   1304      | 
|         |   1305     template< typename It > It first() const {  | 
|         |   1306       It e; this->first(e); return e; } | 
|         |   1307      | 
|         |   1308     template< typename It > It first(const Node& v) const {  | 
|         |   1309       It e; this->first(e, v); return e; } | 
|         |   1310  | 
|         |   1311     void erase(const OutEdgeIt& e) const { | 
|         |   1312       OutEdgeIt f=e; | 
|         |   1313       this->next(f); | 
|         |   1314       first_out_edges->set(this->tail(e), f); | 
|         |   1315     } | 
|         |   1316   }; | 
|         |   1317  | 
|         |   1318 //   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap> | 
|         |   1319 //   class ErasingResGraphWrapper : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap> { | 
|         |   1320 //   protected: | 
|         |   1321 //     ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges; | 
|         |   1322 //     //ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist; | 
|         |   1323 //   public: | 
|         |   1324 //     ErasingResGraphWrapper(const Graph& _G, FlowMap& _flow,  | 
|         |   1325 // 			   const CapacityMap& _capacity) :  | 
|         |   1326 //       ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity),  | 
|         |   1327 //       first_out_edges(*this) /*, dist(*this)*/ {  | 
|         |   1328 //       for(NodeIt n=this->template first<NodeIt>(); this->valid(n); this->next(n)) { | 
|         |   1329 // 	OutEdgeIt e; | 
|         |   1330 // 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n); | 
|         |   1331 // 	first_out_edges.set(n, e); | 
|         |   1332 //       } | 
|         |   1333 //     } | 
|         |   1334  | 
|         |   1335 //     //void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |   1336 //     //Graph& getGraph() const { return (*graph); } | 
|         |   1337    | 
|         |   1338 //     //TrivGraphWrapper() : graph(0) { } | 
|         |   1339 //     //ErasingResGraphWrapper(Graph& _graph) : graph(&_graph) { } | 
|         |   1340  | 
|         |   1341 //     //typedef Graph BaseGraph; | 
|         |   1342  | 
|         |   1343 //     //typedef typename Graph::Node Node; | 
|         |   1344 //     //typedef typename Graph::NodeIt NodeIt; | 
|         |   1345  | 
|         |   1346 //     //typedef typename Graph::Edge Edge; | 
|         |   1347 //     //typedef typename Graph::OutEdgeIt OutEdgeIt; | 
|         |   1348 //     //typedef typename Graph::InEdgeIt InEdgeIt; | 
|         |   1349 //     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |   1350 //     //typedef typename Graph::EdgeIt EdgeIt; | 
|         |   1351  | 
|         |   1352 //     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node; | 
|         |   1353 //     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt; | 
|         |   1354  | 
|         |   1355 //     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge; | 
|         |   1356 //     typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt; | 
|         |   1357 //     //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt; | 
|         |   1358 //     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |   1359 //     //typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt; | 
|         |   1360  | 
|         |   1361 //     NodeIt& first(NodeIt& n) const {  | 
|         |   1362 //       return ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n); | 
|         |   1363 //     } | 
|         |   1364  | 
|         |   1365 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {  | 
|         |   1366 //       e=first_out_edges.get(n); | 
|         |   1367 //       return e; | 
|         |   1368 //     } | 
|         |   1369      | 
|         |   1370 //     //ROSSZ template<typename I> I& first(I& i) const { return first(i); } | 
|         |   1371 //     //ROSSZ template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |   1372 //     //  return first(i, p); } | 
|         |   1373      | 
|         |   1374 //     //template<typename I> I getNext(const I& i) const {  | 
|         |   1375 //     //  return gw.getNext(i); } | 
|         |   1376 //     //template<typename I> I& next(I &i) const { return gw.next(i); }     | 
|         |   1377  | 
|         |   1378 //     template< typename It > It first() const {  | 
|         |   1379 //       It e; first(e); return e; } | 
|         |   1380  | 
|         |   1381 //     template< typename It > It first(const Node& v) const {  | 
|         |   1382 //       It e; first(e, v); return e; } | 
|         |   1383  | 
|         |   1384 //     //Node head(const Edge& e) const { return gw.head(e); } | 
|         |   1385 //     //Node tail(const Edge& e) const { return gw.tail(e); } | 
|         |   1386  | 
|         |   1387 //     //template<typename I> bool valid(const I& i) const  | 
|         |   1388 //     //  { return gw.valid(i); } | 
|         |   1389    | 
|         |   1390 //     //int nodeNum() const { return gw.nodeNum(); } | 
|         |   1391 //     //int edgeNum() const { return gw.edgeNum(); } | 
|         |   1392    | 
|         |   1393 //     //template<typename I> Node aNode(const I& e) const {  | 
|         |   1394 //     //  return gw.aNode(e); } | 
|         |   1395 //     //template<typename I> Node bNode(const I& e) const {  | 
|         |   1396 //     //  return gw.bNode(e); } | 
|         |   1397    | 
|         |   1398 //     //Node addNode() const { return gw.addNode(); } | 
|         |   1399 //     //Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |   1400 //     //  return gw.addEdge(tail, head); } | 
|         |   1401    | 
|         |   1402 //     //void erase(const OutEdgeIt& e) { | 
|         |   1403 //     //  first_out_edge(this->tail(e))=e; | 
|         |   1404 //     //} | 
|         |   1405 //     void erase(const Edge& e) { | 
|         |   1406 //       OutEdgeIt f(e); | 
|         |   1407 //       next(f); | 
|         |   1408 //       first_out_edges.set(this->tail(e), f); | 
|         |   1409 //     } | 
|         |   1410 //     //template<typename I> void erase(const I& i) const { gw.erase(i); } | 
|         |   1411    | 
|         |   1412 //     //void clear() const { gw.clear(); } | 
|         |   1413      | 
|         |   1414 //     template<typename T> class NodeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> {  | 
|         |   1415 //     public: | 
|         |   1416 //       NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) :  | 
|         |   1417 // 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { } | 
|         |   1418 //       NodeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) :  | 
|         |   1419 // 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { } | 
|         |   1420 //     }; | 
|         |   1421  | 
|         |   1422 //     template<typename T> class EdgeMap : public ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> {  | 
|         |   1423 //     public: | 
|         |   1424 //       EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) :  | 
|         |   1425 // 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { } | 
|         |   1426 //       EdgeMap(const ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) :  | 
|         |   1427 // 	ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { } | 
|         |   1428 //     }; | 
|         |   1429 //   }; | 
|         |   1430  | 
|         |   1431 //   template<typename GraphWrapper>  | 
|         |   1432 //   class FilterGraphWrapper { | 
|         |   1433 //   }; | 
|         |   1434  | 
|         |   1435 //   template<typename Graph, typename Number, typename FlowMap, typename CapacityMap> | 
|         |   1436 //   class FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> > : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> { | 
|         |   1437  | 
|         |   1438 //     //Graph* graph; | 
|         |   1439    | 
|         |   1440 //   public: | 
|         |   1441 //     //typedef Graph BaseGraph; | 
|         |   1442  | 
|         |   1443 //     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Node Node; | 
|         |   1444 //     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeIt NodeIt; | 
|         |   1445  | 
|         |   1446 //     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::Edge Edge; | 
|         |   1447 //     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt OutEdgeIt; | 
|         |   1448 //     //typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::InEdgeIt InEdgeIt; | 
|         |   1449 //     //typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |   1450 //     typedef typename ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt; | 
|         |   1451  | 
|         |   1452 //     //FilterGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::OutEdgeIt> first_out_edges; | 
|         |   1453      | 
|         |   1454 //   public: | 
|         |   1455 //     FilterGraphWrapper(const Graph& _G, FlowMap& _flow,  | 
|         |   1456 // 			   const CapacityMap& _capacity) :  | 
|         |   1457 //       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity), dist(*this, gw.nodeNum()) {  | 
|         |   1458 //     } | 
|         |   1459  | 
|         |   1460 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { | 
|         |   1461 //       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n); | 
|         |   1462 //       while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e))))  | 
|         |   1463 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e); | 
|         |   1464 //       return e; | 
|         |   1465 //     } | 
|         |   1466  | 
|         |   1467 //     NodeIt& next(NodeIt& e) const { | 
|         |   1468 //       return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e); | 
|         |   1469 //     } | 
|         |   1470  | 
|         |   1471 //     OutEdgeIt& next(OutEdgeIt& e) const { | 
|         |   1472 //       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e); | 
|         |   1473 //       while (valid(e) && (dist.get(tail(e))/*+1!*/>=dist.get(head(e))))  | 
|         |   1474 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e); | 
|         |   1475 //       return e; | 
|         |   1476 //     } | 
|         |   1477  | 
|         |   1478 //     NodeIt& first(NodeIt& n) const { | 
|         |   1479 //       return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n); | 
|         |   1480 //     } | 
|         |   1481  | 
|         |   1482 //     void erase(const Edge& e) { | 
|         |   1483 //       OutEdgeIt f(e); | 
|         |   1484 //       ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f); | 
|         |   1485 //       while (valid(f) && (dist.get(tail(f))/*+1!=*/>=dist.get(head(f))))  | 
|         |   1486 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(f); | 
|         |   1487 //       first_out_edges.set(this->tail(e), f); | 
|         |   1488 //     } | 
|         |   1489  | 
|         |   1490 //     //TrivGraphWrapper() : graph(0) { } | 
|         |   1491 //     //TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } | 
|         |   1492  | 
|         |   1493 //     //void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |   1494 //     //Graph& getGraph() const { return (*graph); } | 
|         |   1495      | 
|         |   1496 //     //template<typename I> I& first(I& i) const { return gw.first(i); } | 
|         |   1497 //     //template<typename I, typename P> I& first(I& i, const P& p) const {  | 
|         |   1498 //     //  return gw.first(i, p); } | 
|         |   1499      | 
|         |   1500 //     //template<typename I> I getNext(const I& i) const {  | 
|         |   1501 //     //  return gw.getNext(i); } | 
|         |   1502 //     //template<typename I> I& next(I &i) const { return gw.next(i); }     | 
|         |   1503  | 
|         |   1504 //     template< typename It > It first() const {  | 
|         |   1505 //       It e; first(e); return e; } | 
|         |   1506  | 
|         |   1507 //     template< typename It > It first(const Node& v) const {  | 
|         |   1508 //       It e; first(e, v); return e; } | 
|         |   1509  | 
|         |   1510 //     //Node head(const Edge& e) const { return gw.head(e); } | 
|         |   1511 //     //Node tail(const Edge& e) const { return gw.tail(e); } | 
|         |   1512  | 
|         |   1513 //     //template<typename I> bool valid(const I& i) const  | 
|         |   1514 //     //  { return gw.valid(i); } | 
|         |   1515    | 
|         |   1516 //     //template<typename I> void setInvalid(const I &i); | 
|         |   1517 //     //{ return gw.setInvalid(i); } | 
|         |   1518  | 
|         |   1519 //     //int nodeNum() const { return gw.nodeNum(); } | 
|         |   1520 //     //int edgeNum() const { return gw.edgeNum(); } | 
|         |   1521    | 
|         |   1522 //     //template<typename I> Node aNode(const I& e) const {  | 
|         |   1523 //     //  return gw.aNode(e); } | 
|         |   1524 //     //template<typename I> Node bNode(const I& e) const {  | 
|         |   1525 //     //  return gw.bNode(e); } | 
|         |   1526    | 
|         |   1527 //     //Node addNode() const { return gw.addNode(); } | 
|         |   1528 //     //Edge addEdge(const Node& tail, const Node& head) const {  | 
|         |   1529 //     //  return gw.addEdge(tail, head); } | 
|         |   1530    | 
|         |   1531 //     //template<typename I> void erase(const I& i) const { gw.erase(i); } | 
|         |   1532    | 
|         |   1533 //     //void clear() const { gw.clear(); } | 
|         |   1534      | 
|         |   1535 //     template<typename T> class NodeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T> {  | 
|         |   1536 //     public: | 
|         |   1537 //       NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) :  | 
|         |   1538 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/) { } | 
|         |   1539 //       NodeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) :  | 
|         |   1540 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<T>(_G /*_G.getGraph()*/, a) { } | 
|         |   1541 //     }; | 
|         |   1542  | 
|         |   1543 //     template<typename T> class EdgeMap : public ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T> {  | 
|         |   1544 //     public: | 
|         |   1545 //       EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G) :  | 
|         |   1546 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/) { } | 
|         |   1547 //       EdgeMap(const FilterGraphWrapper<ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap> >& _G, T a) :  | 
|         |   1548 // 	ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeMap<T>(_G /*_G.getGraph()*/, a) { } | 
|         |   1549 //     }; | 
|         |   1550  | 
|         |   1551 //   public: | 
|         |   1552 //     ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::NodeMap<int> dist; | 
|         |   1553  | 
|         |   1554 //   }; | 
|         |   1555  | 
|         |   1556  | 
|         |   1557  | 
|         |   1558 // // FIXME: comparison should be made better!!! | 
|         |   1559 //   template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap> | 
|         |   1560 //   class ResGraphWrapper | 
|         |   1561 //   { | 
|         |   1562 //     Graph* graph; | 
|         |   1563    | 
|         |   1564 //   public: | 
|         |   1565 //     typedef Graph BaseGraph; | 
|         |   1566  | 
|         |   1567 //     typedef typename Graph::Node Node; | 
|         |   1568 //     typedef typename Graph::Edge Edge; | 
|         |   1569    | 
|         |   1570 //     typedef typename Graph::NodeIt NodeIt; | 
|         |   1571     | 
|         |   1572 //     class OutEdgeIt { | 
|         |   1573 //     public: | 
|         |   1574 //       //Graph::Node n; | 
|         |   1575 //       bool out_or_in; | 
|         |   1576 //       typename Graph::OutEdgeIt o; | 
|         |   1577 //       typename Graph::InEdgeIt i;    | 
|         |   1578 //     }; | 
|         |   1579 //     class InEdgeIt { | 
|         |   1580 //     public: | 
|         |   1581 //       //Graph::Node n; | 
|         |   1582 //       bool out_or_in; | 
|         |   1583 //       typename Graph::OutEdgeIt o; | 
|         |   1584 //       typename Graph::InEdgeIt i;    | 
|         |   1585 //     }; | 
|         |   1586 //     typedef typename Graph::SymEdgeIt SymEdgeIt; | 
|         |   1587 //     typedef typename Graph::EdgeIt EdgeIt; | 
|         |   1588  | 
|         |   1589 //     int nodeNum() const { return gw.nodeNum(); } | 
|         |   1590 //     int edgeNum() const { return gw.edgeNum(); } | 
|         |   1591  | 
|         |   1592 //     Node& first(Node& n) const { return gw.first(n); } | 
|         |   1593  | 
|         |   1594 //     // Edge and SymEdge  is missing!!!! | 
|         |   1595 //     // Edge <-> In/OutEdgeIt conversion is missing!!!! | 
|         |   1596  | 
|         |   1597 //     //FIXME | 
|         |   1598 //     OutEdgeIt& first(OutEdgeIt& e, const Node& n) const  | 
|         |   1599 //       { | 
|         |   1600 // 	e.n=n; | 
|         |   1601 // 	gw.first(e.o,n); | 
|         |   1602 // 	while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) | 
|         |   1603 // 	  gw.goNext(e.o); | 
|         |   1604 // 	if(!gw.valid(e.o)) { | 
|         |   1605 // 	  gw.first(e.i,n); | 
|         |   1606 // 	  while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) | 
|         |   1607 // 	    gw.goNext(e.i); | 
|         |   1608 // 	} | 
|         |   1609 // 	return e; | 
|         |   1610 //       } | 
|         |   1611 // /* | 
|         |   1612 //   OutEdgeIt &goNext(OutEdgeIt &e) | 
|         |   1613 //   { | 
|         |   1614 //   if(gw.valid(e.o)) { | 
|         |   1615 //   while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) | 
|         |   1616 //   gw.goNext(e.o); | 
|         |   1617 //   if(gw.valid(e.o)) return e; | 
|         |   1618 //   else gw.first(e.i,e.n); | 
|         |   1619 //   } | 
|         |   1620 //   else { | 
|         |   1621 //   while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) | 
|         |   1622 //   gw.goNext(e.i); | 
|         |   1623 //   return e; | 
|         |   1624 //   } | 
|         |   1625 //   } | 
|         |   1626 //   OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);} | 
|         |   1627 // */ | 
|         |   1628 //     //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);} | 
|         |   1629  | 
|         |   1630 //     //FIXME | 
|         |   1631 //     InEdgeIt& first(InEdgeIt& e, const Node& n) const  | 
|         |   1632 //       { | 
|         |   1633 // 	e.n=n; | 
|         |   1634 // 	gw.first(e.i,n); | 
|         |   1635 // 	while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) | 
|         |   1636 // 	  gw.goNext(e.i); | 
|         |   1637 // 	if(!gw.valid(e.i)) { | 
|         |   1638 // 	  gw.first(e.o,n); | 
|         |   1639 // 	  while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) | 
|         |   1640 // 	    gw.goNext(e.o); | 
|         |   1641 // 	} | 
|         |   1642 // 	return e; | 
|         |   1643 //       } | 
|         |   1644 // /* | 
|         |   1645 //   InEdgeIt &goNext(InEdgeIt &e) | 
|         |   1646 //   { | 
|         |   1647 //   if(gw.valid(e.i)) { | 
|         |   1648 //   while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) | 
|         |   1649 //   gw.goNext(e.i); | 
|         |   1650 //   if(gw.valid(e.i)) return e; | 
|         |   1651 //   else gw.first(e.o,e.n); | 
|         |   1652 //   } | 
|         |   1653 //   else { | 
|         |   1654 //   while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) | 
|         |   1655 //   gw.goNext(e.o); | 
|         |   1656 //   return e; | 
|         |   1657 //   } | 
|         |   1658 //   } | 
|         |   1659 //   InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);} | 
|         |   1660 // */ | 
|         |   1661 //     //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);} | 
|         |   1662  | 
|         |   1663 //     //template<typename I> I &goNext(I &i); { return gw.goNext(i); } | 
|         |   1664 //     //template<typename I> I next(const I i); { return gw.goNext(i); } | 
|         |   1665  | 
|         |   1666 //     template< typename It > It first() const {  | 
|         |   1667 //       It e; first(e); return e; } | 
|         |   1668  | 
|         |   1669 //     template< typename It > It first(Node v) const {  | 
|         |   1670 //       It e; first(e, v); return e; } | 
|         |   1671  | 
|         |   1672 //     Node head(const Edge& e) const { return gw.head(e); } | 
|         |   1673 //     Node tail(const Edge& e) const { return gw.tail(e); } | 
|         |   1674    | 
|         |   1675 //     template<typename I> Node aNode(const I& e) const {  | 
|         |   1676 //       return gw.aNode(e); } | 
|         |   1677 //     template<typename I> Node bNode(const I& e) const {  | 
|         |   1678 //       return gw.bNode(e); } | 
|         |   1679    | 
|         |   1680 //     //template<typename I> bool valid(const I i); | 
|         |   1681 //     //{ return gw.valid(i); } | 
|         |   1682    | 
|         |   1683 //     //template<typename I> void setInvalid(const I &i); | 
|         |   1684 //     //{ return gw.setInvalid(i); } | 
|         |   1685    | 
|         |   1686 //     Node addNode() { return gw.addNode(); } | 
|         |   1687 //     Edge addEdge(const Node& tail, const Node& head) {  | 
|         |   1688 //       return gw.addEdge(tail, head); } | 
|         |   1689    | 
|         |   1690 //     template<typename I> void erase(const I& i) { gw.erase(i); } | 
|         |   1691    | 
|         |   1692 //     void clear() { gw.clear(); } | 
|         |   1693    | 
|         |   1694 //     template<typename S> class NodeMap : public Graph::NodeMap<S> { }; | 
|         |   1695 //     template<typename S> class EdgeMap : public Graph::EdgeMap<S> { }; | 
|         |   1696    | 
|         |   1697 //     void setGraph(Graph& _graph) { graph = &_graph; } | 
|         |   1698 //     Graph& getGraph() { return (*graph); } | 
|         |   1699  | 
|         |   1700 //     //ResGraphWrapper() : graph(0) { } | 
|         |   1701 //     ResGraphWrapper(Graph& _graph) : graph(&_graph) { } | 
|         |   1702 //   }; | 
|         |   1703  | 
|         |   1704 } //namespace hugo | 
|         |   1705  | 
|         |   1706 #endif //HUGO_GRAPH_WRAPPER_H | 
|         |   1707  |