[Lemon-commits] [lemon_svn] deba: r1956 - hugo/trunk/lemon

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


Author: deba
Date: Mon Jun 13 19:13:56 2005
New Revision: 1956

Modified:
   hugo/trunk/lemon/graph_reader.h
   hugo/trunk/lemon/lemon_reader.h
   hugo/trunk/lemon/lemon_writer.h

Log:
Some bug fix.

Added:	Concept check for maps and IdReader/Writer classes
	Some runtime check



Modified: hugo/trunk/lemon/graph_reader.h
==============================================================================
--- hugo/trunk/lemon/graph_reader.h	(original)
+++ hugo/trunk/lemon/graph_reader.h	Mon Jun 13 19:13:56 2005
@@ -261,6 +261,7 @@
     /// Add a new labeled edge reader for the reader.
     GraphReader& readEdge(std::string name, Edge& edge) {
       edge_reader.readEdge(name, edge);
+      return *this;
     }
 
     /// \brief Add a new attribute reader command.

Modified: hugo/trunk/lemon/lemon_reader.h
==============================================================================
--- hugo/trunk/lemon/lemon_reader.h	(original)
+++ hugo/trunk/lemon/lemon_reader.h	Mon Jun 13 19:13:56 2005
@@ -36,10 +36,33 @@
 #include <lemon/utility.h>
 #include <lemon/bits/item_reader.h>
 
+#include <lemon/concept_check.h>
+#include <lemon/concept/maps.h>
 
 namespace lemon {
 
   namespace _reader_bits {
+
+    template <typename Item>
+    class ItemIdReader {
+    public:
+
+      bool isIdReader() { return true; }
+
+      Item readId(std::istream&, Item) { return Item();}
+      
+      template <class _ItemIdReader>
+      struct Constraints {
+	void constraints() {
+	  bool b = reader.isIdReader();
+	  ignore_unused_variable_warning(b);
+	  Item item = reader.readId(is, Item());
+	}
+	_ItemIdReader& reader;
+	std::istream& is;
+      };
+
+    };
   
     template <typename T>
     bool operator<(T, T) {
@@ -531,6 +554,7 @@
     public:
       typedef _Item Item;
       virtual Item read(std::istream& is) const = 0;
+      virtual bool isIdReader() const = 0;
     };
 
     template <typename _Item, typename _BoxedIdReader>
@@ -547,6 +571,10 @@
       virtual Item read(std::istream& is) const {
 	return boxedIdReader.readId(is, Item());
       }
+
+      virtual bool isIdReader() const {
+	return boxedIdReader.isIdReader();
+      }
     };
 
     class ValueReaderBase {
@@ -817,9 +845,10 @@
 		  const NodeIdReader& _nodeIdReader, 
 		  const std::string& _id = std::string(),
 		  const DefaultSkipper& _skipper = DefaultSkipper()) 
-      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
-	nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 
-
+      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
+      checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
+      nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
+    }
     /// \brief Destructor.
     ///
     /// Destructor for EdgeSetReader.
@@ -921,6 +950,9 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
+      if (!nodeIdReader->isIdReader()) {
+	throw DataFormatError("Cannot find nodeset or ID map");
+      }
       std::vector<ReaderBase<Edge>* > index;
       std::string line;
 
@@ -1033,9 +1065,10 @@
 		       const NodeIdReader& _nodeIdReader, 
 		       const std::string& _id = std::string(),
 		       const DefaultSkipper& _skipper = DefaultSkipper()) 
-      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
-	nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 
-
+      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
+      checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
+      nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
+    }
     /// \brief Destructor.
     ///
     /// Destructor for UndirEdgeSetReader.
@@ -1197,6 +1230,9 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
+      if (!nodeIdReader->isIdReader()) {
+	throw DataFormatError("Cannot find nodeset or ID map");
+      }
       std::vector<ReaderBase<UndirEdge>* > index;
       std::string line;
 
@@ -1302,8 +1338,10 @@
     template <typename _IdReader>
     NodeReader(LemonReader& _reader, const _IdReader& _idReader, 
 	       const std::string& _id = std::string()) 
-      : Parent(_reader), id(_id), 
-	idReader(new IdReader<typename Graph::Node, _IdReader>(_idReader)) {} 
+      : Parent(_reader), id(_id) {
+      checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
+      idReader.reset(new IdReader<Node, _IdReader>(_idReader));
+    }
 
     /// \brief Destructor.
     ///
