diff -r 9ba88ddc629c -r 4283998fb2be src/lemon/lemon_reader.h --- a/src/lemon/lemon_reader.h Thu May 19 11:46:42 2005 +0000 +++ b/src/lemon/lemon_reader.h Thu May 19 11:49:42 2005 +0000 @@ -545,7 +545,7 @@ : boxedIdReader(_boxedIdReader) {} virtual Item read(std::istream& is) const { - return boxedIdReader.readId(is); + return boxedIdReader.readId(is, Item()); } }; @@ -597,7 +597,7 @@ typedef _Graph Graph; typedef _Traits Traits; - typedef typename Graph::Node Item; + typedef typename Graph::Node Node; typedef typename Traits::Skipper DefaultSkipper; /// \brief Constructor. @@ -652,17 +652,15 @@ template NodeSetReader& readNodeMap(std::string name, Map& map, const Reader& reader = Reader()) { - return _readMap< - typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map, reader); + return _readMap::Type> + (name, map, reader); } template NodeSetReader& readNodeMap(std::string name, const Map& map, const Reader& reader = Reader()) { - return _readMap< - typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map, reader); + return _readMap::Type> + (name, map, reader); } private: @@ -676,7 +674,7 @@ throw IOParameterError(msg.message()); } readers.insert( - make_pair(name, new MapReader(map, reader))); + make_pair(name, new MapReader(map, reader))); return *this; } @@ -693,7 +691,7 @@ msg << "Multiple read rule for node map: " << name; throw IOParameterError(msg.message()); } - readers.insert(make_pair(name, new SkipReader(reader))); + readers.insert(make_pair(name, new SkipReader(reader))); return *this; } @@ -716,7 +714,7 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { - std::vector* > index; + std::vector* > index; std::string line; getline(is, line); @@ -734,7 +732,7 @@ } } while (getline(is, line)) { - typename Graph::Node node = graph.addNode(); + Node node = graph.addNode(); std::istringstream ls(line); for (int i = 0; i < (int)index.size(); ++i) { index[i]->read(ls, node); @@ -756,20 +754,20 @@ /// /// 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. - Item readId(std::istream& is) const { + Node readId(std::istream& is, Node = Node()) const { return inverter->read(is); } private: - typedef std::map*> MapReaders; + typedef std::map*> MapReaders; MapReaders readers; typename SmartReference::Type graph; std::string id; - SkipReader skipper; + SkipReader skipper; - std::auto_ptr > inverter; + std::auto_ptr > inverter; }; /// \ingroup io_group @@ -801,7 +799,8 @@ typedef _Graph Graph; typedef _Traits Traits; - typedef typename Graph::Edge Item; + typedef typename Graph::Node Node; + typedef typename Graph::Edge Edge; typedef typename Traits::Skipper DefaultSkipper; /// \brief Constructor. @@ -819,8 +818,7 @@ const std::string& _id = std::string(), const DefaultSkipper& _skipper = DefaultSkipper()) : Parent(_reader), graph(_graph), id(_id), skipper(_skipper), - nodeIdReader(new IdReader - (_nodeIdReader)) {} + nodeIdReader(new IdReader(_nodeIdReader)) {} /// \brief Destructor. /// @@ -861,16 +859,14 @@ template EdgeSetReader& readEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) { - return _readMap< - typename Traits::template Reader, Map, + return _readMap::Type>(name, map, reader); } template EdgeSetReader& readEdgeMap(std::string name, const Map& map, const Reader& reader = Reader()) { - return _readMap< - typename Traits::template Reader, Map, + return _readMap::Type>(name, map, reader); } @@ -885,7 +881,7 @@ throw IOParameterError(msg.message()); } readers.insert( - make_pair(name, new MapReader(map, reader))); + make_pair(name, new MapReader(map, reader))); return *this; } @@ -902,7 +898,7 @@ msg << "Multiple read rule for edge map: " << name; throw IOParameterError(msg.message()); } - readers.insert(make_pair(name, new SkipReader(reader))); + readers.insert(make_pair(name, new SkipReader(reader))); return *this; } @@ -925,7 +921,7 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { - std::vector* > index; + std::vector* > index; std::string line; getline(is, line); @@ -944,9 +940,9 @@ } while (getline(is, line)) { std::istringstream ls(line); - typename Graph::Node from = nodeIdReader->read(ls); - typename Graph::Node to = nodeIdReader->read(ls); - typename Graph::Edge edge = graph.addEdge(from, to); + Node from = nodeIdReader->read(ls); + Node to = nodeIdReader->read(ls); + Edge edge = graph.addEdge(from, to); for (int i = 0; i < (int)index.size(); ++i) { index[i]->read(ls, edge); } @@ -967,21 +963,21 @@ /// /// 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. - Item readId(std::istream& is) const { + Edge readId(std::istream& is, Edge = Edge()) const { return inverter->read(is); } private: - typedef std::map*> MapReaders; + typedef std::map*> MapReaders; MapReaders readers; typename SmartReference::Type graph; std::string id; - SkipReader skipper; + SkipReader skipper; - std::auto_ptr > inverter; - std::auto_ptr > nodeIdReader; + std::auto_ptr > inverter; + std::auto_ptr > nodeIdReader; }; /// \ingroup io_group @@ -1018,7 +1014,9 @@ typedef _Graph Graph; typedef _Traits Traits; - typedef typename Graph::UndirEdge Item; + typedef typename Graph::Node Node; + typedef typename Graph::Edge Edge; + typedef typename Graph::UndirEdge UndirEdge; typedef typename Traits::Skipper DefaultSkipper; /// \brief Constructor. @@ -1036,8 +1034,7 @@ const std::string& _id = std::string(), const DefaultSkipper& _skipper = DefaultSkipper()) : Parent(_reader), graph(_graph), id(_id), skipper(_skipper), - nodeIdReader(new IdReader - (_nodeIdReader)) {} + nodeIdReader(new IdReader(_nodeIdReader)) {} /// \brief Destructor. /// @@ -1100,7 +1097,7 @@ throw IOParameterError(msg.message()); } readers.insert( - make_pair(name, new MapReader(map, reader))); + make_pair(name, new MapReader(map, reader))); return *this; } @@ -1117,7 +1114,8 @@ msg << "Multiple read rule for node map: " << name; throw IOParameterError(msg.message()); } - readers.insert(make_pair(name, new SkipReader(reader))); + readers.insert(make_pair(name, + new SkipReader(reader))); return *this; } @@ -1199,7 +1197,7 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { - std::vector* > index; + std::vector* > index; std::string line; getline(is, line); @@ -1218,9 +1216,9 @@ } while (getline(is, line)) { std::istringstream ls(line); - typename Graph::Node from = nodeIdReader->read(ls); - typename Graph::Node to = nodeIdReader->read(ls); - typename Graph::UndirEdge edge = graph.addEdge(from, to); + Node from = nodeIdReader->read(ls); + Node to = nodeIdReader->read(ls); + UndirEdge edge = graph.addEdge(from, to); for (int i = 0; i < (int)index.size(); ++i) { index[i]->read(ls, edge); } @@ -1241,21 +1239,41 @@ /// /// 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. - Item readId(std::istream& is) const { + UndirEdge readId(std::istream& is, UndirEdge = UndirEdge()) const { return inverter->read(is); } + /// \brief Gives back the directed edge by its id. + /// + /// It reads an id from the stream and gives back which directed edge + /// 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 { + char c; + is >> c; + UndirEdge undirEdge = inverter->read(is); + if (c == '+') { + return graph.edgeWithSource(undirEdge, graph.source(undirEdge)); + } else if (c == '-') { + return graph.edgeWithSource(undirEdge, graph.target(undirEdge)); + } else { + throw DataFormatError("Wrong id format for edge " + "in undirected edgeset"); + } + } + private: - typedef std::map*> MapReaders; + typedef std::map*> MapReaders; MapReaders readers; typename SmartReference::Type graph; std::string id; - SkipReader skipper; + SkipReader skipper; - std::auto_ptr > inverter; - std::auto_ptr > nodeIdReader; + std::auto_ptr > inverter; + std::auto_ptr > nodeIdReader; }; /// \ingroup io_group @@ -1272,7 +1290,7 @@ class NodeReader : public CommonSectionReaderBase { typedef CommonSectionReaderBase Parent; typedef _Graph Graph; - typedef typename Graph::Node Item; + typedef typename Graph::Node Node; public: /// \brief Constructor. @@ -1301,7 +1319,7 @@ /// \brief Add a node reader command for the NodeReader. /// /// Add a node reader command for the NodeReader. - void readNode(const std::string& name, Item& item) { + void readNode(const std::string& name, Node& item) { if (readers.find(name) != readers.end()) { ErrorMessage msg; msg << "Multiple read rule for node: " << name; @@ -1334,7 +1352,7 @@ std::istringstream ls(line); std::string id; ls >> id; - typename ItemReaders::iterator it = readers.find(id); + typename NodeReaders::iterator it = readers.find(id); if (it != readers.end()) { *(it->second) = idReader->read(ls); } @@ -1345,9 +1363,9 @@ std::string id; - typedef std::map ItemReaders; - ItemReaders readers; - std::auto_ptr > idReader; + typedef std::map NodeReaders; + NodeReaders readers; + std::auto_ptr > idReader; }; /// \ingroup io_group @@ -1364,7 +1382,7 @@ class EdgeReader : public CommonSectionReaderBase { typedef CommonSectionReaderBase Parent; typedef _Graph Graph; - typedef typename Graph::Edge Item; + typedef typename Graph::Edge Edge; public: /// \brief Constructor. @@ -1392,7 +1410,7 @@ /// \brief Add an edge reader command for the EdgeReader. /// /// Add an edge reader command for the EdgeReader. - void readEdge(const std::string& name, Item& item) { + void readEdge(const std::string& name, Edge& item) { if (readers.find(name) != readers.end()) { ErrorMessage msg; msg << "Multiple read rule for edge: " << name; @@ -1425,7 +1443,7 @@ std::istringstream ls(line); std::string id; ls >> id; - typename ItemReaders::iterator it = readers.find(id); + typename EdgeReaders::iterator it = readers.find(id); if (it != readers.end()) { *(it->second) = idReader->read(ls); } @@ -1436,9 +1454,9 @@ std::string id; - typedef std::map ItemReaders; - ItemReaders readers; - std::auto_ptr > idReader; + typedef std::map EdgeReaders; + EdgeReaders readers; + std::auto_ptr > idReader; }; /// \ingroup io_group @@ -1455,7 +1473,8 @@ class UndirEdgeReader : public CommonSectionReaderBase { typedef CommonSectionReaderBase Parent; typedef _Graph Graph; - typedef typename Graph::UndirEdge Item; + typedef typename Graph::Edge Edge; + typedef typename Graph::UndirEdge UndirEdge; public: /// \brief Constructor. @@ -1469,7 +1488,8 @@ UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader, const std::string& _id = std::string()) : Parent(_reader), id(_id), - idReader(new IdReader(_idReader)) + undirEdgeIdReader(new IdReader(_idReader)), + edgeIdReader(new IdReader(_idReader)) {} /// \brief Destructor. @@ -1485,13 +1505,25 @@ /// \brief Add an undirected edge reader command for the UndirEdgeReader. /// /// Add an undirected edge reader command for the UndirEdgeReader. - void readUndirEdge(const std::string& name, Item& item) { - if (readers.find(name) != readers.end()) { + void readUndirEdge(const std::string& name, UndirEdge& item) { + if (undirEdgeReaders.find(name) != undirEdgeReaders.end()) { + ErrorMessage msg; + msg << "Multiple read rule for undirected edge: " << name; + throw IOParameterError(msg.message()); + } + undirEdgeReaders.insert(make_pair(name, &item)); + } + + /// \brief Add an edge reader command for the UndirEdgeReader. + /// + /// Add an edge reader command for the UndirEdgeReader. + void readEdge(const std::string& name, Edge& item) { + if (edgeReaders.find(name) != edgeReaders.end()) { ErrorMessage msg; msg << "Multiple read rule for edge: " << name; throw IOParameterError(msg.message()); } - readers.insert(make_pair(name, &item)); + edgeReaders.insert(make_pair(name, &item)); } protected: @@ -1506,7 +1538,7 @@ std::string command; std::string name; ls >> command >> name; - return command == "@edges" && name == id; + return command == "@undiredges" && name == id; } /// \brief Reader function of the section. @@ -1518,10 +1550,19 @@ std::istringstream ls(line); std::string id; ls >> id; - typename ItemReaders::iterator it = readers.find(id); - if (it != readers.end()) { - *(it->second) = idReader->read(ls); - } + { + typename UndirEdgeReaders::iterator it = undirEdgeReaders.find(id); + if (it != undirEdgeReaders.end()) { + *(it->second) = undirEdgeIdReader->read(ls); + break; + } + } { + typename EdgeReaders::iterator it = edgeReaders.find(id); + if (it != edgeReaders.end()) { + *(it->second) = edgeIdReader->read(ls); + break; + } + } } } @@ -1529,9 +1570,13 @@ std::string id; - typedef std::map ItemReaders; - ItemReaders readers; - std::auto_ptr > idReader; + typedef std::map UndirEdgeReaders; + UndirEdgeReaders undirEdgeReaders; + std::auto_ptr > undirEdgeIdReader; + + typedef std::map EdgeReaders; + EdgeReaders edgeReaders; + std::auto_ptr > edgeIdReader; }; /// \ingroup io_group