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 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 + class ItemReader { + public: + void read(std::istream&, Item&) {} + + template + struct Constraints { + void constraints() { + Item item; + reader.read(is, item); + } + _ItemReader& reader; + std::istream& is; + }; + + }; template 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 NodeSetReader& _readMap(std::string name, MapParameter map, const Reader& reader = Reader()) { + checkConcept, Map>(); + checkConcept<_reader_bits::ItemReader, 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 EdgeSetReader& _readMap(std::string name, MapParameter map, const Reader& reader = Reader()) { + checkConcept, Map>(); + checkConcept<_reader_bits::ItemReader, 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 UndirEdgeSetReader& _readMap(std::string name, MapParameter map, const Reader& reader = Reader()) { + checkConcept, Map>(); + checkConcept<_reader_bits::ItemReader, Reader>(); if (readers.find(name) != readers.end()) { ErrorMessage msg; msg << "Multiple read rule for edge map: " << name; @@ -1190,7 +1216,9 @@ template UndirEdgeSetReader& _readDirMap(std::string name, MapParameter map, - const Reader& reader = Reader()) { + const Reader& reader = Reader()) { + checkConcept<_reader_bits::ItemReader, Reader>(); + checkConcept, 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, _IdReader>(); - idReader.reset(new IdReader(_idReader)); + nodeIdReader.reset(new 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 NodeReaders; NodeReaders readers; - std::auto_ptr > idReader; + std::auto_ptr > nodeIdReader; }; /// \ingroup io_group @@ -1437,7 +1465,7 @@ const std::string& _id = std::string()) : Parent(_reader), id(_id) { checkConcept<_reader_bits::ItemIdReader, _IdReader>(); - idReader.reset(new IdReader(_idReader)); + edgeIdReader.reset(new 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 EdgeReaders; EdgeReaders readers; - std::auto_ptr > idReader; + std::auto_ptr > edgeIdReader; }; /// \ingroup io_group @@ -1688,6 +1716,7 @@ template AttributeReader& readAttribute(const std::string& name, Value& value, const Reader& reader = Reader()) { + checkConcept<_reader_bits::ItemReader, Reader>(); if (readers.find(name) != readers.end()) { ErrorMessage msg; msg << "Multiple read rule for attribute: " << name;