[Lemon-commits] [lemon_svn] deba: r1514 - hugo/trunk/src/work/deba

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:45:58 CET 2006


Author: deba
Date: Tue Feb  1 16:56:37 2005
New Revision: 1514

Modified:
   hugo/trunk/src/work/deba/graph_io_test.cc
   hugo/trunk/src/work/deba/graph_reader.h
   hugo/trunk/src/work/deba/graph_writer.h
   hugo/trunk/src/work/deba/map_utils.h

Log:
Some changes in the IO and map utilities.


Modified: hugo/trunk/src/work/deba/graph_io_test.cc
==============================================================================
--- hugo/trunk/src/work/deba/graph_io_test.cc	(original)
+++ hugo/trunk/src/work/deba/graph_io_test.cc	Tue Feb  1 16:56:37 2005
@@ -18,27 +18,27 @@
   GraphReader<SmartGraph> reader(input, graph);
 
   SmartGraph::NodeMap<int> id(graph);
-  reader.readNodeMap("id", id);
+  reader.addNodeMap("id", id);
 
   SmartGraph::NodeMap<int> cost(graph);
-  reader.readNodeMap("cost", cost);
+  reader.addNodeMap("cost", cost);
  
   SmartGraph::NodeMap<string> color(graph);
-  reader.readNodeMap("color", color);
+  reader.addNodeMap("color", color);
 
   SmartGraph::NodeMap<string> description(graph);
-  reader.readNodeMap<QuotedStringReader>("description", description);
+  reader.addNodeMap<QuotedStringReader>("description", description);
 
   SmartGraph::EdgeMap<char> mmap(graph);
-  reader.readEdgeMap("mmap", mmap);
+  reader.addEdgeMap("mmap", mmap);
 
   reader.skipEdgeMap<QuotedStringReader>("description");
 
   SmartGraph::Node source;
-  reader.readNode("source", source);
+  reader.addNode("source", source);
   
   SmartGraph::Edge newedge;
-  reader.readEdge("newedge", newedge);
+  reader.addEdge("newedge", newedge);
 
   try {
     reader.read();
@@ -47,32 +47,37 @@
   } catch (Exception e) {
     cerr << e.what() << endl;
   }
+
   for (SmartGraph::NodeIt it(graph); it != INVALID; ++it) {
     cout << cost[it] << ' ' << color[it] << ' ' << description[it] << endl;
   }
 
   for (SmartGraph::EdgeIt it(graph); it != INVALID; ++it) {
-    cout << mmap[it] << ' ' << id[graph.source(it)] << ' ' << id[graph.target(it)]  << endl;
+    cout << mmap[it] << ' ' << id[graph.source(it)] << ' ' << 
+      id[graph.target(it)]  << endl;
   }
 
-  cout << id[source] << ' ' << cost[source] << ' ' << color[source] << ' ' << description[source] << endl;
-  cout << mmap[newedge] << ' ' << id[graph.source(newedge)] << ' ' << id[graph.target(newedge)]  << endl;
+  cout << id[source] << ' ' << cost[source] << ' ' <<
+    color[source] << ' ' << description[source] << endl;
+  cout << mmap[newedge] << ' ' << id[graph.source(newedge)] << 
+    ' ' << id[graph.target(newedge)]  << endl;
 
   ofstream output("copy.lgf");
   GraphWriter<SmartGraph> writer(output, graph);
   
-  DescriptorMap<SmartGraph, SmartGraph::Node, SmartGraph::NodeIt, SmartGraph::NodeMap<int> > node_ids(graph);
+  DescriptorMap<SmartGraph, SmartGraph::Node, SmartGraph::NodeMap<int> > 
+    node_ids(graph);
   
-  writer.writeNodeMap("id", node_ids);
-  writer.writeNodeMap<QuotedStringWriter>("format", description);
+  writer.addNodeMap("id", node_ids);
+  writer.addNodeMap<QuotedStringWriter>("format", description);
 
