COIN-OR::LEMON - Graph Library

Changeset 377:33fe0ee01dc5 in lemon-0.x for src/work/deba


Ignore:
Timestamp:
04/22/04 18:36:57 (20 years ago)
Author:
Balazs Dezso
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@507
Message:
 
Location:
src/work/deba
Files:
4 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • src/work/deba/edge_map_base.h

    r340 r377  
    1212template <typename G, typename K>
    1313class EdgeMapBase {
     14
     15#include "edge_map_registry.h"
     16
    1417public:
    1518        typedef G Graph;
     19        friend class EdgeMapRegistry<G, K>;
    1620
    1721        typedef K KeyType;
     
    7882       
    7983        void init() {
    80                 for (Graph::EdgeIt it(g); g.valid(it); g.next(it)) {
     84                for (typename Graph::EdgeIt it(g); g.valid(it); g.next(it)) {
    8185                        add(it);
    8286                }
     
    8892       
    8993        void destroy() {
    90                 for (Graph::EdgeIt it(g); g.valid(it); g.next(it)) {
     94                for (typename Graph::EdgeIt it(g); g.valid(it); g.next(it)) {
    9195                        erase(it);
    9296                }
     
    113117        class NotSupportedOperationException {};
    114118
    115         friend class Graph;
    116119};
    117120
  • src/work/deba/edge_map_registry.h

    r340 r377  
    44#include <vector>
    55
     6template <typename G, typename K>
     7class EdgeMapRegistry;
     8
    69#include "edge_map_base.h"
    710
    8 template <typename G, typename E>
     11template <typename G, typename K>
    912class EdgeMapRegistry {
    1013public:
    1114        typedef G Graph;
    12         typedef E Edge
     15        typedef K Edge;
    1316       
    1417        typedef EdgeMapBase<Graph, Edge> MapBase;
     18        friend class MapBase;
    1519
    1620protected:
    17         typedef std::vector<EdgeMapBase*> Container;
     21       
     22        Graph* graph;
     23
     24        typedef std::vector<MapBase*> Container;
    1825       
    1926        Container container;
    20        
     27
     28public:
     29
     30        EdgeMapRegistry(Graph g) : graph(&g) {}
     31
    2132        void add(MapBase& map_base) {
    2233                if (map_base.graph) {
     
    2435                }
    2536                container.push_back(&map_base);
    26                 map_base.graph = this;
     37                map_base.graph = graph;
    2738                map_base.graph_index = container.size()-1;
    2839        }
    2940       
    3041        void erase(MapBase& map_base) {
    31                 if (map_base.graph != this) return;
    3242                container.back()->graph_index = map_base.graph_index;
    3343                container[map_base.graph_index] = container.back();
     
    3545                map_base.graph = 0;
    3646        }
     47
    3748       
    3849        void add(Edge& edge) {
     
    5061        }
    5162
    52         friend class MapBase;
    5363};
    5464
  • src/work/deba/node_map_base.h

    r340 r377  
    1212template <typename G, typename K>
    1313class NodeMapBase {
     14
     15#include "node_map_registry.h"
     16
    1417public:
    1518        typedef G Graph;
     19        friend class NodeMapRegistry<G, K>;
    1620
    1721        typedef K KeyType;
     
    6367        virtual ~NodeMapBase() {
    6468                if (graph) {
    65                         graph.node_maps.erase(*this);
     69                        graph->node_maps.erase(*this);
    6670                }
    6771        }
     
    7882       
    7983        void init() {
    80                 for (Graph::NodeIt it(g); g.valid(it); g.next(it)) {
     84                for (typename Graph::NodeIt it(g); g.valid(it); g.next(it)) {
    8185                        add(it);
    8286                }
     
    8892       
    8993        void destroy() {
    90                 for (Graph::NodeIt it(g); g.valid(it); g.next(it)) {
     94                for (typename Graph::NodeIt it(g); g.valid(it); g.next(it)) {
    9195                        erase(it);
    9296                }
     
    113117        class NotSupportedOperationException {};
    114118
    115         friend class Graph;
    116119};
    117120
  • src/work/deba/node_map_registry.h

    r340 r377  
    44#include <vector>
    55
     6template <typename G, typename K>
     7class NodeMapRegistry;
     8
    69#include "node_map_base.h"
    710
    8 template <typename G, typename E>
     11template <typename G, typename K>
    912class NodeMapRegistry {
    1013public:
    1114        typedef G Graph;
    12         typedef E Node
     15        typedef K Node;
    1316       
    14         typedef NodeMapBase<Graph, Node> NodeMapBase;
     17        typedef NodeMapBase<Graph, Node> MapBase;
     18        friend class MapBase;
    1519
    1620protected:
    17         typedef std::vector<NodeMapBase*> Container;
     21       
     22        Graph* graph;
     23
     24        typedef std::vector<MapBase*> Container;
    1825       
    1926        Container container;
    20        
    21         void add(NodeMapBase& map_base) {
     27
     28public:
     29
     30        NodeMapRegistry(Graph g) : graph(&g) {}
     31
     32        void add(MapBase& map_base) {
    2233                if (map_base.graph) {
    2334                        map_base.graph->node_maps.erase(map_base);
    2435                }
    2536                container.push_back(&map_base);
    26                 map_base.graph = this;
     37                map_base.graph = graph;
    2738                map_base.graph_index = container.size()-1;
    2839        }
    2940       
    30         void erase(NodeMapBase& map_base) {
    31                 if (map_base.graph != this) return;
     41        void erase(MapBase& map_base) {
    3242                container.back()->graph_index = map_base.graph_index;
    3343                container[map_base.graph_index] = container.back();
     
    3545                map_base.graph = 0;
    3646        }
     47
    3748       
    3849        void add(Node& node) {
     
    5061        }
    5162
    52         friend class NodeMapBase;
    5363};
    5464
  • src/work/deba/test_graph.h

    r340 r377  
    66#include <vector>
    77
    8 #include <invalid.h>
    9 
    10 #include "vector_map.h"
     8#include "invalid.h"
     9
    1110#include "edge_map_registry.h"
    1211#include "node_map_registry.h"
    1312#include "edge_map_base.h"
    1413#include "node_map_base.h"
     14#include "vector_map.h"
    1515
    1616namespace hugo {
     
    4141 //   template <typename T> friend class EdgeMap;
    4242 
    43                 NodeMapRegistry<ListGraph, Node> node_maps;
     43  private:
     44
     45                NodeMapRegistry<ListGraph, Node> node_maps(*this);
     46                EdgeMapRegistry<ListGraph, Edge> edge_maps(*this);
     47 
     48        public:
     49 
    4450
    4551    template <typename T>
    46     class NodeMap : public VectorMap<ListGraph, Edge, T, EdgeMapBase> {};
     52    class NodeMap : public VectorMap<ListGraph, Node, T, NodeMapBase> {
     53                public:
     54                        NodeMap(ListGraph& g) : VectorMap<ListGraph, Node, T, NodeMapBase>(g) {}
     55                };
    4756               
    4857                EdgeMapRegistry<ListGraph, Edge> edge_maps;
    4958
    5059    template <typename T>
    51     class EdgeMap : public VectorMap<Graph, Node, T, NodeMapBase> {};
     60    class EdgeMap : public VectorMap<ListGraph, Edge, T, EdgeMapBase> {};
    5261
    5362
     
    311320
    312321    void erase(Node i) {
    313                         node_map.erase(i);
     322                        node_maps.erase(i);
    314323      while (first<OutEdgeIt>(i).valid()) erase(first<OutEdgeIt>(i));
    315324      while (first<InEdgeIt>(i).valid()) erase(first<InEdgeIt>(i));
  • src/work/deba/vector_map.h

    r340 r377  
    3535       
    3636        void add(const K& key) {
    37                 container.resize(key->id);
     37                if (key->id() >= container.size()) {
     38                        container.resize(key->id() + 1);
     39                }
    3840        }
    3941       
     
    4446       
    4547        Container container;
    46 }
     48};
    4749
    4850#endif
Note: See TracChangeset for help on using the changeset viewer.