src/lemon/lemon_reader.h
changeset 1429 4283998fb2be
parent 1427 14c75970840e
     1.1 --- a/src/lemon/lemon_reader.h	Thu May 19 11:46:42 2005 +0000
     1.2 +++ b/src/lemon/lemon_reader.h	Thu May 19 11:49:42 2005 +0000
     1.3 @@ -545,7 +545,7 @@
     1.4  	: boxedIdReader(_boxedIdReader) {}
     1.5  
     1.6        virtual Item read(std::istream& is) const {
     1.7 -	return boxedIdReader.readId(is);
     1.8 +	return boxedIdReader.readId(is, Item());
     1.9        }
    1.10      };
    1.11  
    1.12 @@ -597,7 +597,7 @@
    1.13  
    1.14      typedef _Graph Graph;
    1.15      typedef _Traits Traits;
    1.16 -    typedef typename Graph::Node Item;
    1.17 +    typedef typename Graph::Node Node;
    1.18      typedef typename Traits::Skipper DefaultSkipper;
    1.19  
    1.20      /// \brief Constructor.
    1.21 @@ -652,17 +652,15 @@
    1.22      template <typename Reader, typename Map>
    1.23      NodeSetReader& readNodeMap(std::string name, Map& map, 
    1.24  			       const Reader& reader = Reader()) {
    1.25 -      return _readMap<
    1.26 -	typename Traits::template Reader<typename Map::Value>, Map,
    1.27 -	typename SmartParameter<Map>::Type>(name, map, reader);
    1.28 +      return _readMap<Reader, Map, typename SmartParameter<Map>::Type>
    1.29 +	(name, map, reader);
    1.30      }
    1.31  
    1.32      template <typename Reader, typename Map>
    1.33      NodeSetReader& readNodeMap(std::string name, const Map& map, 
    1.34  			       const Reader& reader = Reader()) {
    1.35 -      return _readMap<
    1.36 -	typename Traits::template Reader<typename Map::Value>, Map, 
    1.37 -	typename SmartParameter<Map>::Type>(name, map, reader);
    1.38 +      return _readMap<Reader, Map, typename SmartParameter<Map>::Type>
    1.39 +	(name, map, reader);
    1.40      }
    1.41  
    1.42    private:
    1.43 @@ -676,7 +674,7 @@
    1.44  	throw IOParameterError(msg.message());
    1.45        }
    1.46        readers.insert(
    1.47 -	make_pair(name, new MapReader<Item, Map, Reader>(map, reader)));
    1.48 +	make_pair(name, new MapReader<Node, Map, Reader>(map, reader)));
    1.49        return *this;
    1.50      }
    1.51  
    1.52 @@ -693,7 +691,7 @@
    1.53  	msg << "Multiple read rule for node map: " << name;
    1.54  	throw IOParameterError(msg.message());
    1.55        }
    1.56 -      readers.insert(make_pair(name, new SkipReader<Item, Reader>(reader)));
    1.57 +      readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader)));
    1.58        return *this;
    1.59      }
    1.60  
    1.61 @@ -716,7 +714,7 @@
    1.62      ///
    1.63      /// It reads the content of the section.
    1.64      virtual void read(std::istream& is) {
    1.65 -      std::vector<ReaderBase<Item>* > index;
    1.66 +      std::vector<ReaderBase<Node>* > index;
    1.67        std::string line;
    1.68  
    1.69        getline(is, line);
    1.70 @@ -734,7 +732,7 @@
    1.71  	}
    1.72        }
    1.73        while (getline(is, line)) {	
    1.74 -	typename Graph::Node node = graph.addNode();
    1.75 +	Node node = graph.addNode();
    1.76  	std::istringstream ls(line);
    1.77  	for (int i = 0; i < (int)index.size(); ++i) {
    1.78  	  index[i]->read(ls, node);
    1.79 @@ -756,20 +754,20 @@
    1.80      ///
    1.81      /// It reads an id from the stream and gives back which node belongs to
    1.82      /// it. It is possible only if there was read an "id" named map.
    1.83 -    Item readId(std::istream& is) const {
    1.84 +    Node readId(std::istream& is, Node = Node()) const {
    1.85        return inverter->read(is);
    1.86      } 
    1.87  
    1.88    private:
    1.89  
    1.90 -    typedef std::map<std::string, ReaderBase<Item>*> MapReaders;
    1.91 +    typedef std::map<std::string, ReaderBase<Node>*> MapReaders;
    1.92      MapReaders readers;
    1.93     
    1.94      typename SmartReference<Graph>::Type graph;   
    1.95      std::string id;
    1.96 -    SkipReader<Item, DefaultSkipper> skipper;
    1.97 +    SkipReader<Node, DefaultSkipper> skipper;
    1.98  
    1.99 -    std::auto_ptr<InverterBase<Item> > inverter;
   1.100 +    std::auto_ptr<InverterBase<Node> > inverter;
   1.101    };
   1.102  
   1.103    /// \ingroup io_group
   1.104 @@ -801,7 +799,8 @@
   1.105  
   1.106      typedef _Graph Graph;
   1.107      typedef _Traits Traits;
   1.108 -    typedef typename Graph::Edge Item;
   1.109 +    typedef typename Graph::Node Node;
   1.110 +    typedef typename Graph::Edge Edge;
   1.111      typedef typename Traits::Skipper DefaultSkipper;
   1.112  
   1.113      /// \brief Constructor.
   1.114 @@ -819,8 +818,7 @@
   1.115  		  const std::string& _id = std::string(),
   1.116  		  const DefaultSkipper& _skipper = DefaultSkipper()) 
   1.117        : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
   1.118 -	nodeIdReader(new IdReader<typename Graph::Node, NodeIdReader>
   1.119 -		     (_nodeIdReader)) {} 
   1.120 +	nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 
   1.121  
   1.122      /// \brief Destructor.
   1.123      ///
   1.124 @@ -861,16 +859,14 @@
   1.125      template <typename Reader, typename Map>
   1.126      EdgeSetReader& readEdgeMap(std::string name, Map& map, 
   1.127  			   const Reader& reader = Reader()) {
   1.128 -      return _readMap<
   1.129 -	typename Traits::template Reader<typename Map::Value>, Map,
   1.130 +      return _readMap<Reader, Map,
   1.131  	typename SmartParameter<Map>::Type>(name, map, reader);
   1.132      }
   1.133  
   1.134      template <typename Reader, typename Map>
   1.135      EdgeSetReader& readEdgeMap(std::string name, const Map& map, 
   1.136  			       const Reader& reader = Reader()) {
   1.137 -      return _readMap<
   1.138 -	typename Traits::template Reader<typename Map::Value>, Map,
   1.139 +      return _readMap<Reader, Map,
   1.140  	typename SmartParameter<Map>::Type>(name, map, reader);
   1.141      }
   1.142  
   1.143 @@ -885,7 +881,7 @@
   1.144  	throw IOParameterError(msg.message());
   1.145        }
   1.146        readers.insert(
   1.147 -	make_pair(name, new MapReader<Item, Map, Reader>(map, reader)));
   1.148 +	make_pair(name, new MapReader<Edge, Map, Reader>(map, reader)));
   1.149        return *this;
   1.150      }
   1.151  
   1.152 @@ -902,7 +898,7 @@
   1.153  	msg << "Multiple read rule for edge map: " << name;
   1.154  	throw IOParameterError(msg.message());
   1.155        }
   1.156 -      readers.insert(make_pair(name, new SkipReader<Item, Reader>(reader)));
   1.157 +      readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader)));
   1.158        return *this;
   1.159      }
   1.160  
   1.161 @@ -925,7 +921,7 @@
   1.162      ///
   1.163      /// It reads the content of the section.
   1.164      virtual void read(std::istream& is) {
   1.165 -      std::vector<ReaderBase<Item>* > index;
   1.166 +      std::vector<ReaderBase<Edge>* > index;
   1.167        std::string line;
   1.168  
   1.169        getline(is, line);
   1.170 @@ -944,9 +940,9 @@
   1.171        }
   1.172        while (getline(is, line)) {	
   1.173  	std::istringstream ls(line);
   1.174 -	typename Graph::Node from = nodeIdReader->read(ls);
   1.175 -	typename Graph::Node to = nodeIdReader->read(ls);
   1.176 -	typename Graph::Edge edge = graph.addEdge(from, to);
   1.177 +	Node from = nodeIdReader->read(ls);
   1.178 +	Node to = nodeIdReader->read(ls);
   1.179 +	Edge edge = graph.addEdge(from, to);
   1.180  	for (int i = 0; i < (int)index.size(); ++i) {
   1.181  	  index[i]->read(ls, edge);
   1.182  	}
   1.183 @@ -967,21 +963,21 @@
   1.184      ///
   1.185      /// It reads an id from the stream and gives back which edge belongs to
   1.186      /// it. It is possible only if there was read an "id" named map.
   1.187 -    Item readId(std::istream& is) const {
   1.188 +    Edge readId(std::istream& is, Edge = Edge()) const {
   1.189        return inverter->read(is);
   1.190      } 
   1.191  
   1.192    private:
   1.193  
   1.194 -    typedef std::map<std::string, ReaderBase<Item>*> MapReaders;
   1.195 +    typedef std::map<std::string, ReaderBase<Edge>*> MapReaders;
   1.196      MapReaders readers;
   1.197     
   1.198      typename SmartReference<Graph>::Type graph;   
   1.199      std::string id;
   1.200 -    SkipReader<Item, DefaultSkipper> skipper;
   1.201 +    SkipReader<Edge, DefaultSkipper> skipper;
   1.202  
   1.203 -    std::auto_ptr<InverterBase<Item> > inverter;
   1.204 -    std::auto_ptr<IdReaderBase<typename Graph::Node> > nodeIdReader;
   1.205 +    std::auto_ptr<InverterBase<Edge> > inverter;
   1.206 +    std::auto_ptr<IdReaderBase<Node> > nodeIdReader;
   1.207    };
   1.208  
   1.209    /// \ingroup io_group
   1.210 @@ -1018,7 +1014,9 @@
   1.211  
   1.212      typedef _Graph Graph;
   1.213      typedef _Traits Traits;
   1.214 -    typedef typename Graph::UndirEdge Item;
   1.215 +    typedef typename Graph::Node Node;
   1.216 +    typedef typename Graph::Edge Edge;
   1.217 +    typedef typename Graph::UndirEdge UndirEdge;
   1.218      typedef typename Traits::Skipper DefaultSkipper;
   1.219  
   1.220      /// \brief Constructor.
   1.221 @@ -1036,8 +1034,7 @@
   1.222  		       const std::string& _id = std::string(),
   1.223  		       const DefaultSkipper& _skipper = DefaultSkipper()) 
   1.224        : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
   1.225 -	nodeIdReader(new IdReader<typename Graph::Node, NodeIdReader>
   1.226 -		     (_nodeIdReader)) {} 
   1.227 +	nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 
   1.228  
   1.229      /// \brief Destructor.
   1.230      ///
   1.231 @@ -1100,7 +1097,7 @@
   1.232  	throw IOParameterError(msg.message());
   1.233        }
   1.234        readers.insert(
   1.235 -	make_pair(name, new MapReader<Item, Map, Reader>(map, reader)));
   1.236 +	make_pair(name, new MapReader<UndirEdge, Map, Reader>(map, reader)));
   1.237        return *this;
   1.238      }
   1.239  
   1.240 @@ -1117,7 +1114,8 @@
   1.241  	msg << "Multiple read rule for node map: " << name;
   1.242  	throw IOParameterError(msg.message());
   1.243        }
   1.244 -      readers.insert(make_pair(name, new SkipReader<Item, Reader>(reader)));
   1.245 +      readers.insert(make_pair(name, 
   1.246 +			       new SkipReader<UndirEdge, Reader>(reader)));
   1.247        return *this;
   1.248      }
   1.249  
   1.250 @@ -1199,7 +1197,7 @@
   1.251      ///
   1.252      /// It reads the content of the section.
   1.253      virtual void read(std::istream& is) {
   1.254 -      std::vector<ReaderBase<Item>* > index;
   1.255 +      std::vector<ReaderBase<UndirEdge>* > index;
   1.256        std::string line;
   1.257  
   1.258        getline(is, line);
   1.259 @@ -1218,9 +1216,9 @@
   1.260        }
   1.261        while (getline(is, line)) {	
   1.262  	std::istringstream ls(line);
   1.263 -	typename Graph::Node from = nodeIdReader->read(ls);
   1.264 -	typename Graph::Node to = nodeIdReader->read(ls);
   1.265 -	typename Graph::UndirEdge edge = graph.addEdge(from, to);
   1.266 +	Node from = nodeIdReader->read(ls);
   1.267 +	Node to = nodeIdReader->read(ls);
   1.268 +	UndirEdge edge = graph.addEdge(from, to);
   1.269  	for (int i = 0; i < (int)index.size(); ++i) {
   1.270  	  index[i]->read(ls, edge);
   1.271  	}
   1.272 @@ -1241,21 +1239,41 @@
   1.273      ///
   1.274      /// It reads an id from the stream and gives back which undirected edge 
   1.275      /// belongs to it. It is possible only if there was read an "id" named map.
   1.276 -    Item readId(std::istream& is) const {
   1.277 +    UndirEdge readId(std::istream& is, UndirEdge = UndirEdge()) const {
   1.278        return inverter->read(is);
   1.279      } 
   1.280  
   1.281 +    /// \brief Gives back the directed edge by its id.
   1.282 +    ///
   1.283 +    /// It reads an id from the stream and gives back which directed edge 
   1.284 +    /// belongs to it. The directed edge id is the \c '+' or \c '-' character
   1.285 +    /// and the undirected edge id. It is possible only if there was read 
   1.286 +    /// an "id" named map.
   1.287 +    Edge readId(std::istream& is, Edge = Edge()) const {
   1.288 +      char c;
   1.289 +      is >> c;
   1.290 +      UndirEdge undirEdge = inverter->read(is);
   1.291 +      if (c == '+') {
   1.292 +	return graph.edgeWithSource(undirEdge, graph.source(undirEdge));
   1.293 +      } else if (c == '-') {
   1.294 +	return graph.edgeWithSource(undirEdge, graph.target(undirEdge));
   1.295 +      } else {
   1.296 +	throw DataFormatError("Wrong id format for edge "
   1.297 +			      "in undirected edgeset");
   1.298 +      }
   1.299 +    } 
   1.300 +
   1.301    private:
   1.302  
   1.303 -    typedef std::map<std::string, ReaderBase<Item>*> MapReaders;
   1.304 +    typedef std::map<std::string, ReaderBase<UndirEdge>*> MapReaders;
   1.305      MapReaders readers;
   1.306     
   1.307      typename SmartReference<Graph>::Type graph;   
   1.308      std::string id;
   1.309 -    SkipReader<Item, DefaultSkipper> skipper;
   1.310 +    SkipReader<UndirEdge, DefaultSkipper> skipper;
   1.311  
   1.312 -    std::auto_ptr<InverterBase<Item> > inverter;
   1.313 -    std::auto_ptr<IdReaderBase<typename Graph::Node> > nodeIdReader;
   1.314 +    std::auto_ptr<InverterBase<UndirEdge> > inverter;
   1.315 +    std::auto_ptr<IdReaderBase<Node> > nodeIdReader;
   1.316    };
   1.317  
   1.318    /// \ingroup io_group
   1.319 @@ -1272,7 +1290,7 @@
   1.320    class NodeReader : public CommonSectionReaderBase {
   1.321      typedef CommonSectionReaderBase Parent;
   1.322      typedef _Graph Graph;
   1.323 -    typedef typename Graph::Node Item;
   1.324 +    typedef typename Graph::Node Node;
   1.325    public:
   1.326      
   1.327      /// \brief Constructor.
   1.328 @@ -1301,7 +1319,7 @@
   1.329      /// \brief Add a node reader command for the NodeReader.
   1.330      ///
   1.331      /// Add a node reader command for the NodeReader.
   1.332 -    void readNode(const std::string& name, Item& item) {
   1.333 +    void readNode(const std::string& name, Node& item) {
   1.334        if (readers.find(name) != readers.end()) {
   1.335  	ErrorMessage msg;
   1.336  	msg << "Multiple read rule for node: " << name;
   1.337 @@ -1334,7 +1352,7 @@
   1.338  	std::istringstream ls(line);
   1.339  	std::string id;
   1.340  	ls >> id;
   1.341 -	typename ItemReaders::iterator it = readers.find(id);
   1.342 +	typename NodeReaders::iterator it = readers.find(id);
   1.343  	if (it != readers.end()) {
   1.344  	  *(it->second) = idReader->read(ls); 
   1.345  	}	
   1.346 @@ -1345,9 +1363,9 @@
   1.347  
   1.348      std::string id;
   1.349  
   1.350 -    typedef std::map<std::string, Item*> ItemReaders;
   1.351 -    ItemReaders readers;
   1.352 -    std::auto_ptr<IdReaderBase<Item> > idReader;
   1.353 +    typedef std::map<std::string, Node*> NodeReaders;
   1.354 +    NodeReaders readers;
   1.355 +    std::auto_ptr<IdReaderBase<Node> > idReader;
   1.356    };
   1.357  
   1.358    /// \ingroup io_group
   1.359 @@ -1364,7 +1382,7 @@
   1.360    class EdgeReader : public CommonSectionReaderBase {
   1.361      typedef CommonSectionReaderBase Parent;
   1.362      typedef _Graph Graph;
   1.363 -    typedef typename Graph::Edge Item;
   1.364 +    typedef typename Graph::Edge Edge;
   1.365    public:
   1.366      
   1.367      /// \brief Constructor.
   1.368 @@ -1392,7 +1410,7 @@
   1.369      /// \brief Add an edge reader command for the EdgeReader.
   1.370      ///
   1.371      /// Add an edge reader command for the EdgeReader.
   1.372 -    void readEdge(const std::string& name, Item& item) {
   1.373 +    void readEdge(const std::string& name, Edge& item) {
   1.374        if (readers.find(name) != readers.end()) {
   1.375  	ErrorMessage msg;
   1.376  	msg << "Multiple read rule for edge: " << name;
   1.377 @@ -1425,7 +1443,7 @@
   1.378  	std::istringstream ls(line);
   1.379  	std::string id;
   1.380  	ls >> id;
   1.381 -	typename ItemReaders::iterator it = readers.find(id);
   1.382 +	typename EdgeReaders::iterator it = readers.find(id);
   1.383  	if (it != readers.end()) {
   1.384  	  *(it->second) = idReader->read(ls); 
   1.385  	}	
   1.386 @@ -1436,9 +1454,9 @@
   1.387  
   1.388      std::string id;
   1.389  
   1.390 -    typedef std::map<std::string, Item*> ItemReaders;
   1.391 -    ItemReaders readers;
   1.392 -    std::auto_ptr<IdReaderBase<Item> > idReader;
   1.393 +    typedef std::map<std::string, Edge*> EdgeReaders;
   1.394 +    EdgeReaders readers;
   1.395 +    std::auto_ptr<IdReaderBase<Edge> > idReader;
   1.396    };
   1.397  
   1.398    /// \ingroup io_group
   1.399 @@ -1455,7 +1473,8 @@
   1.400    class UndirEdgeReader : public CommonSectionReaderBase {
   1.401      typedef CommonSectionReaderBase Parent;
   1.402      typedef _Graph Graph;
   1.403 -    typedef typename Graph::UndirEdge Item;
   1.404 +    typedef typename Graph::Edge Edge;
   1.405 +    typedef typename Graph::UndirEdge UndirEdge;
   1.406    public:
   1.407      
   1.408      /// \brief Constructor.
   1.409 @@ -1469,7 +1488,8 @@
   1.410      UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader, 
   1.411  	       const std::string& _id = std::string()) 
   1.412        : Parent(_reader), id(_id), 
   1.413 -	idReader(new IdReader<typename Graph::UndirEdge, _IdReader>(_idReader))
   1.414 +	undirEdgeIdReader(new IdReader<UndirEdge, _IdReader>(_idReader)),
   1.415 +	edgeIdReader(new IdReader<Edge, _IdReader>(_idReader))
   1.416      {} 
   1.417  
   1.418      /// \brief Destructor.
   1.419 @@ -1485,13 +1505,25 @@
   1.420      /// \brief Add an undirected edge reader command for the UndirEdgeReader.
   1.421      ///
   1.422      /// Add an undirected edge reader command for the UndirEdgeReader.
   1.423 -    void readUndirEdge(const std::string& name, Item& item) {
   1.424 -      if (readers.find(name) != readers.end()) {
   1.425 +    void readUndirEdge(const std::string& name, UndirEdge& item) {
   1.426 +      if (undirEdgeReaders.find(name) != undirEdgeReaders.end()) {
   1.427 +	ErrorMessage msg;
   1.428 +	msg << "Multiple read rule for undirected edge: " << name;
   1.429 +	throw IOParameterError(msg.message());
   1.430 +      }
   1.431 +      undirEdgeReaders.insert(make_pair(name, &item));
   1.432 +    }
   1.433 +
   1.434 +    /// \brief Add an edge reader command for the UndirEdgeReader.
   1.435 +    ///
   1.436 +    /// Add an edge reader command for the UndirEdgeReader.
   1.437 +    void readEdge(const std::string& name, Edge& item) {
   1.438 +      if (edgeReaders.find(name) != edgeReaders.end()) {
   1.439  	ErrorMessage msg;
   1.440  	msg << "Multiple read rule for edge: " << name;
   1.441  	throw IOParameterError(msg.message());
   1.442        }
   1.443 -      readers.insert(make_pair(name, &item));
   1.444 +      edgeReaders.insert(make_pair(name, &item));
   1.445      }
   1.446  
   1.447    protected:
   1.448 @@ -1506,7 +1538,7 @@
   1.449        std::string command;
   1.450        std::string name;
   1.451        ls >> command >> name;
   1.452 -      return command == "@edges" && name == id;
   1.453 +      return command == "@undiredges" && name == id;
   1.454      }
   1.455  
   1.456      /// \brief Reader function of the section.
   1.457 @@ -1518,10 +1550,19 @@
   1.458  	std::istringstream ls(line);
   1.459  	std::string id;
   1.460  	ls >> id;
   1.461 -	typename ItemReaders::iterator it = readers.find(id);
   1.462 -	if (it != readers.end()) {
   1.463 -	  *(it->second) = idReader->read(ls); 
   1.464 -	}	
   1.465 +	{
   1.466 +	  typename UndirEdgeReaders::iterator it = undirEdgeReaders.find(id);
   1.467 +	  if (it != undirEdgeReaders.end()) {
   1.468 +	    *(it->second) = undirEdgeIdReader->read(ls); 
   1.469 +	    break;
   1.470 +	  }	
   1.471 +	} {
   1.472 +	  typename EdgeReaders::iterator it = edgeReaders.find(id);
   1.473 +	  if (it != edgeReaders.end()) {
   1.474 +	    *(it->second) = edgeIdReader->read(ls); 
   1.475 +	    break;
   1.476 +	  }	
   1.477 +	}
   1.478        }
   1.479      }
   1.480      
   1.481 @@ -1529,9 +1570,13 @@
   1.482  
   1.483      std::string id;
   1.484  
   1.485 -    typedef std::map<std::string, Item*> ItemReaders;
   1.486 -    ItemReaders readers;
   1.487 -    std::auto_ptr<IdReaderBase<Item> > idReader;
   1.488 +    typedef std::map<std::string, UndirEdge*> UndirEdgeReaders;
   1.489 +    UndirEdgeReaders undirEdgeReaders;
   1.490 +    std::auto_ptr<IdReaderBase<UndirEdge> > undirEdgeIdReader;
   1.491 +
   1.492 +    typedef std::map<std::string, Edge*> EdgeReaders;
   1.493 +    EdgeReaders edgeReaders;
   1.494 +    std::auto_ptr<IdReaderBase<Edge> > edgeIdReader;
   1.495    };
   1.496  
   1.497    /// \ingroup io_group