-  DescriptorMap<SmartGraph, SmartGraph::Edge, SmartGraph::EdgeIt, SmartGraph::EdgeMap<int> > edge_ids(graph);
+  IdMap<SmartGraph, SmartGraph::Edge > edge_ids(graph);
 
-  writer.writeEdgeMap("id", edge_ids);
-  writer.writeEdgeMap("chars", mmap);
+  writer.addEdgeMap("id", edge_ids);
+  writer.addEdgeMap("chars", mmap);
   
-  writer.writeNode("source", node_ids.inverse()[3]);
-  writer.writeEdge("elek", edge_ids.inverse()[6]);
+  writer.addNode("source", node_ids.inverse()[3]);
+  //  writer.addEdge("elek", edge_ids.inverse()[6]);
   writer.write();
   
   return 0;

Modified: hugo/trunk/src/work/deba/graph_reader.h
==============================================================================
--- hugo/trunk/src/work/deba/graph_reader.h	(original)
+++ hugo/trunk/src/work/deba/graph_reader.h	Tue Feb  1 16:56:37 2005
@@ -37,6 +37,7 @@
 
   class IOException {
   public:
+    virtual ~IOException() {}
     virtual string what() const = 0;
   };
 
@@ -55,10 +56,13 @@
   public:
     typedef _Exception Exception;
     StreamException(int _line, Exception _exception) 
-      : line_num(_line), Exception(_exception) {}
+      : Exception(_exception), line_num(_line) {}
     virtual int line() const {
       return line_num;
     }
