lemon/lgf_reader.h
changeset 188 70694e6bdcac
parent 186 9159de5e9657
child 189 a63ed81c57ba
equal deleted inserted replaced
15:f55be02578b0 16:dede6b043875
   477     Sections _sections;
   477     Sections _sections;
   478 
   478 
   479     bool _use_nodes;
   479     bool _use_nodes;
   480     bool _use_arcs;
   480     bool _use_arcs;
   481 
   481 
       
   482     bool _skip_nodes;
       
   483     bool _skip_arcs;
       
   484 
   482     int line_num;
   485     int line_num;
   483     std::istringstream line;
   486     std::istringstream line;
   484 
   487 
   485   public:
   488   public:
   486 
   489 
   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 
  1150       LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
  1183       LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
  1151       if (!*_is) {
  1184       if (!*_is) {
  1152 	throw DataFormatError("Cannot find file");
  1185 	throw DataFormatError("Cannot find file");
  1153       }
  1186       }
  1154       
  1187       
  1155       bool nodes_done = false;
  1188       bool nodes_done = _skip_nodes;
  1156       bool arcs_done = false;
  1189       bool arcs_done = _skip_arcs;
  1157       bool attributes_done = false;
  1190       bool attributes_done = false;
  1158       std::set<std::string> extra_sections;
  1191       std::set<std::string> extra_sections;
  1159 
  1192 
  1160       line_num = 0;      
  1193       line_num = 0;      
  1161       readLine();
  1194       readLine();
  1293     Sections _sections;
  1326     Sections _sections;
  1294 
  1327 
  1295     bool _use_nodes;
  1328     bool _use_nodes;
  1296     bool _use_edges;
  1329     bool _use_edges;
  1297 
  1330 
       
  1331     bool _skip_nodes;
       
  1332     bool _skip_edges;
       
  1333 
  1298     int line_num;
  1334     int line_num;
  1299     std::istringstream line;
  1335     std::istringstream line;
  1300 
  1336 
  1301   public:
  1337   public:
  1302 
  1338 
  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() {
  2010     /// This function starts the batch processing
  2076     /// This function starts the batch processing
  2011     void run() {
  2077     void run() {
  2012       
  2078       
  2013       LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
  2079       LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
  2014       
  2080       
  2015       bool nodes_done = false;
  2081       bool nodes_done = _skip_nodes;
  2016       bool edges_done = false;
  2082       bool edges_done = _skip_edges;
  2017       bool attributes_done = false;
  2083       bool attributes_done = false;
  2018       std::set<std::string> extra_sections;
  2084       std::set<std::string> extra_sections;
  2019 
  2085 
  2020       line_num = 0;      
  2086       line_num = 0;      
  2021       readLine();
  2087       readLine();