# HG changeset patch # User deba # Date 1116503382 0 # Node ID 4283998fb2be8e4f4ff82c53dce18a1b8e7e6d5d # Parent 9ba88ddc629c4740598c95e1f3fb1a70a58b3daa Able to read edge from undirected edgeset Graph reader and graph writer can resolve items by id. It makes possible: GraphReader reader(std::cin, graph); reader.readNodeMap.... NewEdgeSetAdaptor edgeset(graph); UndirEdgeSetReader unir_edgeset_reader(reader, edgeset, reader); reader.run(); It reads the graph and an additional edgeset in to the edgeset. diff -r 9ba88ddc629c -r 4283998fb2be src/lemon/bits/item_reader.h --- a/src/lemon/bits/item_reader.h Thu May 19 11:46:42 2005 +0000 +++ b/src/lemon/bits/item_reader.h Thu May 19 11:49:42 2005 +0000 @@ -348,7 +348,7 @@ void read(std::istream& is, Value& value) const { char c; - if (!(is >> c)) return; + if (!(is >> std::ws >> c)) return; is.putback(c); switch (c) { case '\"': diff -r 9ba88ddc629c -r 4283998fb2be src/lemon/bits/item_writer.h --- a/src/lemon/bits/item_writer.h Thu May 19 11:46:42 2005 +0000 +++ b/src/lemon/bits/item_writer.h Thu May 19 11:49:42 2005 +0000 @@ -177,6 +177,10 @@ } }; + template <> + class DefaultWriter + : public QuotedStringWriter {}; + template class DefaultWriter > : public IterableWriter > {}; diff -r 9ba88ddc629c -r 4283998fb2be src/lemon/graph_reader.h --- a/src/lemon/graph_reader.h Thu May 19 11:46:42 2005 +0000 +++ b/src/lemon/graph_reader.h Thu May 19 11:49:42 2005 +0000 @@ -299,6 +299,22 @@ reader->run(); } + /// \brief Gives back the node by its id. + /// + /// 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 node map. + Node readId(std::istream& is, Node) const { + return nodeset_reader.readId(is, Node()); + } + + /// \brief Gives back the edge by its id. + /// + /// 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 edge map. + Edge readId(std::istream& is, Edge) const { + return edgeset_reader.readId(is, Edge()); + } + private: LemonReader* reader; @@ -673,6 +689,13 @@ /// \brief Add a new labeled edge reader for the reader. /// /// Add a new labeled edge reader for the reader. + UndirGraphReader& readEdge(std::string name, Edge& edge) { + undir_edge_reader.readEdge(name, edge); + } + + /// \brief Add a new labeled undirected edge reader for the reader. + /// + /// Add a new labeled undirected edge reader for the reader. UndirGraphReader& readUndirEdge(std::string name, UndirEdge& edge) { undir_edge_reader.readUndirEdge(name, edge); } @@ -713,6 +736,32 @@ reader->run(); } + /// \brief Gives back the node by its id. + /// + /// 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 node map. + Node readId(std::istream& is, Node) const { + return nodeset_reader.readId(is, Node()); + } + + /// \brief Gives back the edge by its id. + /// + /// 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 edge map. + Edge readId(std::istream& is, Edge) const { + return undir_edgeset_reader.readId(is, Edge()); + } + + /// \brief Gives back the undirected edge by its id. + /// + /// 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 + /// edge map. + UndirEdge readId(std::istream& is, UndirEdge) const { + return undir_edgeset_reader.readId(is, UndirEdge()); + } + + private: LemonReader* reader; diff -r 9ba88ddc629c -r 4283998fb2be src/lemon/graph_writer.h --- a/src/lemon/graph_writer.h Thu May 19 11:46:42 2005 +0000 +++ b/src/lemon/graph_writer.h Thu May 19 11:49:42 2005 +0000 @@ -238,6 +238,22 @@ writer->run(); } + /// \brief Write the id of the given node. + /// + /// It writes the id of the given node. If there was written an "id" + /// named node map then it will write the map value belongs to the node. + void writeId(std::ostream& os, const Node& item) const { + nodeset_writer.writeId(os, item); + } + + /// \brief Write the id of the given edge. + /// + /// It writes the id of the given edge. If there was written an "id" + /// named edge map then it will write the map value belongs to the edge. + void writeId(std::ostream& os, const Edge& item) const { + edgeset_writer.writeId(os, item); + } + private: LemonWriter* writer; @@ -547,6 +563,13 @@ /// \brief Add a new labeled edge writer for the writer. /// /// Add a new labeled edge writer for the writer. + UndirGraphWriter& writeEdge(std::string name, const Edge& edge) { + undir_edge_writer.writeEdge(name, edge); + } + + /// \brief Add a new labeled undirected edge writer for the writer. + /// + /// Add a new labeled undirected edge writer for the writer. UndirGraphWriter& writeUndirEdge(std::string name, const UndirEdge& edge) { undir_edge_writer.writeUndirEdge(name, edge); } @@ -587,6 +610,32 @@ writer->run(); } + /// \brief Write the id of the given node. + /// + /// It writes the id of the given node. If there was written an "id" + /// named node map then it will write the map value belongs to the node. + void writeId(std::ostream& os, const Node& item) const { + nodeset_writer.writeId(os, item); + } + + /// \brief Write the id of the given edge. + /// + /// It writes the id of the given edge. If there was written an "id" + /// named edge map then it will write the map value belongs to the edge. + void writeId(std::ostream& os, const Edge& item) const { + undir_edgeset_writer.writeId(os, item); + } + + /// \brief Write the id of the given undirected edge. + /// + /// It writes the id of the given undirected edge. If there was written + /// an "id" named edge map then it will write the map value belongs to + /// the edge. + void writeId(std::ostream& os, const UndirEdge& item) const { + undir_edgeset_writer.writeId(os, item); + } + + private: LemonWriter* writer; 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 diff -r 9ba88ddc629c -r 4283998fb2be src/lemon/lemon_writer.h --- a/src/lemon/lemon_writer.h Thu May 19 11:46:42 2005 +0000 +++ b/src/lemon/lemon_writer.h Thu May 19 11:49:42 2005 +0000 @@ -243,7 +243,7 @@ : idWriter(_idWriter) {} virtual void write(std::ostream& os, const Item& item) const { - return idWriter.writeId(os, item); + idWriter.writeId(os, item); } }; }; @@ -273,7 +273,7 @@ typedef _Graph Graph; typedef _Traits Traits; - typedef typename Graph::Node Item; + typedef typename Graph::Node Node; /// \brief Constructor. /// @@ -319,7 +319,7 @@ NodeSetWriter& writeNodeMap(std::string name, const Map& map, const Writer& writer = Writer()) { writers.push_back( - make_pair(name, new MapWriter(map, writer))); + make_pair(name, new MapWriter(map, writer))); return *this; } @@ -379,7 +379,7 @@ /// named map then it will write the map value belongs to the node. /// Otherwise if the \c forceId parameter was true it will write /// its id in the graph. - void writeId(std::ostream& os, const Item& item) const { + void writeId(std::ostream& os, const Node& item) const { if (forceIdMap) { os << graph.id(item); } else { @@ -389,10 +389,10 @@ private: - typedef std::vector*> > MapWriters; + typedef std::vector*> > MapWriters; MapWriters writers; - WriterBase* idMap; + WriterBase* idMap; bool forceIdMap; typename SmartConstReference::Type graph; @@ -430,7 +430,8 @@ typedef _Graph Graph; typedef _Traits Traits; - typedef typename Graph::Edge Item; + typedef typename Graph::Node Node; + typedef typename Graph::Edge Edge; /// \brief Constructor. /// @@ -446,8 +447,7 @@ bool _forceIdMap = true) : Parent(_writer), idMap(0), forceIdMap(_forceIdMap), graph(_graph), id(_id), - nodeIdWriter(new IdWriter - (_nodeIdWriter)) {} + nodeIdWriter(new IdWriter(_nodeIdWriter)) {} /// \brief Destructor. /// @@ -481,7 +481,7 @@ EdgeSetWriter& writeEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { writers.push_back( - make_pair(name, new MapWriter(map, writer))); + make_pair(name, new MapWriter(map, writer))); return *this; } @@ -546,7 +546,7 @@ /// named map then it will write the map value belongs to the edge. /// Otherwise if the \c forceId parameter was true it will write /// its id in the graph. - void writeId(std::ostream& os, const Item& item) const { + void writeId(std::ostream& os, const Edge& item) const { if (forceIdMap) { os << graph.id(item); } else { @@ -556,16 +556,16 @@ private: - typedef std::vector*> > MapWriters; + typedef std::vector*> > MapWriters; MapWriters writers; - WriterBase* idMap; + WriterBase* idMap; bool forceIdMap; typename SmartConstReference::Type graph; std::string id; - std::auto_ptr > nodeIdWriter; + std::auto_ptr > nodeIdWriter; }; /// \ingroup io_group @@ -604,7 +604,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; /// \brief Constructor. /// @@ -620,8 +622,7 @@ bool _forceIdMap = true) : Parent(_writer), idMap(0), forceIdMap(_forceIdMap), graph(_graph), id(_id), - nodeIdWriter(new IdWriter - (_nodeIdWriter)) {} + nodeIdWriter(new IdWriter(_nodeIdWriter)) {} /// \brief Destructor. /// @@ -655,7 +656,7 @@ UndirEdgeSetWriter& writeUndirEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { writers.push_back( - make_pair(name, new MapWriter(map, writer))); + make_pair(name, new MapWriter(map, writer))); return *this; } @@ -742,7 +743,27 @@ /// an "id" named map then it will write the map value belongs to the /// undirected edge. Otherwise if the \c forceId parameter was true it /// will write its id in the graph. - void writeId(std::ostream& os, const Item& item) const { + void writeId(std::ostream& os, const UndirEdge& item) const { + if (forceIdMap) { + os << graph.id(item); + } else { + idMap->write(os, item); + } + } + + /// \brief Write the id of the given edge. + /// + /// It writes the id of the given edge. If there was written + /// an "id" named map then it will write the map value belongs to the + /// edge. Otherwise if the \c forceId parameter was true it + /// will write its id in the graph. If the edge is forward map + /// then its prefix character is \c '+' elsewhere \c '-'. + void writeId(std::ostream& os, const Edge& item) const { + if (graph.forward(item)) { + os << "+ "; + } else { + os << "- "; + } if (forceIdMap) { os << graph.id(item); } else { @@ -752,16 +773,17 @@ private: - typedef std::vector*> > MapWriters; + typedef std::vector*> > MapWriters; MapWriters writers; - WriterBase* idMap; + WriterBase* idMap; bool forceIdMap; typename SmartConstReference::Type graph; std::string id; - std::auto_ptr > nodeIdWriter; + std::auto_ptr > nodeIdWriter; }; /// \ingroup io_group @@ -778,7 +800,7 @@ class NodeWriter : public CommonSectionWriterBase { typedef CommonSectionWriterBase Parent; typedef _Graph Graph; - typedef typename Graph::Node Item; + typedef typename Graph::Node Node; public: /// \brief Constructor. @@ -806,7 +828,7 @@ /// \brief Add a node writer command for the NodeWriter. /// /// Add a node writer command for the NodeWriter. - void writeNode(const std::string& name, const Item& item) { + void writeNode(const std::string& name, const Node& item) { writers.push_back(make_pair(name, &item)); } @@ -835,9 +857,9 @@ std::string id; - typedef std::vector > ItemWriters; - ItemWriters writers; - std::auto_ptr > idWriter; + typedef std::vector > NodeWriters; + NodeWriters writers; + std::auto_ptr > idWriter; }; /// \ingroup io_group @@ -854,7 +876,7 @@ class EdgeWriter : public CommonSectionWriterBase { typedef CommonSectionWriterBase Parent; typedef _Graph Graph; - typedef typename Graph::Edge Item; + typedef typename Graph::Edge Edge; public: /// \brief Constructor. @@ -881,7 +903,7 @@ /// \brief Add an edge writer command for the EdgeWriter. /// /// Add an edge writer command for the EdgeWriter. - void writeEdge(const std::string& name, const Item& item) { + void writeEdge(const std::string& name, const Edge& item) { writers.push_back(make_pair(name, &item)); } @@ -910,10 +932,10 @@ std::string id; - typedef std::vector > ItemWriters; - ItemWriters writers; + typedef std::vector > EdgeWriters; + EdgeWriters writers; - std::auto_ptr > idWriter; + std::auto_ptr > idWriter; }; /// \ingroup io_group @@ -930,7 +952,9 @@ class UndirEdgeWriter : public CommonSectionWriterBase { typedef CommonSectionWriterBase Parent; typedef _Graph Graph; - typedef typename Graph::UndirEdge Item; + typedef typename Graph::Node Node; + typedef typename Graph::Edge Edge; + typedef typename Graph::UndirEdge UndirEdge; public: /// \brief Constructor. @@ -943,8 +967,8 @@ UndirEdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter, const std::string& _id = std::string()) : Parent(_writer), id(_id), - idWriter(new IdWriter - (_idWriter)) {} + undirEdgeIdWriter(new IdWriter(_idWriter)), + edgeIdWriter(new IdWriter(_idWriter)) {} /// \brief Destructor. /// @@ -956,11 +980,18 @@ public: + /// \brief Add an edge writer command for the UndirEdgeWriter. + /// + /// Add an edge writer command for the UndirEdgeWriter. + void writeEdge(const std::string& name, const Edge& item) { + edgeWriters.push_back(make_pair(name, &item)); + } + /// \brief Add an undirected edge writer command for the UndirEdgeWriter. /// - /// Add an edge writer command for the UndirEdgeWriter. - void writeUndirEdge(const std::string& name, const Item& item) { - writers.push_back(make_pair(name, &item)); + /// Add an undirected edge writer command for the UndirEdgeWriter. + void writeUndirEdge(const std::string& name, const UndirEdge& item) { + undirEdgeWriters.push_back(make_pair(name, &item)); } protected: @@ -970,16 +1001,21 @@ /// It gives back true when the header line start with \c \@undiredges, /// and the header line's id and the writer's id are the same. virtual std::string header() { - return "@edges " + id; + return "@undiredges " + id; } /// \brief Writer function of the section. /// /// Write the content of the section. virtual void write(std::ostream& os) { - for (int i = 0; i < (int)writers.size(); ++i) { - os << writers[i].first << ' '; - idWriter->write(os, *(writers[i].second)); + for (int i = 0; i < (int)undirEdgeWriters.size(); ++i) { + os << undirEdgeWriters[i].first << ' '; + undirEdgeIdWriter->write(os, *(undirEdgeWriters[i].second)); + os << std::endl; + } + for (int i = 0; i < (int)edgeWriters.size(); ++i) { + os << edgeWriters[i].first << ' '; + edgeIdWriter->write(os, *(edgeWriters[i].second)); os << std::endl; } } @@ -988,10 +1024,15 @@ std::string id; - typedef std::vector > ItemWriters; - ItemWriters writers; + typedef std::vector > UndirEdgeWriters; + UndirEdgeWriters undirEdgeWriters; + std::auto_ptr > undirEdgeIdWriter; - std::auto_ptr > idWriter; + typedef std::vector > EdgeWriters; + EdgeWriters edgeWriters; + std::auto_ptr > edgeIdWriter; + }; /// \ingroup io_group