+
+    virtual ~StreamException() {}
+
     virtual std::string what() const {
       ostringstream os;
       os << Exception::what() << " in line " << line();
@@ -70,7 +74,10 @@
 
 
   // Readers and ReaderTraits
-  
+  /// \brief Standard ReaderTraits for the GraphReader class.
+  ///
+  /// 
+ 
   struct DefaultReaderTraits {
 
     template <typename _Value>
@@ -96,7 +103,8 @@
       char c;
       value.clear();
       is >> ws;
-      if (!is.get(c) || c != '\"') throw DataFormatException("Quoted string format");
+      if (!is.get(c) || c != '\"') 
+	throw DataFormatException("Quoted string format");
       while (is.get(c) && c != '\"') {
 	if (escaped && c == '\\') {
 	  value += readEscape(is);
@@ -192,17 +200,20 @@
     typedef _ReaderTraits ReaderTraits;
     typedef typename ReaderTraits::DefaultReader DefaultReader;
 
-    GraphReader(std::istream& _is, Graph& _graph, const DefaultReader& _reader = DefaultReader()) 
+    GraphReader(std::istream& _is, Graph& _graph, 
+		const DefaultReader& _reader = DefaultReader()) 
       : is(_is), graph(_graph), nodeSkipper(_reader), edgeSkipper(_reader) {}
 
 
     ~GraphReader() {
 
-      for (typename NodeMapReaders::iterator it = node_map_readers.begin(); it != node_map_readers.end(); ++it) {
+      for (typename NodeMapReaders::iterator it = node_map_readers.begin(); 
+	   it != node_map_readers.end(); ++it) {
 	delete it->second;
       }
 
-      for (typename EdgeMapReaders::iterator it = edge_map_readers.begin(); it != edge_map_readers.end(); ++it) {
+      for (typename EdgeMapReaders::iterator it = edge_map_readers.begin(); 
+	   it != edge_map_readers.end(); ++it) {
 	delete it->second;
       }
 
@@ -211,69 +222,81 @@
     // Node map rules
 
     template <typename Map>
-    GraphReader& readNodeMap(std::string name, Map& map) {
-      return readNodeMap<typename ReaderTraits::template Reader<typename Map::Value>, Map>(name, map);
+    GraphReader& addNodeMap(std::string name, Map& map) {
+      return addNodeMap<typename ReaderTraits::template 
+	Reader<typename Map::Value>, Map>(name, map);
     }
 
     template <typename Reader, typename Map>
-    GraphReader& readNodeMap(std::string name, Map& map, const Reader& reader = Reader()) {
+    GraphReader& addNodeMap(std::string name, Map& map, 
+			     const Reader& reader = Reader()) {
       if (node_map_readers.find(name) != node_map_readers.end()) {
 	throw Exception() << "Multiple read rule for node map: " << name;
       }
-      node_map_readers.insert(make_pair(name, new MapReader<Node, Map, Reader>(map, reader)));
+      node_map_readers.insert(
+        make_pair(name, new MapReader<Node, Map, Reader>(map, reader)));
       return *this;
     }
 
     template <typename Reader>
-    GraphReader& skipNodeMap(std::string name, const Reader& reader = Reader()) {
+    GraphReader& skipNodeMap(std::string name, 
+			     const Reader& reader = Reader()) {
       if (node_map_readers.find(name) != node_map_readers.end()) {
 	throw Exception() << "Multiple read rule for node map: " << name;
       }
-      node_map_readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader)));
+      node_map_readers.insert(
+        make_pair(name, new SkipReader<Node, Reader>(reader)));
       return *this;
     }
 
     // Edge map rules
 
     template <typename Map>
-    GraphReader& readEdgeMap(std::string name, Map& map) { 
-      return readEdgeMap<typename ReaderTraits::template Reader<typename Map::Value>, Map>(name, map);
+    GraphReader& addEdgeMap(std::string name, Map& map) { 
+      return addEdgeMap<typename ReaderTraits::template
+	Reader<typename Map::Value>, Map>(name, map);
     }
 
 
     template <typename Reader, typename Map>
-    GraphReader& readEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) {
+    GraphReader& addEdgeMap(std::string name, Map& map,
+			     const Reader& reader = Reader()) {
       if (edge_map_readers.find(name) != edge_map_readers.end()) {
 	throw Exception() << "Multiple read rule for edge map: " << name;
       }
-      edge_map_readers.insert(make_pair(name, new MapReader<Edge, Map, Reader>(map, reader)));
+      edge_map_readers.insert(
+        make_pair(name, new MapReader<Edge, Map, Reader>(map, reader)));
       return *this;
     }
 
     template <typename Reader>
-    GraphReader& skipEdgeMap(std::string name, const Reader& reader = Reader()) {
+    GraphReader& skipEdgeMap(std::string name,
+			     const Reader& reader = Reader()) {
       if (edge_map_readers.find(name) != edge_map_readers.end()) {
 	throw Exception() << "Multiple read rule for edge map: " << name;
       }
-      edge_map_readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader)));
+      edge_map_readers.insert(
+        make_pair(name, new SkipReader<Edge, Reader>(reader)));
       return *this;
     }
 
     // Node rules
-    GraphReader& readNode(std::string name, Node& node) {
+    GraphReader& addNode(std::string name, Node& node) {
       if (node_readers.find(name) != node_readers.end()) {
 	throw Exception() << "Multiple read rule for node";
       }
       node_readers.insert(make_pair(name, &node));
+      return *this;
     }
 
     // Edge rules
 
-    GraphReader& readEdge(std::string name, Edge& edge) {
+    GraphReader& addEdge(std::string name, Edge& edge) {
       if (edge_readers.find(name) != edge_readers.end()) {
 	throw Exception() << "Multiple read rule for edge";
       }
       edge_readers.insert(make_pair(name, &edge));
+      return *this;
     }
 
     void read() {
@@ -306,7 +329,8 @@
 
     template <typename Item> class InverterBase;
 
-    std::string readNodeSet(int& line_num, auto_ptr<InverterBase<Node> > & nodeInverter) {
+    std::string readNodeSet(int& line_num, 
+			    auto_ptr<InverterBase<Node> > & nodeInverter) {
       std::vector<ReaderBase<Node>* > index;
       {
 	std::string line = readNotEmptyLine(is, line_num);    
@@ -334,7 +358,7 @@
 	Node node = graph.addNode();
 	std::istringstream ls(line);
 	nodeInverter->read(ls, node);
-	for (int i = 1; i < index.size(); ++i) {
+	for (int i = 1; i < (int)index.size(); ++i) {
 	  index[i]->read(ls, node);
 	}
       }
@@ -342,7 +366,8 @@
     }
 
     std::string readEdgeSet(int& line_num, 
-		     auto_ptr<InverterBase<Edge> > & edgeInverter, auto_ptr<InverterBase<Node> > & nodeInverter) {
+			    auto_ptr<InverterBase<Edge> > & edgeInverter, 
+			    auto_ptr<InverterBase<Node> > & nodeInverter) {
       std::vector<ReaderBase<Edge>*> index;
       {
 	std::string line = readNotEmptyLine(is, line_num);    
@@ -372,14 +397,15 @@
 	Node target = nodeInverter->read(ls);
 	Edge edge = graph.addEdge(source, target);
 	edgeInverter->read(ls, edge);
-	for (int i = 1; i < index.size(); ++i) {
+	for (int i = 1; i < (int)index.size(); ++i) {
 	  index[i]->read(ls, edge);
 	}
       }      
       return line;
     }
 
-    std::string readNodes(int& line_num, auto_ptr<InverterBase<Node> >& nodeInverter) {
+    std::string readNodes(int& line_num, 
+			  auto_ptr<InverterBase<Node> >& nodeInverter) {
       std::string line;
       while (line = readNotEmptyLine(is, line_num), line[0] != '@') {
 	std::istringstream ls(line);
@@ -393,7 +419,8 @@
       return line;
     }
 
-    std::string readEdges(int& line_num, auto_ptr<InverterBase<Edge> >& edgeInverter) {
+    std::string readEdges(int& line_num, 
+			  auto_ptr<InverterBase<Edge> >& edgeInverter) {
       std::string line;
       while (line = readNotEmptyLine(is, line_num), line[0] != '@') {
 	std::istringstream ls(line);
@@ -411,7 +438,7 @@
       std::string line;
       while (++line_num, getline(is, line)) {	
 	int vi = line.find_first_not_of(" \t");
-	if (vi != string::npos && line[vi] != '#') {
+	if (vi != (int)string::npos && line[vi] != '#') {
 	  return line.substr(vi);
 	}
       }
@@ -445,6 +472,8 @@
       MapReaderInverter(Map& _map, const Reader& _reader) 
 	: map(_map), reader(_reader) {}
 
+      virtual ~MapReaderInverter() {}
+
       virtual void read(std::istream& is, const Item& item) {
 	Value value;
 	reader.read(is, value);
@@ -482,6 +511,8 @@
       SkipReaderInverter(const Reader& _reader) 
 	: reader(_reader) {}
 
+      virtual ~SkipReaderInverter() {}
+
       virtual void read(std::istream& is, const Item& item) {
 	Value value;
 	reader.read(is, value);
@@ -514,6 +545,8 @@
     public:
       typedef _Item Item;
 
+      //      virtual ~ReaderBase() {}
+
       virtual void read(std::istream& is, const Item& item) = 0;
       virtual InverterBase<_Item>* getInverter() = 0;
     };
@@ -532,6 +565,7 @@
       MapReader(Map& _map, const Reader& _reader) 
 	: map(_map), reader(_reader) {}
 
+      virtual ~MapReader() {}
 
       virtual void read(std::istream& is, const Item& item) {
 	Value value;
@@ -555,6 +589,8 @@
       Reader reader;
       SkipReader(const Reader& _reader) : reader(_reader) {}
 
+      virtual ~SkipReader() {}
+
       virtual void read(std::istream& is, const Item& item) {
 	Value value;
 	reader.read(is, value);

Modified: hugo/trunk/src/work/deba/graph_writer.h
==============================================================================
--- hugo/trunk/src/work/deba/graph_writer.h	(original)
+++ hugo/trunk/src/work/deba/graph_writer.h	Tue Feb  1 16:56:37 2005
@@ -54,11 +54,10 @@
     QuotedStringWriter(bool _escaped = true) : escaped(_escaped) {}
 
     void write(std::ostream& os, const std::string& value) {
-      char c;
       os << "\"";
       if (escaped) {
 	ostringstream ls;
-	for (int i = 0; i < value.size(); ++i) {
+	for (int i = 0; i < (int)value.size(); ++i) {
 	  writeEscape(ls, value[i]);
 	}
 	os << ls.str();
@@ -136,12 +135,13 @@
 
 
     ~GraphWriter() {
-
-      for (typename NodeMapWriters::iterator it = node_map_writers.begin(); it != node_map_writers.end(); ++it) {
+      for (typename NodeMapWriters::iterator it = node_map_writers.begin(); 
+	   it != node_map_writers.end(); ++it) {
 	delete it->second;
       }
 
-      for (typename EdgeMapWriters::iterator it = edge_map_writers.begin(); it != edge_map_writers.end(); ++it) {
+      for (typename EdgeMapWriters::iterator it = edge_map_writers.begin();
+	   it != edge_map_writers.end(); ++it) {
 	delete it->second;
       }
 
@@ -150,29 +150,33 @@
     // Node map rules
 
     template <typename Map>
-    GraphWriter& writeNodeMap(std::string name, const Map& map) {
-      return writeNodeMap<typename WriterTraits::template Writer<typename Map::Value>, Map>(name, map);
+    GraphWriter& addNodeMap(std::string name, const Map& map) {
+      return addNodeMap<typename WriterTraits::template Writer<
+	typename Map::Value>, Map>(name, map);
     }
 
     template <typename Writer, typename Map>
-    GraphWriter& writeNodeMap(std::string name, const Map& map, const Writer& writer = Writer()) {
+    GraphWriter& addNodeMap(std::string name, const Map& map, 
+			      const Writer& writer = Writer()) {
       //      if (node_map_writers.find(name) != node_map_writers.end()) {
-      //	throw Exception() << "Multiple write rule for node map: " << name;
+      //	throw Exception() << "Multiple write rule for node map: " 
+      //        << name;
       //      }
-      node_map_writers.push_back(make_pair(name, new MapWriter<Node, Map, Writer>(map, writer)));
+      node_map_writers.push_back(
+        make_pair(name, new MapWriter<Node, Map, Writer>(map, writer)));
       return *this;
     }
 
     // Edge map rules
 
     template <typename Map>
-    GraphWriter& writeEdgeMap(std::string name, const Map& map) { 
-      return writeEdgeMap<typename WriterTraits::template Writer<typename Map::Value>, Map>(name, map);
+    GraphWriter& addEdgeMap(std::string name, const Map& map) { 
+      return addEdgeMap<typename WriterTraits::template Writer<typename Map::Value>, Map>(name, map);
     }
 
 
     template <typename Writer, typename Map>
-    GraphWriter& writeEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) {
+    GraphWriter& addEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) {
       //      if (edge_map_writers.find(name) != edge_map_writers.end()) {
       //	throw Exception() << "Multiple write rule for edge map: " << name;
       //      }
@@ -181,20 +185,22 @@
     }
 
     // Node rules
-    GraphWriter& writeNode(std::string name, const Node& node) {
+    GraphWriter& addNode(std::string name, const Node& node) {
       //      if (node_writers.find(name) != node_writers.end()) {
       //	throw Exception() << "Multiple write rule for node";
       //      }
       node_writers.push_back(make_pair(name, node));
+      return *this;
     }
 
     // Edge rules
 
-    GraphWriter& writeEdge(std::string name, const Edge& edge) {
+    GraphWriter& addEdge(std::string name, const Edge& edge) {
       //      if (edge_writers.find(name) != edge_writers.end()) {
       //	throw Exception() << "Multiple write rule for edge";
       //      }
       edge_writers.push_back(make_pair(name, edge));
+      return *this;
     }
 
     void write() {   
@@ -210,12 +216,12 @@
     void writeNodeSet() {
       if (node_map_writers.size() == 0) return;
       os << "@nodeset" << std::endl;
-      for (int i = 0; i < node_map_writers.size(); ++i) {
+      for (int i = 0; i < (int)node_map_writers.size(); ++i) {
 	os << node_map_writers[i].first << '\t';
       } 
       os << std::endl;
       for (NodeIt it(graph); it != INVALID; ++it) {
-	for (int i = 0; i < node_map_writers.size(); ++i) {
+	for (int i = 0; i < (int)node_map_writers.size(); ++i) {
 	  node_map_writers[i].second->write(os, it);
 	}
 	os << std::endl;
@@ -230,14 +236,14 @@
       }
       os << "@edgeset" << std::endl;
       os << "\t\t";
-      for (int i = 0; i < edge_map_writers.size(); ++i) {
+      for (int i = 0; i < (int)edge_map_writers.size(); ++i) {
 	os << edge_map_writers[i].first << '\t';
       } 
       os << std::endl;
       for (EdgeIt it(graph); it != INVALID; ++it) {
 	node_map_writers[0].second->write(os, graph.source(it));
 	node_map_writers[0].second->write(os, graph.target(it));
-	for (int i = 0; i < edge_map_writers.size(); ++i) {
+	for (int i = 0; i < (int)edge_map_writers.size(); ++i) {
 	  edge_map_writers[i].second->write(os, it);
 	}
 	os << std::endl;
@@ -250,7 +256,7 @@
 	throw Exception() << "Missing node id map";
       }
       os << "@nodes" << std::endl;
-      for (int i = 0; i < node_writers.size(); ++i) {
+      for (int i = 0; i < (int)node_writers.size(); ++i) {
 	os << node_writers[i].first << '\t';
 	node_map_writers[0].second->write(os, node_writers[i].second);
 	os << std::endl;
@@ -263,7 +269,7 @@
 	throw Exception() << "Missing edge id map";
       }
       os << "@edges" << std::endl;
-      for (int i = 0; i < edge_writers.size(); ++i) {
+      for (int i = 0; i < (int)edge_writers.size(); ++i) {
 	os << edge_writers[i].first << '\t';
 	edge_map_writers[0].second->write(os, edge_writers[i].second);
 	os << std::endl;
@@ -295,7 +301,6 @@
 
 
       virtual void write(std::ostream& os, const Item& item) {
-	Value value;
 	writer.write(os, map[item]);
       }
 
@@ -303,10 +308,12 @@
 
 
 
-    typedef std::vector< std::pair<std::string, WriterBase<Node>*> > NodeMapWriters;
+    typedef std::vector< std::pair<std::string, WriterBase<Node>*> > 
+      NodeMapWriters;
     NodeMapWriters node_map_writers;
 
-    typedef std::vector< std::pair<std::string, WriterBase<Edge>*> > EdgeMapWriters;
+    typedef std::vector< std::pair<std::string, WriterBase<Edge>*> > 
+      EdgeMapWriters;
     EdgeMapWriters edge_map_writers;
 
     typedef std::vector<std::pair<std::string, Node> > NodeWriters;

Modified: hugo/trunk/src/work/deba/map_utils.h
==============================================================================
--- hugo/trunk/src/work/deba/map_utils.h	(original)
+++ hugo/trunk/src/work/deba/map_utils.h	Tue Feb  1 16:56:37 2005
@@ -14,7 +14,7 @@
  *
  */
 
-///\ingroup gutils
+///\ingroup mutils
 ///\file
 ///\brief Map utilities.
 
@@ -49,15 +49,15 @@
     
     typedef typename _Map::ConstReference ConstReference;
 
-    /// Constructor.
-
+    /// \brief Constructor.
+    ///
     /// Construct a new InversableMap for the graph.
     ///
     InversableMap(const Graph& graph) : Map(graph) {} 
     
-    /// The setter function of the map.
-
-    /// It sets the map and the inverse map 
+    /// \brief The setter function of the map.
+    ///
+    /// It sets the map and the inverse map to given key-value pair.
     void set(const Key& key, const Value& val) {
       Value oldval = Map::operator[](key);
       typename InverseMap::iterator it = inv_map.find(oldval);
@@ -95,27 +95,42 @@
   };
 
 
-  // unique, continous, mutable
+  
+  /// \brief Provides a mutable, continous and unique descriptor for each 
+  /// item in the graph.
+  ///
+  /// The DescriptorMap class provides a mutable, continous and immutable
+  /// mapping for each item in the graph.
+  ///
+  /// \param _Graph The graph class the \c DescriptorMap belongs to.
+  /// \param _Item The Item is the Key of the Map. It may be Node, Edge or 
+  /// UndirEdge.
+  /// \param _Map A ReadWriteMap mapping from the item type to integer.
 
   template <
     typename _Graph,   
     typename _Item,
-    typename _ItemIt,
     typename _Map
   >
   class DescriptorMap : protected _Map {
-  public:
-    typedef _Graph Graph;
+
     typedef _Item Item;
-    typedef _ItemIt ItemIt;
     typedef _Map Map;
 
+  public:
+    /// The graph class of DescriptorMap.
+    typedef _Graph Graph;
 
+    /// The key type of DescriptorMap (Node, Edge, UndirEdge).
     typedef typename _Map::Key Key;
+    /// The value type of DescriptorMap.
     typedef typename _Map::Value Value;
 
-    typedef vector<Item> InverseMap;
+    typedef std::vector<Item> InverseMap;
 
+    /// \brief Constructor.
+    ///
+    /// Constructor for creating descriptor map.
     DescriptorMap(const Graph& _graph) : Map(_graph) {
       build();
     }
@@ -134,7 +149,8 @@
 
     virtual void build() {
       Map::build();
-      for (ItemIt it(*Map::getGraph()); it != INVALID; ++it) {
+      Item it;
+      for (getGraph()->first(it); it != INVALID; getGraph()->next(it)) {
 	Map::set(it, inv_map.size());
 	inv_map.push_back(it);	
       }      
@@ -145,11 +161,16 @@
       Map::clear();
     }
 
+    /// \brief Gives back the \e descriptor of the item.
+    ///
+    /// Gives back the mutable and unique \e descriptor of the map.
     int operator[](const Item& item) const {
       return Map::operator[](item);
     }
-
     
+    /// \brief Gives back the inverse of the map.
+    ///
+    /// Gives back the inverse of the map.
     const InverseMap inverse() const {
       return inv_map;
     }
@@ -157,10 +178,57 @@
   private:
     vector<Item> inv_map;
   };
-
-  // unique, immutable => IDMap
-  
   
+  /// Provides an immutable and unique id for each item in the graph.
+
+  /// The IdMap class provides an unique and immutable mapping for each item
+  /// in the graph.
+  ///
+  template <typename _Graph, typename _Item>
+  class IdMap {
+  public:
+    typedef _Graph Graph;
+    typedef int Value;
+    typedef _Item Item;
+
+    /// \brief The class represents the inverse of the map.
+    ///
+    /// The class represents the inverse of the map.
+    /// \see inverse()
+    class InverseMap {
+    protected:
+      InverseMap(const Graph& _graph) : graph(_graph) {}
+    public:
+      /// \brief Gives back the given item by its id.
+      ///
+      /// Gives back the given item by its id.
+      /// 
+      Item operator[](int id) const { return graph->fromId(id, Item());}
+    private:
+      Graph* graph;
+    };
+
+    /// \brief Constructor.
+    ///
+    /// Constructor for creating id map.
+    IdMap(const Graph& _graph) : graph(&_graph) {}
+
+    /// \brief Gives back the \e id of the item.
+    ///
+    /// Gives back the immutable and unique \e id of the map.
+    int operator[](const Item& item) const { return graph->id(item);}
+
+    /// \brief Gives back the inverse of the map.
+    ///
+    /// Gives back the inverse of the map.
+    InverseMap inverse() const { return InverseMap(*graph);} 
+
+  private:
+    const Graph* graph;
+
+  };
+
+
 
 }
 



More information about the Lemon-commits mailing list