# 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 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; 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 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 + class ItemWriter { + public: + + void write(std::ostream&, const Item&) {} + + template + struct Constraints { + void constraints() { + writer.write(os, item); + } + _ItemWriter& writer; + std::ostream& os; + const Item& item; }; }; @@ -352,7 +370,8 @@ template NodeSetWriter& writeNodeMap(std::string name, const Map& map, const Writer& writer = Writer()) { - checkConcept, Map>(); + checkConcept, Map>(); + checkConcept<_writer_bits::ItemWriter, Writer>(); writers.push_back( make_pair(name, new MapWriter(map, writer))); return *this; @@ -517,7 +536,8 @@ template EdgeSetWriter& writeEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { - checkConcept, Map>(); + checkConcept, Map>(); + checkConcept<_writer_bits::ItemWriter, Writer>(); writers.push_back( make_pair(name, new MapWriter(map, writer))); return *this; @@ -698,7 +718,8 @@ template UndirEdgeSetWriter& writeUndirEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { - checkConcept, Map>(); + checkConcept, Map>(); + checkConcept<_writer_bits::ItemWriter, Writer>(); writers.push_back( make_pair(name, new MapWriter(map, writer))); return *this; @@ -709,10 +730,8 @@ /// Add a new directed map writer command for the writer. template UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map) { - checkConcept, Map>(); - writeUndirEdgeMap("+" + name, composeMap(forwardMap(graph), map)); - writeUndirEdgeMap("-" + name, composeMap(backwardMap(graph), map)); - return *this; + return writeEdgeMap, Map>(name, map); } /// \brief Add a new directed map writer command for the writer. @@ -721,7 +740,8 @@ template UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { - checkConcept, Map>(); + checkConcept, Map>(); + checkConcept<_writer_bits::ItemWriter, 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, Writer>(); writers.push_back(make_pair(name, new ValueWriter (value, writer))); return *this;