# HG changeset patch
# User deba
# Date 1118830259 0
# Node ID 0d58f0301923ea1b061d3665e18fbdd302f107b9
# Parent  340514805e40fe044495dfd88e898831c2c2a45d
Correcting concept checks.

diff -r 340514805e40 -r 0d58f0301923 lemon/lemon_reader.h
--- a/lemon/lemon_reader.h	Tue Jun 14 23:21:31 2005 +0000
+++ b/lemon/lemon_reader.h	Wed Jun 15 10:10:59 2005 +0000
@@ -49,20 +49,38 @@
 
       bool isIdReader() { return true; }
 
-      Item readId(std::istream&, Item) { return Item();}
+      void readId(std::istream&, Item&) {}
       
       template <class _ItemIdReader>
       struct Constraints {
 	void constraints() {
 	  bool b = reader.isIdReader();
 	  ignore_unused_variable_warning(b);
-	  Item item = reader.readId(is, Item());
+	  Item item;
+	  reader.readId(is, item);
 	}
 	_ItemIdReader& reader;
 	std::istream& is;
       };
 
     };
+
+    template <typename Item>
+    class ItemReader {
+    public:
+      void read(std::istream&, Item&) {}
+      
+      template <class _ItemReader>
+      struct Constraints {
+	void constraints() {
+	  Item item;
+	  reader.read(is, item);
+	}
+	_ItemReader& reader;
+	std::istream& is;
+      };
+
+    };
   
     template <typename T>
     bool operator<(T, T) {
@@ -569,7 +587,9 @@
 	: boxedIdReader(_boxedIdReader) {}
 
       virtual Item read(std::istream& is) const {
-	return boxedIdReader.readId(is, Item());
+	Item item;
+	boxedIdReader.readId(is, item);
+	return item;
       }
 
       virtual bool isIdReader() const {
@@ -696,6 +716,8 @@
     template <typename Reader, typename Map, typename MapParameter>
     NodeSetReader& _readMap(std::string name, MapParameter map, 
 			    const Reader& reader = Reader()) {
+      checkConcept<concept::WriteMap<Node, typename Map::Value>, Map>();
+      checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
       if (readers.find(name) != readers.end()) {
 	ErrorMessage msg;
 	msg << "Multiple read rule for node map: " << name;
@@ -782,8 +804,8 @@
     ///
     /// It reads an id from the stream and gives back which node belongs to
     /// it. It is possible only if there was read an "id" named map.
-    Node readId(std::istream& is, Node = Node()) const {
-      return inverter->read(is);
+    void readId(std::istream& is, Node& node) const {
+      node = inverter->read(is);
     } 
 
   private:
@@ -904,6 +926,8 @@
     template <typename Reader, typename Map, typename MapParameter>
     EdgeSetReader& _readMap(std::string name, MapParameter map, 
 			    const Reader& reader = Reader()) {
+      checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
+      checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
       if (readers.find(name) != readers.end()) {
 	ErrorMessage msg;
 	msg << "Multiple read rule for edge map: " << name;
@@ -995,8 +1019,8 @@
     ///
     /// It reads an id from the stream and gives back which edge belongs to
     /// it. It is possible only if there was read an "id" named map.
-    Edge readId(std::istream& is, Edge = Edge()) const {
-      return inverter->read(is);
+    void readId(std::istream& is, Edge& edge) const {
+      edge = inverter->read(is);
     } 
 
   private:
@@ -1124,6 +1148,8 @@
     template <typename Reader, typename Map, typename MapParameter>
     UndirEdgeSetReader& _readMap(std::string name, MapParameter map,
 				 const Reader& reader = Reader()) {
+      checkConcept<concept::WriteMap<UndirEdge, typename Map::Value>, Map>();
+      checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
       if (readers.find(name) != readers.end()) {
 	ErrorMessage msg;
 	msg << "Multiple read rule for edge map: " << name;
@@ -1190,7 +1216,9 @@
 
     template <typename Reader, typename Map, typename MapParameter>
     UndirEdgeSetReader& _readDirMap(std::string name, MapParameter map,
-				    const Reader& reader = Reader()) {
+				    const Reader& reader = Reader()) { 
+      checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
+      checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
       readMap("+" + name, 
 	      _reader_bits::writeComposeMap(map, forwardMap(graph)), reader);
       readMap("-" + name, 
@@ -1275,8 +1303,8 @@
     ///
     /// It reads an id from the stream and gives back which undirected edge 
     /// belongs to it. It is possible only if there was read an "id" named map.
-    UndirEdge readId(std::istream& is, UndirEdge = UndirEdge()) const {
-      return inverter->read(is);
+    void readId(std::istream& is, UndirEdge& undirEdge) const {
+      undirEdge = inverter->read(is);
     } 
 
     /// \brief Gives back the directed edge by its id.
@@ -1285,14 +1313,14 @@
     /// belongs to it. The directed edge id is the \c '+' or \c '-' character
     /// and the undirected edge id. It is possible only if there was read 
     /// an "id" named map.
-    Edge readId(std::istream& is, Edge = Edge()) const {
+    void readId(std::istream& is, Edge& edge) const {
       char c;
       is >> c;
       UndirEdge undirEdge = inverter->read(is);
       if (c == '+') {
-	return graph.edgeWithSource(undirEdge, graph.source(undirEdge));
+	edge = graph.edgeWithSource(undirEdge, graph.source(undirEdge));
       } else if (c == '-') {
-	return graph.edgeWithSource(undirEdge, graph.target(undirEdge));
+        edge = graph.edgeWithSource(undirEdge, graph.target(undirEdge));
       } else {
 	throw DataFormatError("Wrong id format for edge "
 			      "in undirected edgeset");
@@ -1340,7 +1368,7 @@
 	       const std::string& _id = std::string()) 
       : Parent(_reader), id(_id) {
       checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
-      idReader.reset(new IdReader<Node, _IdReader>(_idReader));
+      nodeIdReader.reset(new IdReader<Node, _IdReader>(_idReader));
     }
 
     /// \brief Destructor.
@@ -1385,7 +1413,7 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      if (!idReader->isIdReader()) {
+      if (!nodeIdReader->isIdReader()) {
 	throw DataFormatError("Cannot find nodeset or ID map");
       }
       std::string line;
@@ -1395,7 +1423,7 @@
 	ls >> id;
 	typename NodeReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
-	  *(it->second) = idReader->read(ls); 
+	  *(it->second) = nodeIdReader->read(ls); 
 	}	
       }
     }
@@ -1406,7 +1434,7 @@
 
     typedef std::map<std::string, Node*> NodeReaders;
     NodeReaders readers;
-    std::auto_ptr<IdReaderBase<Node> > idReader;
+    std::auto_ptr<IdReaderBase<Node> > nodeIdReader;
   };
 
   /// \ingroup io_group
@@ -1437,7 +1465,7 @@
 	       const std::string& _id = std::string()) 
       : Parent(_reader), id(_id) {
       checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
-      idReader.reset(new IdReader<Edge, _IdReader>(_idReader));
+      edgeIdReader.reset(new IdReader<Edge, _IdReader>(_idReader));
     }
 
     /// \brief Destructor.
@@ -1481,7 +1509,7 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      if (!idReader->isIdReader()) {
+      if (!edgeIdReader->isIdReader()) {
 	throw DataFormatError("Cannot find edgeset or ID map");
       }
       std::string line;
@@ -1491,7 +1519,7 @@
 	ls >> id;
 	typename EdgeReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
-	  *(it->second) = idReader->read(ls); 
+	  *(it->second) = edgeIdReader->read(ls); 
 	}	
       }
     }
@@ -1502,7 +1530,7 @@
 
     typedef std::map<std::string, Edge*> EdgeReaders;
     EdgeReaders readers;
-    std::auto_ptr<IdReaderBase<Edge> > idReader;
+    std::auto_ptr<IdReaderBase<Edge> > edgeIdReader;
   };
 
   /// \ingroup io_group
@@ -1688,6 +1716,7 @@
     template <typename Reader, typename Value>
     AttributeReader& readAttribute(const std::string& name, Value& value,
 				   const Reader& reader = Reader()) {
+      checkConcept<_reader_bits::ItemReader<Value>, Reader>();
       if (readers.find(name) != readers.end()) {
 	ErrorMessage msg;
 	msg << "Multiple read rule for attribute: " << name;
diff -r 340514805e40 -r 0d58f0301923 lemon/lemon_writer.h
--- a/lemon/lemon_writer.h	Tue Jun 14 23:21:31 2005 +0000
+++ b/lemon/lemon_writer.h	Wed Jun 15 10:10:59 2005 +0000
@@ -55,13 +55,31 @@
       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;
+	const Item& item;
+      };
+
+    };
+
+    template <typename Item>
+    class ItemWriter {
+    public:
+
+      void write(std::ostream&, const Item&) {}
+      
+      template <class _ItemWriter>
+      struct Constraints {
+	void constraints() {
+	  writer.write(os, item);
+	}
+	_ItemWriter& writer;
+	std::ostream& os;
+	const Item& item;
       };
 
     };
@@ -352,7 +370,8 @@
     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>();
+      checkConcept<concept::ReadMap<Node, typename Map::Value>, Map>();
+      checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
       writers.push_back(
 	make_pair(name, new MapWriter<Node, Map, Writer>(map, writer)));
       return *this;
@@ -517,7 +536,8 @@
     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>();
+      checkConcept<concept::ReadMap<Edge, typename Map::Value>, Map>();
+      checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
       writers.push_back(
 	make_pair(name, new MapWriter<Edge, Map, Writer>(map, writer)));
       return *this;
@@ -698,7 +718,8 @@
     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>();
+      checkConcept<concept::ReadMap<UndirEdge, typename Map::Value>, Map>();
+      checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
       writers.push_back(
 	make_pair(name, new MapWriter<UndirEdge, Map, Writer>(map, writer)));
       return *this;
@@ -709,10 +730,8 @@
     /// 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;
+      return writeEdgeMap<typename Traits::
+	template Writer<typename Map::Value>, Map>(name, map);
     }
 
     /// \brief Add a new directed map writer command for the writer.
@@ -721,7 +740,8 @@
     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>();
+      checkConcept<concept::ReadMap<Edge, typename Map::Value>, Map>();
+      checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
       writeUndirEdge("+" + name, composeMap(forwardMap(graph), map), writer);
       writeUndirEdge("-" + name, composeMap(backwardMap(graph), map), writer);
       return *this;
@@ -1160,6 +1180,7 @@
     AttributeWriter& writeAttribute(const std::string& name, 
 				    const Value& value,
 				    const Writer& writer = Writer()) {
+      checkConcept<_writer_bits::ItemWriter<Value>, Writer>();
       writers.push_back(make_pair(name, new ValueWriter<Value, Writer>
       			       (value, writer)));
       return *this;