lemon/lemon_writer.h
changeset 1476 182da222fceb
parent 1435 8e85e6bbefdf
child 1492 0d58f0301923
     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));