1.1 --- a/lemon/lemon_writer.h Mon Jun 13 16:10:36 2005 +0000
1.2 +++ b/lemon/lemon_writer.h Mon Jun 13 17:13:56 2005 +0000
1.3 @@ -36,9 +36,38 @@
1.4 #include <lemon/utility.h>
1.5 #include <lemon/maps.h>
1.6
1.7 +#include <lemon/concept_check.h>
1.8 +#include <lemon/concept/maps.h>
1.9 +
1.10
1.11 namespace lemon {
1.12
1.13 + namespace _writer_bits {
1.14 +
1.15 + template <typename Item>
1.16 + class ItemIdWriter {
1.17 + public:
1.18 +
1.19 + bool isIdWriter() { return true; }
1.20 +
1.21 + void writeId(std::ostream&, const Item&) {}
1.22 +
1.23 + template <class _ItemIdWriter>
1.24 + struct Constraints {
1.25 + void constraints() {
1.26 + const Item item;
1.27 + bool b = writer.isIdWriter();
1.28 + ignore_unused_variable_warning(b);
1.29 + writer.writeId(os, item);
1.30 + }
1.31 + _ItemIdWriter& writer;
1.32 + std::ostream& os;
1.33 + };
1.34 +
1.35 + };
1.36 +
1.37 + }
1.38 +
1.39 /// \ingroup io_group
1.40 /// \brief Lemon Format writer class.
1.41 ///
1.42 @@ -229,6 +258,7 @@
1.43 public:
1.44 typedef _Item Item;
1.45 virtual void write(std::ostream&, const Item&) const = 0;
1.46 + virtual bool isIdWriter() const = 0;
1.47 };
1.48
1.49 template <typename _Item, typename _BoxedIdWriter>
1.50 @@ -245,6 +275,10 @@
1.51 virtual void write(std::ostream& os, const Item& item) const {
1.52 idWriter.writeId(os, item);
1.53 }
1.54 +
1.55 + virtual bool isIdWriter() const {
1.56 + return idWriter.isIdWriter();
1.57 + }
1.58 };
1.59 };
1.60
1.61 @@ -318,6 +352,7 @@
1.62 template <typename Writer, typename Map>
1.63 NodeSetWriter& writeNodeMap(std::string name, const Map& map,
1.64 const Writer& writer = Writer()) {
1.65 + checkConcept<concept::WriteMap<Node, typename Map::Value>, Map>();
1.66 writers.push_back(
1.67 make_pair(name, new MapWriter<Node, Map, Writer>(map, writer)));
1.68 return *this;
1.69 @@ -446,8 +481,10 @@
1.70 const std::string& _id = std::string(),
1.71 bool _forceIdMap = true)
1.72 : Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
1.73 - graph(_graph), id(_id),
1.74 - nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {}
1.75 + graph(_graph), id(_id) {
1.76 + checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
1.77 + nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
1.78 + }
1.79
1.80 /// \brief Destructor.
1.81 ///
1.82 @@ -480,6 +517,7 @@
1.83 template <typename Writer, typename Map>
1.84 EdgeSetWriter& writeEdgeMap(std::string name, const Map& map,
1.85 const Writer& writer = Writer()) {
1.86 + checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
1.87 writers.push_back(
1.88 make_pair(name, new MapWriter<Edge, Map, Writer>(map, writer)));
1.89 return *this;
1.90 @@ -498,6 +536,9 @@
1.91 ///
1.92 /// Write the content of the section.
1.93 virtual void write(std::ostream& os) {
1.94 + if (!nodeIdWriter->isIdWriter()) {
1.95 + throw DataFormatError("Cannot find nodeset or ID map");
1.96 + }
1.97 for (int i = 0; i < (int)writers.size(); ++i) {
1.98 if (writers[i].first == "id") {
1.99 idMap = writers[i].second;
1.100 @@ -621,8 +662,10 @@
1.101 const std::string& _id = std::string(),
1.102 bool _forceIdMap = true)
1.103 : Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
1.104 - graph(_graph), id(_id),
1.105 - nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {}
1.106 + graph(_graph), id(_id) {
1.107 + checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
1.108 + nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
1.109 + }
1.110
1.111 /// \brief Destructor.
1.112 ///
1.113 @@ -655,6 +698,7 @@
1.114 template <typename Writer, typename Map>
1.115 UndirEdgeSetWriter& writeUndirEdgeMap(std::string name, const Map& map,
1.116 const Writer& writer = Writer()) {
1.117 + checkConcept<concept::WriteMap<UndirEdge, typename Map::Value>, Map>();
1.118 writers.push_back(
1.119 make_pair(name, new MapWriter<UndirEdge, Map, Writer>(map, writer)));
1.120 return *this;
1.121 @@ -665,6 +709,7 @@
1.122 /// Add a new directed map writer command for the writer.
1.123 template <typename Map>
1.124 UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map) {
1.125 + checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
1.126 writeUndirEdgeMap("+" + name, composeMap(forwardMap(graph), map));
1.127 writeUndirEdgeMap("-" + name, composeMap(backwardMap(graph), map));
1.128 return *this;
1.129 @@ -676,8 +721,9 @@
1.130 template <typename Writer, typename Map>
1.131 UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map,
1.132 const Writer& writer = Writer()) {
1.133 + checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
1.134 writeUndirEdge("+" + name, composeMap(forwardMap(graph), map), writer);
1.135 - writeUndirEdge("-" + name, composeMap(forwardMap(graph), map), writer);
1.136 + writeUndirEdge("-" + name, composeMap(backwardMap(graph), map), writer);
1.137 return *this;
1.138 }
1.139
1.140 @@ -694,6 +740,9 @@
1.141 ///
1.142 /// Write the content of the section.
1.143 virtual void write(std::ostream& os) {
1.144 + if (!nodeIdWriter->isIdWriter()) {
1.145 + throw DataFormatError("Cannot find nodeset or ID map");
1.146 + }
1.147 for (int i = 0; i < (int)writers.size(); ++i) {
1.148 if (writers[i].first == "id") {
1.149 idMap = writers[i].second;
1.150 @@ -811,8 +860,11 @@
1.151 template <typename _IdWriter>
1.152 NodeWriter(LemonWriter& _writer, const _IdWriter& _idWriter,
1.153 const std::string& _id = std::string())
1.154 - : Parent(_writer), id(_id),
1.155 - idWriter(new IdWriter<typename Graph::Node, _IdWriter>(_idWriter)) {}
1.156 + : Parent(_writer), id(_id) {
1.157 + checkConcept<_writer_bits::ItemIdWriter<Node>, _IdWriter>();
1.158 + idWriter.reset(new IdWriter<Node, _IdWriter>(_idWriter));
1.159 + }
1.160 +
1.161
1.162 /// \brief Destructor.
1.163 ///
1.164 @@ -846,6 +898,9 @@
1.165 ///
1.166 /// Write the content of the section.
1.167 virtual void write(std::ostream& os) {
1.168 + if (!idWriter->isIdWriter()) {
1.169 + throw DataFormatError("Cannot find nodeset or ID map");
1.170 + }
1.171 for (int i = 0; i < (int)writers.size(); ++i) {
1.172 os << writers[i].first << ' ';
1.173 idWriter->write(os, *(writers[i].second));
1.174 @@ -887,8 +942,10 @@
1.175 template <typename _IdWriter>
1.176 EdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter,
1.177 const std::string& _id = std::string())
1.178 - : Parent(_writer), id(_id),
1.179 - idWriter(new IdWriter<typename Graph::Edge, _IdWriter>(_idWriter)) {}
1.180 + : Parent(_writer), id(_id) {
1.181 + checkConcept<_writer_bits::ItemIdWriter<Edge>, _IdWriter>();
1.182 + idWriter.reset(new IdWriter<Edge, _IdWriter>(_idWriter));
1.183 + }
1.184
1.185 /// \brief Destructor.
1.186 ///
1.187 @@ -921,6 +978,9 @@
1.188 ///
1.189 /// Write the content of the section.
1.190 virtual void write(std::ostream& os) {
1.191 + if (!idWriter->isIdWriter()) {
1.192 + throw DataFormatError("Cannot find edgeset or ID map");
1.193 + }
1.194 for (int i = 0; i < (int)writers.size(); ++i) {
1.195 os << writers[i].first << ' ';
1.196 idWriter->write(os, *(writers[i].second));
1.197 @@ -966,9 +1026,12 @@
1.198 template <typename _IdWriter>
1.199 UndirEdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter,
1.200 const std::string& _id = std::string())
1.201 - : Parent(_writer), id(_id),
1.202 - undirEdgeIdWriter(new IdWriter<UndirEdge, _IdWriter>(_idWriter)),
1.203 - edgeIdWriter(new IdWriter<Edge, _IdWriter>(_idWriter)) {}
1.204 + : Parent(_writer), id(_id) {
1.205 + checkConcept<_writer_bits::ItemIdWriter<Edge>, _IdWriter>();
1.206 + checkConcept<_writer_bits::ItemIdWriter<UndirEdge>, _IdWriter>();
1.207 + undirEdgeIdWriter.reset(new IdWriter<UndirEdge, _IdWriter>(_idWriter));
1.208 + edgeIdWriter.reset(new IdWriter<Edge, _IdWriter>(_idWriter));
1.209 + }
1.210
1.211 /// \brief Destructor.
1.212 ///
1.213 @@ -1008,6 +1071,12 @@
1.214 ///
1.215 /// Write the content of the section.
1.216 virtual void write(std::ostream& os) {
1.217 + if (!edgeIdWriter->isIdWriter()) {
1.218 + throw DataFormatError("Cannot find undirected edgeset or ID map");
1.219 + }
1.220 + if (!undirEdgeIdWriter->isIdWriter()) {
1.221 + throw DataFormatError("Cannot find undirected edgeset or ID map");
1.222 + }
1.223 for (int i = 0; i < (int)undirEdgeWriters.size(); ++i) {
1.224 os << undirEdgeWriters[i].first << ' ';
1.225 undirEdgeIdWriter->write(os, *(undirEdgeWriters[i].second));