diff -r 21aa0195aab9 -r 182da222fceb lemon/lemon_writer.h --- a/lemon/lemon_writer.h Mon Jun 13 16:10:36 2005 +0000 +++ b/lemon/lemon_writer.h Mon Jun 13 17:13:56 2005 +0000 @@ -36,9 +36,38 @@ #include #include +#include +#include + namespace lemon { + namespace _writer_bits { + + template + class ItemIdWriter { + public: + + bool isIdWriter() { return true; } + + void writeId(std::ostream&, const Item&) {} + + 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; + }; + + }; + + } + /// \ingroup io_group /// \brief Lemon Format writer class. /// @@ -229,6 +258,7 @@ public: typedef _Item Item; virtual void write(std::ostream&, const Item&) const = 0; + virtual bool isIdWriter() const = 0; }; template @@ -245,6 +275,10 @@ virtual void write(std::ostream& os, const Item& item) const { idWriter.writeId(os, item); } + + virtual bool isIdWriter() const { + return idWriter.isIdWriter(); + } }; }; @@ -318,6 +352,7 @@ template NodeSetWriter& writeNodeMap(std::string name, const Map& map, const Writer& writer = Writer()) { + checkConcept, Map>(); writers.push_back( make_pair(name, new MapWriter(map, writer))); return *this; @@ -446,8 +481,10 @@ const std::string& _id = std::string(), bool _forceIdMap = true) : Parent(_writer), idMap(0), forceIdMap(_forceIdMap), - graph(_graph), id(_id), - nodeIdWriter(new IdWriter(_nodeIdWriter)) {} + graph(_graph), id(_id) { + checkConcept<_writer_bits::ItemIdWriter, NodeIdWriter>(); + nodeIdWriter.reset(new IdWriter(_nodeIdWriter)); + } /// \brief Destructor. /// @@ -480,6 +517,7 @@ template EdgeSetWriter& writeEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { + checkConcept, Map>(); writers.push_back( make_pair(name, new MapWriter(map, writer))); return *this; @@ -498,6 +536,9 @@ /// /// Write the content of the section. virtual void write(std::ostream& os) { + if (!nodeIdWriter->isIdWriter()) { + throw DataFormatError("Cannot find nodeset or ID map"); + } for (int i = 0; i < (int)writers.size(); ++i) { if (writers[i].first == "id") { idMap = writers[i].second; @@ -621,8 +662,10 @@ const std::string& _id = std::string(), bool _forceIdMap = true) : Parent(_writer), idMap(0), forceIdMap(_forceIdMap), - graph(_graph), id(_id), - nodeIdWriter(new IdWriter(_nodeIdWriter)) {} + graph(_graph), id(_id) { + checkConcept<_writer_bits::ItemIdWriter, NodeIdWriter>(); + nodeIdWriter.reset(new IdWriter(_nodeIdWriter)); + } /// \brief Destructor. /// @@ -655,6 +698,7 @@ template UndirEdgeSetWriter& writeUndirEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { + checkConcept, Map>(); writers.push_back( make_pair(name, new MapWriter(map, writer))); return *this; @@ -665,6 +709,7 @@ /// 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; @@ -676,8 +721,9 @@ template UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map, const Writer& writer = Writer()) { + checkConcept, Map>(); writeUndirEdge("+" + name, composeMap(forwardMap(graph), map), writer); - writeUndirEdge("-" + name, composeMap(forwardMap(graph), map), writer); + writeUndirEdge("-" + name, composeMap(backwardMap(graph), map), writer); return *this; } @@ -694,6 +740,9 @@ /// /// Write the content of the section. virtual void write(std::ostream& os) { + if (!nodeIdWriter->isIdWriter()) { + throw DataFormatError("Cannot find nodeset or ID map"); + } for (int i = 0; i < (int)writers.size(); ++i) { if (writers[i].first == "id") { idMap = writers[i].second; @@ -811,8 +860,11 @@ template NodeWriter(LemonWriter& _writer, const _IdWriter& _idWriter, const std::string& _id = std::string()) - : Parent(_writer), id(_id), - idWriter(new IdWriter(_idWriter)) {} + : Parent(_writer), id(_id) { + checkConcept<_writer_bits::ItemIdWriter, _IdWriter>(); + idWriter.reset(new IdWriter(_idWriter)); + } + /// \brief Destructor. /// @@ -846,6 +898,9 @@ /// /// Write the content of the section. virtual void write(std::ostream& os) { + if (!idWriter->isIdWriter()) { + throw DataFormatError("Cannot find nodeset or ID map"); + } for (int i = 0; i < (int)writers.size(); ++i) { os << writers[i].first << ' '; idWriter->write(os, *(writers[i].second)); @@ -887,8 +942,10 @@ template EdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter, const std::string& _id = std::string()) - : Parent(_writer), id(_id), - idWriter(new IdWriter(_idWriter)) {} + : Parent(_writer), id(_id) { + checkConcept<_writer_bits::ItemIdWriter, _IdWriter>(); + idWriter.reset(new IdWriter(_idWriter)); + } /// \brief Destructor. /// @@ -921,6 +978,9 @@ /// /// Write the content of the section. virtual void write(std::ostream& os) { + if (!idWriter->isIdWriter()) { + throw DataFormatError("Cannot find edgeset or ID map"); + } for (int i = 0; i < (int)writers.size(); ++i) { os << writers[i].first << ' '; idWriter->write(os, *(writers[i].second)); @@ -966,9 +1026,12 @@ template UndirEdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter, const std::string& _id = std::string()) - : Parent(_writer), id(_id), - undirEdgeIdWriter(new IdWriter(_idWriter)), - edgeIdWriter(new IdWriter(_idWriter)) {} + : Parent(_writer), id(_id) { + checkConcept<_writer_bits::ItemIdWriter, _IdWriter>(); + checkConcept<_writer_bits::ItemIdWriter, _IdWriter>(); + undirEdgeIdWriter.reset(new IdWriter(_idWriter)); + edgeIdWriter.reset(new IdWriter(_idWriter)); + } /// \brief Destructor. /// @@ -1008,6 +1071,12 @@ /// /// Write the content of the section. virtual void write(std::ostream& os) { + if (!edgeIdWriter->isIdWriter()) { + throw DataFormatError("Cannot find undirected edgeset or ID map"); + } + if (!undirEdgeIdWriter->isIdWriter()) { + throw DataFormatError("Cannot find undirected edgeset or ID map"); + } for (int i = 0; i < (int)undirEdgeWriters.size(); ++i) { os << undirEdgeWriters[i].first << ' '; undirEdgeIdWriter->write(os, *(undirEdgeWriters[i].second));