@@ -1347,6 +1385,9 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
+      if (!idReader->isIdReader()) {
+	throw DataFormatError("Cannot find nodeset or ID map");
+      }
       std::string line;
       while (getline(is, line)) {
 	std::istringstream ls(line);
@@ -1394,8 +1435,10 @@
     template <typename _IdReader>
     EdgeReader(LemonReader& _reader, const _IdReader& _idReader, 
 	       const std::string& _id = std::string()) 
-      : Parent(_reader), id(_id), 
-	idReader(new IdReader<typename Graph::Edge, _IdReader>(_idReader)) {} 
+      : Parent(_reader), id(_id) {
+      checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
+      idReader.reset(new IdReader<Edge, _IdReader>(_idReader));
+    }
 
     /// \brief Destructor.
     ///
@@ -1438,6 +1481,9 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
+      if (!idReader->isIdReader()) {
+	throw DataFormatError("Cannot find edgeset or ID map");
+      }
       std::string line;
       while (getline(is, line)) {
 	std::istringstream ls(line);
@@ -1487,10 +1533,12 @@
     template <typename _IdReader>
     UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader, 
 	       const std::string& _id = std::string()) 
-      : Parent(_reader), id(_id), 
-	undirEdgeIdReader(new IdReader<UndirEdge, _IdReader>(_idReader)),
-	edgeIdReader(new IdReader<Edge, _IdReader>(_idReader))
-    {} 
+      : Parent(_reader), id(_id) {
+      checkConcept<_reader_bits::ItemIdReader<UndirEdge>, _IdReader>();
+      checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
+      undirEdgeIdReader.reset(new IdReader<UndirEdge, _IdReader>(_idReader));
+      egdeIdReader.reset(new IdReader<Edge, _IdReader>(_idReader));
+    }
 
     /// \brief Destructor.
     ///
@@ -1545,6 +1593,12 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
+      if (!edgeIdReader->isIdReader()) {
+	throw DataFormatError("Cannot find undirected edgeset or ID map");
+      }
+      if (!undirEdgeIdReader->isIdReader()) {
+	throw DataFormatError("Cannot find undirected edgeset or ID map");
+      }
       std::string line;
       while (getline(is, line)) {
 	std::istringstream ls(line);

Modified: hugo/trunk/lemon/lemon_writer.h
==============================================================================
--- hugo/trunk/lemon/lemon_writer.h	(original)
+++ hugo/trunk/lemon/lemon_writer.h	Mon Jun 13 19:13:56 2005
@@ -36,9 +36,38 @@
 #include <lemon/utility.h>
 #include <lemon/maps.h>
 
+#include <lemon/concept_check.h>
+#include <lemon/concept/maps.h>
+
 
 namespace lemon {
 
+  namespace _writer_bits {
+    
+    template <typename Item>
+    class ItemIdWriter {
+    public:
+
+      bool isIdWriter() { return true; }
+
+      void writeId(std::ostream&, const Item&) {}
+      
+      template <class _ItemIdWriter>
+      struct Constraints {
+	void constraints() {
+	  const Item item;
+	  bool b = writer.isIdWriter();
+	  ignore_unused_variable_warning(b);
+	  writer.writeId(os, item);
+	}
+	_ItemIdWriter& writer;
+	std::ostream& os;
+      };
+
+    };
+
+  }
+
   /// \ingroup io_group
   /// \brief Lemon Format writer class.
   /// 
@@ -229,6 +258,7 @@
     public:
       typedef _Item Item;
       virtual void write(std::ostream&, const Item&) const = 0;
+      virtual bool isIdWriter() const = 0;
     };
 
     template <typename _Item, typename _BoxedIdWriter>
@@ -245,6 +275,10 @@
       virtual void write(std::ostream& os, const Item& item) const {
 	idWriter.writeId(os, item);
       }
+
+      virtual bool isIdWriter() const {
+	return idWriter.isIdWriter();
+      }
     };
   };
 
@@ -318,6 +352,7 @@
     template <typename Writer, typename Map>
     NodeSetWriter& writeNodeMap(std::string name, const Map& map, 
 			    const Writer& writer = Writer()) {
+      checkConcept<concept::WriteMap<Node, typename Map::Value>, Map>();
       writers.push_back(
 	make_pair(name, new MapWriter<Node, Map, Writer>(map, writer)));
       return *this;
@@ -446,8 +481,10 @@
 		  const std::string& _id = std::string(),
 		  bool _forceIdMap = true)
       : Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
-	graph(_graph), id(_id),
-	nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {} 
+	graph(_graph), id(_id) {
+      checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
+      nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
+    } 
 
     /// \brief Destructor.
     ///
