gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 1 0
merge default
0 files changed with 12 insertions and 4 deletions:
↑ Collapse diff ↑
Ignore white space 96 line context
... ...
@@ -825,97 +825,99 @@
825 825
    /// map reading rule will be abandoned, and the nodes of the graph
826 826
    /// will not be constructed, which usually cause that the arc set
827 827
    /// could not be read due to lack of node name resolving.
828 828
    /// Therefore \c skipArcs() function should also be used, or
829 829
    /// \c useNodes() should be used to specify the label of the nodes.
830 830
    DigraphReader& skipNodes() {
831 831
      LEMON_ASSERT(!_skip_nodes, "Skip nodes already set");
832 832
      _skip_nodes = true;
833 833
      return *this;
834 834
    }
835 835

	
836 836
    /// \brief Skips the reading of arc section
837 837
    ///
838 838
    /// Omit the reading of the arc section. This implies that each arc
839 839
    /// map reading rule will be abandoned, and the arcs of the graph
840 840
    /// will not be constructed.
841 841
    DigraphReader& skipArcs() {
842 842
      LEMON_ASSERT(!_skip_arcs, "Skip arcs already set");
843 843
      _skip_arcs = true;
844 844
      return *this;
845 845
    }
846 846

	
847 847
    /// @}
848 848

	
849 849
  private:
850 850

	
851 851
    bool readLine() {
852 852
      std::string str;
853 853
      while(++line_num, std::getline(*_is, str)) {
854 854
        line.clear(); line.str(str);
855 855
        char c;
856 856
        if (line >> std::ws >> c && c != '#') {
857 857
          line.putback(c);
858 858
          return true;
859 859
        }
860 860
      }
861 861
      return false;
862 862
    }
863 863

	
864 864
    bool readSuccess() {
865 865
      return static_cast<bool>(*_is);
866 866
    }
867 867

	
868 868
    void skipSection() {
869 869
      char c;
870 870
      while (readSuccess() && line >> c && c != '@') {
871 871
        readLine();
872 872
      }
873
      line.putback(c);
873
      if (readSuccess()) {
874
        line.putback(c);
875
      }
874 876
    }
