488 /// |
491 /// |
489 /// Construct a directed graph reader, which reads from the given |
492 /// Construct a directed graph reader, which reads from the given |
490 /// input stream. |
493 /// input stream. |
491 DigraphReader(std::istream& is, Digraph& digraph) |
494 DigraphReader(std::istream& is, Digraph& digraph) |
492 : _is(&is), local_is(false), _digraph(digraph), |
495 : _is(&is), local_is(false), _digraph(digraph), |
493 _use_nodes(false), _use_arcs(false) {} |
496 _use_nodes(false), _use_arcs(false), |
|
497 _skip_nodes(false), _skip_arcs(false) {} |
494 |
498 |
495 /// \brief Constructor |
499 /// \brief Constructor |
496 /// |
500 /// |
497 /// Construct a directed graph reader, which reads from the given |
501 /// Construct a directed graph reader, which reads from the given |
498 /// file. |
502 /// file. |
499 DigraphReader(const std::string& fn, Digraph& digraph) |
503 DigraphReader(const std::string& fn, Digraph& digraph) |
500 : _is(new std::ifstream(fn.c_str())), local_is(true), _digraph(digraph), |
504 : _is(new std::ifstream(fn.c_str())), local_is(true), _digraph(digraph), |
501 _use_nodes(false), _use_arcs(false) {} |
505 _use_nodes(false), _use_arcs(false), |
|
506 _skip_nodes(false), _skip_arcs(false) {} |
502 |
507 |
503 /// \brief Constructor |
508 /// \brief Constructor |
504 /// |
509 /// |
505 /// Construct a directed graph reader, which reads from the given |
510 /// Construct a directed graph reader, which reads from the given |
506 /// file. |
511 /// file. |
507 DigraphReader(const char* fn, Digraph& digraph) |
512 DigraphReader(const char* fn, Digraph& digraph) |
508 : _is(new std::ifstream(fn)), local_is(true), _digraph(digraph), |
513 : _is(new std::ifstream(fn)), local_is(true), _digraph(digraph), |
509 _use_nodes(false), _use_arcs(false) {} |
514 _use_nodes(false), _use_arcs(false), |
|
515 _skip_nodes(false), _skip_arcs(false) {} |
510 |
516 |
511 /// \brief Copy constructor |
517 /// \brief Copy constructor |
512 /// |
518 /// |
513 /// The copy constructor transfers all data from the other reader, |
519 /// The copy constructor transfers all data from the other reader, |
514 /// therefore the copied reader will not be usable more. |
520 /// therefore the copied reader will not be usable more. |
515 DigraphReader(DigraphReader& other) |
521 DigraphReader(DigraphReader& other) |
516 : _is(other._is), local_is(other.local_is), _digraph(other._digraph), |
522 : _is(other._is), local_is(other.local_is), _digraph(other._digraph), |
517 _use_nodes(other._use_nodes), _use_arcs(other._use_arcs) { |
523 _use_nodes(other._use_nodes), _use_arcs(other._use_arcs), |
|
524 _skip_nodes(other._skip_nodes), _skip_arcs(other._skip_arcs) { |
518 |
525 |
519 other._is = 0; |
526 other._is = 0; |
520 other.local_is = false; |
527 other.local_is = false; |
521 |
528 |
522 _node_index.swap(other._node_index); |
529 _node_index.swap(other._node_index); |
835 /// Use previously constructed arc set, and specify the arc |
842 /// Use previously constructed arc set, and specify the arc |
836 /// label map and a functor which converts the label map values to |
843 /// label map and a functor which converts the label map values to |
837 /// std::string. |
844 /// std::string. |
838 template <typename Map, typename Converter> |
845 template <typename Map, typename Converter> |
839 DigraphReader& useArcs(const Map& map, |
846 DigraphReader& useArcs(const Map& map, |
840 const Converter& converter = Converter()) { |
847 const Converter& converter = Converter()) { |
841 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); |
848 checkConcept<concepts::ReadMap<Arc, typename Map::Value>, Map>(); |
842 LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member"); |
849 LEMON_ASSERT(!_use_arcs, "Multiple usage of useArcs() member"); |
843 _use_arcs = true; |
850 _use_arcs = true; |
844 for (ArcIt a(_digraph); a != INVALID; ++a) { |
851 for (ArcIt a(_digraph); a != INVALID; ++a) { |
845 _arc_index.insert(std::make_pair(converter(map[a]), a)); |
852 _arc_index.insert(std::make_pair(converter(map[a]), a)); |
846 } |
853 } |
|
854 return *this; |
|
855 } |
|
856 |
|
857 /// \brief Skips the reading of node section |
|
858 /// |
|
859 /// Omit the reading of the node section. This implies that each node |
|
860 /// map reading rule will be abanoned, and the nodes of the graph |
|
861 /// will not be constructed, which usually cause that the arc set |
|
862 /// could not be read due to lack of node name |
|
863 /// resolving. Therefore, the \c skipArcs() should be used too, or |
|
864 /// the useNodes() member function should be used to specify the |
|
865 /// label of the nodes. |
|
866 DigraphReader& skipNodes() { |
|
867 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); |
|
868 _skip_nodes = true; |
|
869 return *this; |
|
870 } |
|
871 |
|
872 /// \brief Skips the reading of arc section |
|
873 /// |
|
874 /// Omit the reading of the arc section. This implies that each arc |
|
875 /// map reading rule will be abanoned, and the arcs of the graph |
|
876 /// will not be constructed. |
|
877 DigraphReader& skipArcs() { |
|
878 LEMON_ASSERT(!_skip_arcs, "Skip arcs already set"); |
|
879 _skip_arcs = true; |
847 return *this; |
880 return *this; |
848 } |
881 } |
849 |
882 |
850 /// @} |
883 /// @} |
851 |
884 |
1304 /// |
1340 /// |
1305 /// Construct a undirected graph reader, which reads from the given |
1341 /// Construct a undirected graph reader, which reads from the given |
1306 /// input stream. |
1342 /// input stream. |
1307 GraphReader(std::istream& is, Graph& graph) |
1343 GraphReader(std::istream& is, Graph& graph) |
1308 : _is(&is), local_is(false), _graph(graph), |
1344 : _is(&is), local_is(false), _graph(graph), |
1309 _use_nodes(false), _use_edges(false) {} |
1345 _use_nodes(false), _use_edges(false), |
|
1346 _skip_nodes(false), _skip_edges(false) {} |
1310 |
1347 |
1311 /// \brief Constructor |
1348 /// \brief Constructor |
1312 /// |
1349 /// |
1313 /// Construct a undirected graph reader, which reads from the given |
1350 /// Construct a undirected graph reader, which reads from the given |
1314 /// file. |
1351 /// file. |
1315 GraphReader(const std::string& fn, Graph& graph) |
1352 GraphReader(const std::string& fn, Graph& graph) |
1316 : _is(new std::ifstream(fn.c_str())), local_is(true), _graph(graph), |
1353 : _is(new std::ifstream(fn.c_str())), local_is(true), _graph(graph), |
1317 _use_nodes(false), _use_edges(false) {} |
1354 _use_nodes(false), _use_edges(false), |
|
1355 _skip_nodes(false), _skip_edges(false) {} |
1318 |
1356 |
1319 /// \brief Constructor |
1357 /// \brief Constructor |
1320 /// |
1358 /// |
1321 /// Construct a undirected graph reader, which reads from the given |
1359 /// Construct a undirected graph reader, which reads from the given |
1322 /// file. |
1360 /// file. |
1323 GraphReader(const char* fn, Graph& graph) |
1361 GraphReader(const char* fn, Graph& graph) |
1324 : _is(new std::ifstream(fn)), local_is(true), _graph(graph), |
1362 : _is(new std::ifstream(fn)), local_is(true), _graph(graph), |
1325 _use_nodes(false), _use_edges(false) {} |
1363 _use_nodes(false), _use_edges(false), |
|
1364 _skip_nodes(false), _skip_edges(false) {} |
1326 |
1365 |
1327 /// \brief Copy constructor |
1366 /// \brief Copy constructor |
1328 /// |
1367 /// |
1329 /// The copy constructor transfers all data from the other reader, |
1368 /// The copy constructor transfers all data from the other reader, |
1330 /// therefore the copied reader will not be usable more. |
1369 /// therefore the copied reader will not be usable more. |
1331 GraphReader(GraphReader& other) |
1370 GraphReader(GraphReader& other) |
1332 : _is(other._is), local_is(other.local_is), _graph(other._graph), |
1371 : _is(other._is), local_is(other.local_is), _graph(other._graph), |
1333 _use_nodes(other._use_nodes), _use_edges(other._use_edges) { |
1372 _use_nodes(other._use_nodes), _use_edges(other._use_edges), |
|
1373 _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) { |
1334 |
1374 |
1335 other._is = 0; |
1375 other._is = 0; |
1336 other.local_is = false; |
1376 other.local_is = false; |
1337 |
1377 |
1338 _node_index.swap(other._node_index); |
1378 _node_index.swap(other._node_index); |
1707 _edge_index.insert(std::make_pair(converter(map[a]), a)); |
1747 _edge_index.insert(std::make_pair(converter(map[a]), a)); |
1708 } |
1748 } |
1709 return *this; |
1749 return *this; |
1710 } |
1750 } |
1711 |
1751 |
|
1752 /// \brief Skips the reading of node section |
|
1753 /// |
|
1754 /// Omit the reading of the node section. This implies that each node |
|
1755 /// map reading rule will be abanoned, and the nodes of the graph |
|
1756 /// will not be constructed, which usually cause that the edge set |
|
1757 /// could not be read due to lack of node name |
|
1758 /// resolving. Therefore, the \c skipEdges() should be used too, or |
|
1759 /// the useNodes() member function should be used to specify the |
|
1760 /// label of the nodes. |
|
1761 GraphReader& skipNodes() { |
|
1762 LEMON_ASSERT(!_skip_nodes, "Skip nodes already set"); |
|
1763 _skip_nodes = true; |
|
1764 return *this; |
|
1765 } |
|
1766 |
|
1767 /// \brief Skips the reading of edge section |
|
1768 /// |
|
1769 /// Omit the reading of the edge section. This implies that each edge |
|
1770 /// map reading rule will be abanoned, and the edges of the graph |
|
1771 /// will not be constructed. |
|
1772 GraphReader& skipEdges() { |
|
1773 LEMON_ASSERT(!_skip_edges, "Skip edges already set"); |
|
1774 _skip_edges = true; |
|
1775 return *this; |
|
1776 } |
|
1777 |
1712 /// @} |
1778 /// @} |
1713 |
1779 |
1714 private: |
1780 private: |
1715 |
1781 |
1716 bool readLine() { |
1782 bool readLine() { |