@@ -480,6 +517,7 @@
     template <typename Writer, typename Map>
     EdgeSetWriter& writeEdgeMap(std::string name, const Map& map, 
 			    const Writer& writer = Writer()) {
+      checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
       writers.push_back(
 	make_pair(name, new MapWriter<Edge, Map, Writer>(map, writer)));
       return *this;
@@ -498,6 +536,9 @@
     ///
     /// Write the content of the section.
     virtual void write(std::ostream& os) {
+      if (!nodeIdWriter->isIdWriter()) {
+	throw DataFormatError("Cannot find nodeset or ID map");
+      }
       for (int i = 0; i < (int)writers.size(); ++i) {
 	if (writers[i].first == "id") {
 	  idMap = writers[i].second;
@@ -621,8 +662,10 @@
 		       const std::string& _id = std::string(),
 		       bool _forceIdMap = true)
       : Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
-	graph(_graph), id(_id),
-	nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {} 
+	graph(_graph), id(_id) {
+      checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
+      nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
+    } 
 
     /// \brief Destructor.
     ///
@@ -655,6 +698,7 @@
     template <typename Writer, typename Map>
     UndirEdgeSetWriter& writeUndirEdgeMap(std::string name, const Map& map, 
 					  const Writer& writer = Writer()) {
+      checkConcept<concept::WriteMap<UndirEdge, typename Map::Value>, Map>();
       writers.push_back(
 	make_pair(name, new MapWriter<UndirEdge, Map, Writer>(map, writer)));
       return *this;
@@ -665,6 +709,7 @@
     /// Add a new directed map writer command for the writer.
     template <typename Map>
     UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map) {
+      checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
       writeUndirEdgeMap("+" + name, composeMap(forwardMap(graph), map));
       writeUndirEdgeMap("-" + name, composeMap(backwardMap(graph), map));
       return *this;
@@ -676,8 +721,9 @@
     template <typename Writer, typename Map>
     UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map, 
 				     const Writer& writer = Writer()) {
+      checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
       writeUndirEdge("+" + name, composeMap(forwardMap(graph), map), writer);
-      writeUndirEdge("-" + name, composeMap(forwardMap(graph), map), writer);
+      writeUndirEdge("-" + name, composeMap(backwardMap(graph), map), writer);
       return *this;
     }
 
@@ -694,6 +740,9 @@
     ///
     /// Write the content of the section.
     virtual void write(std::ostream& os) {
+      if (!nodeIdWriter->isIdWriter()) {
+	throw DataFormatError("Cannot find nodeset or ID map");
+      }
       for (int i = 0; i < (int)writers.size(); ++i) {
 	if (writers[i].first == "id") {
 	  idMap = writers[i].second;
@@ -811,8 +860,11 @@
     template <typename _IdWriter>
     NodeWriter(LemonWriter& _writer, const _IdWriter& _idWriter, 
 	       const std::string& _id = std::string()) 
-      : Parent(_writer), id(_id), 
-	idWriter(new IdWriter<typename Graph::Node, _IdWriter>(_idWriter)) {} 
+      : Parent(_writer), id(_id) {
+      checkConcept<_writer_bits::ItemIdWriter<Node>, _IdWriter>();
+      idWriter.reset(new IdWriter<Node, _IdWriter>(_idWriter));
+    }
+
 
     /// \brief Destructor.
     ///
@@ -846,6 +898,9 @@
     ///
     /// Write the content of the section.
     virtual void write(std::ostream& os) {
+      if (!idWriter->isIdWriter()) {
+	throw DataFormatError("Cannot find nodeset or ID map");
+      }
       for (int i = 0; i < (int)writers.size(); ++i) {
 	os << writers[i].first << ' ';
 	idWriter->write(os, *(writers[i].second));
@@ -887,8 +942,10 @@
     template <typename _IdWriter>
     EdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter, 
 	       const std::string& _id = std::string()) 
-      : Parent(_writer), id(_id), 
-	idWriter(new IdWriter<typename Graph::Edge, _IdWriter>(_idWriter)) {} 
+      : Parent(_writer), id(_id) {
+      checkConcept<_writer_bits::ItemIdWriter<Edge>, _IdWriter>();
+      idWriter.reset(new IdWriter<Edge, _IdWriter>(_idWriter));
+    }
 
     /// \brief Destructor.
     ///
@@ -921,6 +978,9 @@
     ///
     /// Write the content of the section.
     virtual void write(std::ostream& os) {
+      if (!idWriter->isIdWriter()) {
+	throw DataFormatError("Cannot find edgeset or ID map");
+      }
       for (int i = 0; i < (int)writers.size(); ++i) {
 	os << writers[i].first << ' ';
 	idWriter->write(os, *(writers[i].second));
@@ -966,9 +1026,12 @@
     template <typename _IdWriter>
     UndirEdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter, 
 	       const std::string& _id = std::string()) 
-      : Parent(_writer), id(_id), 
-	undirEdgeIdWriter(new IdWriter<UndirEdge, _IdWriter>(_idWriter)),
-	edgeIdWriter(new IdWriter<Edge, _IdWriter>(_idWriter)) {}
+      : Parent(_writer), id(_id) {
+      checkConcept<_writer_bits::ItemIdWriter<Edge>, _IdWriter>();
+      checkConcept<_writer_bits::ItemIdWriter<UndirEdge>, _IdWriter>();
+      undirEdgeIdWriter.reset(new IdWriter<UndirEdge, _IdWriter>(_idWriter));
+      edgeIdWriter.reset(new IdWriter<Edge, _IdWriter>(_idWriter));
+    }
 
     /// \brief Destructor.
     ///
@@ -1008,6 +1071,12 @@
     ///
     /// Write the content of the section.
     virtual void write(std::ostream& os) {
+      if (!edgeIdWriter->isIdWriter()) {
+	throw DataFormatError("Cannot find undirected edgeset or ID map");
+      }
+      if (!undirEdgeIdWriter->isIdWriter()) {
+	throw DataFormatError("Cannot find undirected edgeset or ID map");
+      }
       for (int i = 0; i < (int)undirEdgeWriters.size(); ++i) {
 	os << undirEdgeWriters[i].first << ' ';
 	undirEdgeIdWriter->write(os, *(undirEdgeWriters[i].second));



More information about the Lemon-commits mailing list