lemon/lemon_reader.h
changeset 1476 182da222fceb
parent 1435 8e85e6bbefdf
child 1477 0d32f7947a00
     1.1 --- a/lemon/lemon_reader.h	Mon Jun 13 16:10:36 2005 +0000
     1.2 +++ b/lemon/lemon_reader.h	Mon Jun 13 17:13:56 2005 +0000
     1.3 @@ -36,10 +36,33 @@
     1.4  #include <lemon/utility.h>
     1.5  #include <lemon/bits/item_reader.h>
     1.6  
     1.7 +#include <lemon/concept_check.h>
     1.8 +#include <lemon/concept/maps.h>
     1.9  
    1.10  namespace lemon {
    1.11  
    1.12    namespace _reader_bits {
    1.13 +
    1.14 +    template <typename Item>
    1.15 +    class ItemIdReader {
    1.16 +    public:
    1.17 +
    1.18 +      bool isIdReader() { return true; }
    1.19 +
    1.20 +      Item readId(std::istream&, Item) { return Item();}
    1.21 +      
    1.22 +      template <class _ItemIdReader>
    1.23 +      struct Constraints {
    1.24 +	void constraints() {
    1.25 +	  bool b = reader.isIdReader();
    1.26 +	  ignore_unused_variable_warning(b);
    1.27 +	  Item item = reader.readId(is, Item());
    1.28 +	}
    1.29 +	_ItemIdReader& reader;
    1.30 +	std::istream& is;
    1.31 +      };
    1.32 +
    1.33 +    };
    1.34    
    1.35      template <typename T>
    1.36      bool operator<(T, T) {
    1.37 @@ -531,6 +554,7 @@
    1.38      public:
    1.39        typedef _Item Item;
    1.40        virtual Item read(std::istream& is) const = 0;
    1.41 +      virtual bool isIdReader() const = 0;
    1.42      };
    1.43  
    1.44      template <typename _Item, typename _BoxedIdReader>
    1.45 @@ -547,6 +571,10 @@
    1.46        virtual Item read(std::istream& is) const {
    1.47  	return boxedIdReader.readId(is, Item());
    1.48        }
    1.49 +
    1.50 +      virtual bool isIdReader() const {
    1.51 +	return boxedIdReader.isIdReader();
    1.52 +      }
    1.53      };
    1.54  
    1.55      class ValueReaderBase {
    1.56 @@ -817,9 +845,10 @@
    1.57  		  const NodeIdReader& _nodeIdReader, 
    1.58  		  const std::string& _id = std::string(),
    1.59  		  const DefaultSkipper& _skipper = DefaultSkipper()) 
    1.60 -      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
    1.61 -	nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 
    1.62 -
    1.63 +      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
    1.64 +      checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
    1.65 +      nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
    1.66 +    }
    1.67      /// \brief Destructor.
    1.68      ///
    1.69      /// Destructor for EdgeSetReader.
    1.70 @@ -921,6 +950,9 @@
    1.71      ///
    1.72      /// It reads the content of the section.
    1.73      virtual void read(std::istream& is) {
    1.74 +      if (!nodeIdReader->isIdReader()) {
    1.75 +	throw DataFormatError("Cannot find nodeset or ID map");
    1.76 +      }
    1.77        std::vector<ReaderBase<Edge>* > index;
    1.78        std::string line;
    1.79  
    1.80 @@ -1033,9 +1065,10 @@
    1.81  		       const NodeIdReader& _nodeIdReader, 
    1.82  		       const std::string& _id = std::string(),
    1.83  		       const DefaultSkipper& _skipper = DefaultSkipper()) 
    1.84 -      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
    1.85 -	nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 
    1.86 -
    1.87 +      : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
    1.88 +      checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
    1.89 +      nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
    1.90 +    }
    1.91      /// \brief Destructor.
    1.92      ///
    1.93      /// Destructor for UndirEdgeSetReader.
    1.94 @@ -1197,6 +1230,9 @@
    1.95      ///
    1.96      /// It reads the content of the section.
    1.97      virtual void read(std::istream& is) {
    1.98 +      if (!nodeIdReader->isIdReader()) {
    1.99 +	throw DataFormatError("Cannot find nodeset or ID map");
   1.100 +      }
   1.101        std::vector<ReaderBase<UndirEdge>* > index;
   1.102        std::string line;
   1.103  
   1.104 @@ -1302,8 +1338,10 @@
   1.105      template <typename _IdReader>
   1.106      NodeReader(LemonReader& _reader, const _IdReader& _idReader, 
   1.107  	       const std::string& _id = std::string()) 
   1.108 -      : Parent(_reader), id(_id), 
   1.109 -	idReader(new IdReader<typename Graph::Node, _IdReader>(_idReader)) {} 
   1.110 +      : Parent(_reader), id(_id) {
   1.111 +      checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
   1.112 +      idReader.reset(new IdReader<Node, _IdReader>(_idReader));
   1.113 +    }
   1.114  
   1.115      /// \brief Destructor.
   1.116      ///
   1.117 @@ -1347,6 +1385,9 @@
   1.118      ///
   1.119      /// It reads the content of the section.
   1.120      virtual void read(std::istream& is) {
   1.121 +      if (!idReader->isIdReader()) {
   1.122 +	throw DataFormatError("Cannot find nodeset or ID map");
   1.123 +      }
   1.124        std::string line;
   1.125        while (getline(is, line)) {
   1.126  	std::istringstream ls(line);
   1.127 @@ -1394,8 +1435,10 @@
   1.128      template <typename _IdReader>
   1.129      EdgeReader(LemonReader& _reader, const _IdReader& _idReader, 
   1.130  	       const std::string& _id = std::string()) 
   1.131 -      : Parent(_reader), id(_id), 
   1.132 -	idReader(new IdReader<typename Graph::Edge, _IdReader>(_idReader)) {} 
   1.133 +      : Parent(_reader), id(_id) {
   1.134 +      checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
   1.135 +      idReader.reset(new IdReader<Edge, _IdReader>(_idReader));
   1.136 +    }
   1.137  
   1.138      /// \brief Destructor.
   1.139      ///
   1.140 @@ -1438,6 +1481,9 @@
   1.141      ///
   1.142      /// It reads the content of the section.
   1.143      virtual void read(std::istream& is) {
   1.144 +      if (!idReader->isIdReader()) {
   1.145 +	throw DataFormatError("Cannot find edgeset or ID map");
   1.146 +      }
   1.147        std::string line;
   1.148        while (getline(is, line)) {
   1.149  	std::istringstream ls(line);
   1.150 @@ -1487,10 +1533,12 @@
   1.151      template <typename _IdReader>
   1.152      UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader, 
   1.153  	       const std::string& _id = std::string()) 
   1.154 -      : Parent(_reader), id(_id), 
   1.155 -	undirEdgeIdReader(new IdReader<UndirEdge, _IdReader>(_idReader)),
   1.156 -	edgeIdReader(new IdReader<Edge, _IdReader>(_idReader))
   1.157 -    {} 
   1.158 +      : Parent(_reader), id(_id) {
   1.159 +      checkConcept<_reader_bits::ItemIdReader<UndirEdge>, _IdReader>();
   1.160 +      checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
   1.161 +      undirEdgeIdReader.reset(new IdReader<UndirEdge, _IdReader>(_idReader));
   1.162 +      egdeIdReader.reset(new IdReader<Edge, _IdReader>(_idReader));
   1.163 +    }
   1.164  
   1.165      /// \brief Destructor.
   1.166      ///
   1.167 @@ -1545,6 +1593,12 @@
   1.168      ///
   1.169      /// It reads the content of the section.
   1.170      virtual void read(std::istream& is) {
   1.171 +      if (!edgeIdReader->isIdReader()) {
   1.172 +	throw DataFormatError("Cannot find undirected edgeset or ID map");
   1.173 +      }
   1.174 +      if (!undirEdgeIdReader->isIdReader()) {
   1.175 +	throw DataFormatError("Cannot find undirected edgeset or ID map");
   1.176 +      }
   1.177        std::string line;
   1.178        while (getline(is, line)) {
   1.179  	std::istringstream ls(line);