875 877

	
876 878
    void readNodes() {
877 879

	
878 880
      std::vector<int> map_index(_node_maps.size());
879 881
      int map_num, label_index;
880 882

	
881 883
      char c;
882 884
      if (!readLine() || !(line >> c) || c == '@') {
883 885
        if (readSuccess() && line) line.putback(c);
884 886
        if (!_node_maps.empty())
885 887
          throw FormatError("Cannot find map names");
886 888
        return;
887 889
      }
888 890
      line.putback(c);
889 891

	
890 892
      {
891 893
        std::map<std::string, int> maps;
892 894

	
893 895
        std::string map;
894 896
        int index = 0;
895 897
        while (_reader_bits::readToken(line, map)) {
896 898
          if (maps.find(map) != maps.end()) {
897 899
            std::ostringstream msg;
898 900
            msg << "Multiple occurence of node map: " << map;
899 901
            throw FormatError(msg.str());
900 902
          }
901 903
          maps.insert(std::make_pair(map, index));
902 904
          ++index;
903 905
        }
904 906

	
905 907
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
906 908
          std::map<std::string, int>::iterator jt =
907 909
            maps.find(_node_maps[i].first);
908 910
          if (jt == maps.end()) {
909 911
            std::ostringstream msg;
910 912
            msg << "Map not found: " << _node_maps[i].first;
911 913
            throw FormatError(msg.str());
912 914
          }
913 915
          map_index[i] = jt->second;
914 916
        }
915 917

	
916 918
        {
917 919
          std::map<std::string, int>::iterator jt = maps.find("label");
918 920
          if (jt != maps.end()) {
919 921
            label_index = jt->second;
920 922
          } else {
921 923
            label_index = -1;
... ...
@@ -1654,97 +1656,99 @@
1654 1656
    /// will not be constructed, which usually cause that the edge set
1655 1657
    /// could not be read due to lack of node name
1656 1658
    /// could not be read due to lack of node name resolving.
1657 1659
    /// Therefore \c skipEdges() function should also be used, or
1658 1660
    /// \c useNodes() should be used to specify the label of the nodes.
1659 1661
    GraphReader& skipNodes() {
1660 1662
      LEMON_ASSERT(!_skip_nodes, "Skip nodes already set");
1661 1663
      _skip_nodes = true;
1662 1664
      return *this;
1663 1665
    }
1664 1666

	
1665 1667
    /// \brief Skip the reading of edge section
1666 1668
    ///
1667 1669
    /// Omit the reading of the edge section. This implies that each edge
1668 1670
    /// map reading rule will be abandoned, and the edges of the graph
1669 1671
    /// will not be constructed.
1670 1672
    GraphReader& skipEdges() {
1671 1673
      LEMON_ASSERT(!_skip_edges, "Skip edges already set");
1672 1674
      _skip_edges = true;
1673 1675
      return *this;
1674 1676
    }
1675 1677

	
1676 1678
    /// @}
1677 1679

	
1678 1680
  private:
1679 1681

	
1680 1682
    bool readLine() {
1681 1683
      std::string str;
1682 1684
      while(++line_num, std::getline(*_is, str)) {
1683 1685
        line.clear(); line.str(str);
1684 1686
        char c;
1685 1687
        if (line >> std::ws >> c && c != '#') {
1686 1688
          line.putback(c);
1687 1689
          return true;
1688 1690
        }
1689 1691
      }
1690 1692
      return false;
1691 1693
    }
1692 1694

	
1693 1695
    bool readSuccess() {
1694 1696
      return static_cast<bool>(*_is);
1695 1697
    }
1696 1698

	
1697 1699
    void skipSection() {
1698 1700
      char c;
1699 1701
      while (readSuccess() && line >> c && c != '@') {
1700 1702
        readLine();
1701 1703
      }
1702
      line.putback(c);
1704
      if (readSuccess()) {
1705
        line.putback(c);
1706
      }
1703 1707
    }
1704 1708

	
1705 1709
    void readNodes() {
1706 1710

	
1707 1711
      std::vector<int> map_index(_node_maps.size());
1708 1712
      int map_num, label_index;
1709 1713

	
1710 1714
      char c;
1711 1715
      if (!readLine() || !(line >> c) || c == '@') {
1712 1716
        if (readSuccess() && line) line.putback(c);
1713 1717
        if (!_node_maps.empty())
1714 1718
          throw FormatError("Cannot find map names");
1715 1719
        return;
1716 1720
      }
1717 1721
      line.putback(c);
1718 1722

	
1719 1723
      {
1720 1724
        std::map<std::string, int> maps;
1721 1725

	
1722 1726
        std::string map;
1723 1727
        int index = 0;
1724 1728
        while (_reader_bits::readToken(line, map)) {
1725 1729
          if (maps.find(map) != maps.end()) {
1726 1730
            std::ostringstream msg;
1727 1731
            msg << "Multiple occurence of node map: " << map;
1728 1732
            throw FormatError(msg.str());
1729 1733
          }
1730 1734
          maps.insert(std::make_pair(map, index));
1731 1735
          ++index;
1732 1736
        }
1733 1737

	
1734 1738
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
1735 1739
          std::map<std::string, int>::iterator jt =
1736 1740
            maps.find(_node_maps[i].first);
1737 1741
          if (jt == maps.end()) {
1738 1742
            std::ostringstream msg;
1739 1743
            msg << "Map not found: " << _node_maps[i].first;
1740 1744
            throw FormatError(msg.str());
1741 1745
          }
1742 1746
          map_index[i] = jt->second;
1743 1747
        }
1744 1748

	
1745 1749
        {
1746 1750
          std::map<std::string, int>::iterator jt = maps.find("label");
1747 1751
          if (jt != maps.end()) {
1748 1752
            label_index = jt->second;
1749 1753
          } else {
1750 1754
            label_index = -1;
... ...
@@ -2181,97 +2185,99 @@
2181 2185
        new _reader_bits::LineSection<Functor>(functor)));
2182 2186
      return *this;
2183 2187
    }
2184 2188

	
2185 2189

	
2186 2190
    /// \brief Add a section processor with stream oriented reading
2187 2191
    ///
2188 2192
    /// The first parameter is the type of the section, the second is
2189 2193
    /// a functor, which takes an \c std::istream& and an \c int&
2190 2194
    /// parameter, the latter regard to the line number of stream. The
2191 2195
    /// functor can read the input while the section go on, and the
2192 2196
    /// line number should be modified accordingly.
2193 2197
    template <typename Functor>
2194 2198
    SectionReader& sectionStream(const std::string& type, Functor functor) {
2195 2199
      LEMON_ASSERT(!type.empty(), "Type is empty.");
2196 2200
      LEMON_ASSERT(_sections.find(type) == _sections.end(),
2197 2201
                   "Multiple reading of section.");
2198 2202
      _sections.insert(std::make_pair(type,
2199 2203
         new _reader_bits::StreamSection<Functor>(functor)));
2200 2204
      return *this;
2201 2205
    }
2202 2206

	
2203 2207
    /// @}
2204 2208

	
2205 2209
  private:
2206 2210

	
2207 2211
    bool readLine() {
2208 2212
      std::string str;
2209 2213
      while(++line_num, std::getline(*_is, str)) {
2210 2214
        line.clear(); line.str(str);
2211 2215
        char c;
2212 2216
        if (line >> std::ws >> c && c != '#') {
2213 2217
          line.putback(c);
2214 2218
          return true;
2215 2219
        }
2216 2220
      }
2217 2221
      return false;
2218 2222
    }
2219 2223

	
2220 2224
    bool readSuccess() {
2221 2225
      return static_cast<bool>(*_is);
2222 2226
    }
2223 2227

	
2224 2228
    void skipSection() {
2225 2229
      char c;
2226 2230
      while (readSuccess() && line >> c && c != '@') {
2227 2231
        readLine();
2228 2232
      }
2229
      line.putback(c);
2233
      if (readSuccess()) {
2234
        line.putback(c);
2235
      }
2230 2236
    }
2231 2237

	
2232 2238
  public:
2233 2239

	
2234 2240

	
2235 2241
    /// \name Execution of the reader
2236 2242
    /// @{
2237 2243

	
2238 2244
    /// \brief Start the batch processing
2239 2245
    ///
2240 2246
    /// This function starts the batch processing.
2241 2247
    void run() {
2242 2248

	
2243 2249
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
2244 2250

	
2245 2251
      std::set<std::string> extra_sections;
2246 2252

	
2247 2253
      line_num = 0;
2248 2254
      readLine();
2249 2255
      skipSection();
2250 2256

	
2251 2257
      while (readSuccess()) {
2252 2258
        try {
2253 2259
          char c;
2254 2260
          std::string section, caption;
2255 2261
          line >> c;
2256 2262
          _reader_bits::readToken(line, section);
2257 2263
          _reader_bits::readToken(line, caption);
2258 2264

	
2259 2265
          if (line >> c)
2260 2266
            throw FormatError("Extra character at the end of line");
2261 2267

	
2262 2268
          if (extra_sections.find(section) != extra_sections.end()) {
2263 2269
            std::ostringstream msg;
2264 2270
            msg << "Multiple occurence of section: " << section;
2265 2271
            throw FormatError(msg.str());
2266 2272
          }
2267 2273
          Sections::iterator it = _sections.find(section);
2268 2274
          if (it != _sections.end()) {
2269 2275
            extra_sections.insert(section);
2270 2276
            it->second->process(*_is, line_num);
2271 2277
          }
2272 2278
          readLine();
2273 2279
          skipSection();
2274 2280
        } catch (FormatError& error) {
2275 2281
          error.line(line_num);
2276 2282
          error.file(_filename);
2277 2283
          throw;
... ...
@@ -2522,97 +2528,99 @@
2522 2528
      return _attributes[i];
2523 2529
    }
2524 2530

	
2525 2531
    /// @}
2526 2532

	
2527 2533
    /// \name Extra sections
2528 2534
    /// @{
2529 2535

	
2530 2536
    /// \brief Gives back the number of extra sections in the file.
2531 2537
    ///
2532 2538
    /// Gives back the number of extra sections in the file.
2533 2539
    int extraSectionNum() const {
2534 2540
      return _extra_sections.size();
2535 2541
    }
2536 2542

	
2537 2543
    /// \brief Returns the extra section type at the given position.
2538 2544
    ///
2539 2545
    /// Returns the section type at the given position.
2540 2546
    const std::string& extraSection(int i) const {
2541 2547
      return _extra_sections[i];
2542 2548
    }
2543 2549

	
2544 2550
    /// @}
2545 2551

	
2546 2552
  private:
2547 2553

	
2548 2554
    bool readLine() {
2549 2555
      std::string str;
2550 2556
      while(++line_num, std::getline(*_is, str)) {
2551 2557
        line.clear(); line.str(str);
2552 2558
        char c;
2553 2559
        if (line >> std::ws >> c && c != '#') {
2554 2560
          line.putback(c);
2555 2561
          return true;
2556 2562
        }
2557 2563
      }
2558 2564
      return false;
2559 2565
    }
2560 2566

	
2561 2567
    bool readSuccess() {
2562 2568
      return static_cast<bool>(*_is);
2563 2569
    }
2564 2570

	
2565 2571
    void skipSection() {
2566 2572
      char c;
2567 2573
      while (readSuccess() && line >> c && c != '@') {
2568 2574
        readLine();
2569 2575
      }
2570
      line.putback(c);
2576
      if (readSuccess()) {
2577
        line.putback(c);
2578
      }
2571 2579
    }
2572 2580

	
2573 2581
    void readMaps(std::vector<std::string>& maps) {
2574 2582
      char c;
2575 2583
      if (!readLine() || !(line >> c) || c == '@') {
2576 2584
        if (readSuccess() && line) line.putback(c);
2577 2585
        return;
2578 2586
      }
2579 2587
      line.putback(c);
2580 2588
      std::string map;
2581 2589
      while (_reader_bits::readToken(line, map)) {
2582 2590
        maps.push_back(map);
2583 2591
      }
2584 2592
    }
2585 2593

	
2586 2594
    void readAttributes(std::vector<std::string>& attrs) {
2587 2595
      readLine();
2588 2596
      char c;
2589 2597
      while (readSuccess() && line >> c && c != '@') {
2590 2598
        line.putback(c);
2591 2599
        std::string attr;
2592 2600
        _reader_bits::readToken(line, attr);
2593 2601
        attrs.push_back(attr);
2594 2602
        readLine();
2595 2603
      }
2596 2604
      line.putback(c);
2597 2605
    }
2598 2606

	
2599 2607
  public:
2600 2608

	
2601 2609
    /// \name Execution of the contents reader
2602 2610
    /// @{
2603 2611

	
2604 2612
    /// \brief Starts the reading
2605 2613
    ///
2606 2614
    /// This function starts the reading.
2607 2615
    void run() {
2608 2616

	
2609 2617
      readLine();
2610 2618
      skipSection();
2611 2619

	
2612 2620
      while (readSuccess()) {
2613 2621

	
2614 2622
        char c;
2615 2623
        line >> c;
2616 2624

	
2617 2625
        std::string section, caption;
2618 2626
        _reader_bits::readToken(line, section);
0 comments (0 inline)