COIN-OR::LEMON - Graph Library

Changeset 1037:3eaff8d04171 in lemon-0.x for src/work/deba/graph_reader.h


Ignore:
Timestamp:
12/15/04 20:56:55 (19 years ago)
Author:
Balazs Dezso
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1427
Message:

graph_io under construction
This is a working version, but needs more improvments.

todo:

documention + fix the file format
improve the exception system

add some possible asserts

tutorials

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/work/deba/graph_reader.h

    r1036 r1037  
    2525#include <vector>
    2626
     27#include <memory>
     28
    2729#include <lemon/error.h>
    2830
     
    4951  };
    5052
    51   class StreamException : public IOException {
     53  template <typename _Exception>
     54  class StreamException : public _Exception {
    5255  public:
    53     virtual int line() = 0;
     56    typedef _Exception Exception;
     57    StreamException(int _line, Exception _exception)
     58      : line_num(_line), Exception(_exception) {}
     59    virtual int line() const {
     60      return line_num;
     61    }
     62    virtual std::string what() const {
     63      ostringstream os;
     64      os << Exception::what() << " in line " << line();
     65      return os.str();
     66    }
    5467  private:
    55     IOException* exception;
    5668    int line_num;
    5769  }; 
     
    8597      value.clear();
    8698      is >> ws;
    87       if (!is.get(c) || c != '\"') throw DataFormatException("Quoted string format exception");
     99      if (!is.get(c) || c != '\"') throw DataFormatException("Quoted string format");
    88100      while (is.get(c) && c != '\"') {
    89101        if (escaped && c == '\\') {
     
    93105        }
    94106      }
    95       if (!is) throw DataFormatException("Quoted string format exception");
     107      if (!is) throw DataFormatException("Quoted string format");
    96108    }
    97109
     
    172184  template <typename _Graph, typename _ReaderTraits = DefaultReaderTraits>
    173185  class GraphReader {
    174 
    175186  public:
    176187   
     
    182193    typedef typename ReaderTraits::DefaultReader DefaultReader;
    183194
    184     GraphReader(istream& _is, Graph& _graph, const DefaultReader& _reader = DefaultReader())
     195    GraphReader(std::istream& _is, Graph& _graph, const DefaultReader& _reader = DefaultReader())
    185196      : is(_is), graph(_graph), nodeSkipper(_reader), edgeSkipper(_reader) {}
    186197
     
    188199    ~GraphReader() {
    189200
    190       for (typename NodeReaders::iterator it = node_readers.begin(); it != node_readers.end(); ++it) {
     201      for (typename NodeMapReaders::iterator it = node_map_readers.begin(); it != node_map_readers.end(); ++it) {
    191202        delete it->second;
    192203      }
    193204
    194       for (typename EdgeReaders::iterator it = edge_readers.begin(); it != edge_readers.end(); ++it) {
     205      for (typename EdgeMapReaders::iterator it = edge_map_readers.begin(); it != edge_map_readers.end(); ++it) {
    195206        delete it->second;
    196207      }
    197208
    198209    }
     210
     211    // Node map rules
    199212
    200213    template <typename Map>
     
    205218    template <typename Reader, typename Map>
    206219    GraphReader& readNodeMap(std::string name, Map& map, const Reader& reader = Reader()) {
    207       if (node_readers.find(name) != node_readers.end()) {
    208         Exception e;
    209         e << "Multiple read rule for node map: " << name;
    210         throw e;
    211       }
    212       node_readers.insert(make_pair(name, new MapReader<Node, Map, Reader>(map, reader)));
     220      if (node_map_readers.find(name) != node_map_readers.end()) {
     221        throw Exception() << "Multiple read rule for node map: " << name;
     222      }
     223      node_map_readers.insert(make_pair(name, new MapReader<Node, Map, Reader>(map, reader)));
    213224      return *this;
    214225    }
     
    216227    template <typename Reader>
    217228    GraphReader& skipNodeMap(std::string name, const Reader& reader = Reader()) {
    218       if (node_readers.find(name) != node_readers.end()) {
    219         Exception e;
    220         e << "Multiple read rule for node map: " << name;
    221         throw e;
    222       }
    223       node_readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader)));
     229      if (node_map_readers.find(name) != node_map_readers.end()) {
     230        throw Exception() << "Multiple read rule for node map: " << name;
     231      }
     232      node_map_readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader)));
    224233      return *this;
    225234    }
     235
     236    // Edge map rules
    226237
    227238    template <typename Map>
     
    233244    template <typename Reader, typename Map>
    234245    GraphReader& readEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) {
    235       if (edge_readers.find(name) != edge_readers.end()) {
    236         Exception e;
    237         e << "Multiple read rule for edge map: " << name;
    238         throw e;
    239       }
    240       edge_readers.insert(make_pair(name, new MapReader<Edge, Map, Reader>(map, reader)));
     246      if (edge_map_readers.find(name) != edge_map_readers.end()) {
     247        throw Exception() << "Multiple read rule for edge map: " << name;
     248      }
     249      edge_map_readers.insert(make_pair(name, new MapReader<Edge, Map, Reader>(map, reader)));
    241250      return *this;
    242251    }
     
    244253    template <typename Reader>
    245254    GraphReader& skipEdgeMap(std::string name, const Reader& reader = Reader()) {
     255      if (edge_map_readers.find(name) != edge_map_readers.end()) {
     256        throw Exception() << "Multiple read rule for edge map: " << name;
     257      }
     258      edge_map_readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader)));
     259      return *this;
     260    }
     261
     262    // Node rules
     263    GraphReader& readNode(std::string name, Node& node) {
     264      if (node_readers.find(name) != node_readers.end()) {
     265        throw Exception() << "Multiple read rule for node";
     266      }
     267      node_readers.insert(make_pair(name, &node));
     268    }
     269
     270    // Edge rules
     271
     272    GraphReader& readEdge(std::string name, Edge& edge) {
    246273      if (edge_readers.find(name) != edge_readers.end()) {
    247         Exception e;
    248         e << "Multiple read rule for edge map: " << name;
    249         throw e;
    250       }
    251       edge_readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader)));
    252       return *this;
     274        throw Exception() << "Multiple read rule for edge";
     275      }
     276      edge_readers.insert(make_pair(name, &edge));
    253277    }
    254278
    255279    void read() {
    256280      int line_num = 0;
    257       InverterBase<Node>* nodeInverter = 0;
    258       InverterBase<Edge>* edgeInverter = 0;
    259       // \todo delete the inverters
    260       //      try {
    261         {
    262           std::string line = readNotEmptyLine(is, line_num);
    263         }
    264         readNodeSet(line_num, nodeInverter);
    265         readEdgeSet(line_num, edgeInverter, nodeInverter);
    266         //      } catch (...){
    267         if (nodeInverter != 0) delete nodeInverter;
    268         if (edgeInverter != 0) delete edgeInverter;
    269         //      }
     281      std::auto_ptr<InverterBase<Node> > nodeInverter;
     282      std::auto_ptr<InverterBase<Edge> > edgeInverter;
     283      try {
     284        std::string line = readNotEmptyLine(is, line_num);
     285        if (line.find("@nodeset") == 0) {
     286          line = readNodeSet(line_num, nodeInverter);
     287        }
     288        if (line.find("@edgeset") == 0) {
     289          line = readEdgeSet(line_num, edgeInverter, nodeInverter);
     290        }
     291        if (line.find("@nodes") == 0) {
     292          line = readNodes(line_num, nodeInverter);
     293        }
     294        if (line.find("@edges") == 0) {
     295          line = readEdges(line_num, edgeInverter);
     296        }
     297        if (line.find("@end") != 0) {
     298          throw DataFormatException("Invalid control sequence: " + line);
     299        }
     300      } catch (DataFormatException e) {
     301        throw StreamException<DataFormatException>(line_num, e);
     302      }
    270303    }
    271304
     
    273306
    274307    template <typename Item> class InverterBase;
    275     //    template <typename Item> class InverterBase;
    276 
    277     void readNodeSet(int& line_num, InverterBase<Node>* & nodeInverter) {
    278       int n = 0;
    279       std::vector<ReaderBase<Node>*> index;
     308
     309    std::string readNodeSet(int& line_num, auto_ptr<InverterBase<Node> > & nodeInverter) {
     310      std::vector<ReaderBase<Node>* > index;
    280311      {
    281312        std::string line = readNotEmptyLine(is, line_num);   
     
    284315        while (ls >> id) {
    285316          if (id[0] == '#') break;
    286           typename NodeReaders::iterator it = node_readers.find(id);
    287           if (it != node_readers.end()) {
     317          typename NodeMapReaders::iterator it = node_map_readers.find(id);
     318          if (it != node_map_readers.end()) {
    288319            index.push_back(it->second);
     320            node_map_readers.erase(it);
    289321          } else {
    290322            index.push_back(&nodeSkipper);
    291323          }
    292           ++n;
    293         }
    294       }
    295 
    296       nodeInverter = index[0]->getInverter();
     324        }
     325      }
     326
     327      if (index.size() == 0) {
     328        throw DataFormatException("No node map found");
     329      }
     330
     331      nodeInverter = auto_ptr<InverterBase<Node> >(index[0]->getInverter());
    297332      std::string line;
    298333      while (line = readNotEmptyLine(is, line_num), line[0] != '@') {
     
    300335        std::istringstream ls(line);
    301336        nodeInverter->read(ls, node);
    302         for (int i = 1; i < n; ++i) {
     337        for (int i = 1; i < index.size(); ++i) {
    303338          index[i]->read(ls, node);
    304339        }
    305340      }
    306     }
    307 
    308     void readEdgeSet(int& line_num, InverterBase<Edge>* & edgeInverter, InverterBase<Node>* & nodeInverter) {
    309       int n = 0;
     341      return line;
     342    }
     343
     344    std::string readEdgeSet(int& line_num,
     345                     auto_ptr<InverterBase<Edge> > & edgeInverter, auto_ptr<InverterBase<Node> > & nodeInverter) {
    310346      std::vector<ReaderBase<Edge>*> index;
    311347      {
     
    315351        while (ls >> id) {
    316352          if (id[0] == '#') break;
    317           typename EdgeReaders::iterator it = edge_readers.find(id);
    318           if (it != edge_readers.end()) {
     353          typename EdgeMapReaders::iterator it = edge_map_readers.find(id);
     354          if (it != edge_map_readers.end()) {
    319355            index.push_back(it->second);
     356            edge_map_readers.erase(it);
    320357          } else {
    321358            index.push_back(&edgeSkipper);
    322359          }
    323           ++n;
    324         }
    325       }
    326       edgeInverter = index[0]->getInverter();
     360        }
     361      }
     362
     363      if (index.size() == 0) {
     364        throw DataFormatException("No edge map found");
     365      }
     366
     367      edgeInverter = auto_ptr<InverterBase<Edge> >(index[0]->getInverter());
    327368      std::string line;
    328369      while (line = readNotEmptyLine(is, line_num), line[0] != '@') {   
     
    332373        Edge edge = graph.addEdge(source, target);
    333374        edgeInverter->read(ls, edge);
    334         for (int i = 1; i < n; ++i) {
     375        for (int i = 1; i < index.size(); ++i) {
    335376          index[i]->read(ls, edge);
    336377        }
    337378      }     
     379      return line;
     380    }
     381
     382    std::string readNodes(int& line_num, auto_ptr<InverterBase<Node> >& nodeInverter) {
     383      std::string line;
     384      while (line = readNotEmptyLine(is, line_num), line[0] != '@') {
     385        std::istringstream ls(line);
     386        std::string name;
     387        ls >> name;
     388        typename NodeReaders::iterator it = node_readers.find(name);
     389        if (it != node_readers.end()) {
     390          *(it -> second) = nodeInverter->read(ls);
     391        }
     392      }       
     393      return line;
     394    }
     395
     396    std::string readEdges(int& line_num, auto_ptr<InverterBase<Edge> >& edgeInverter) {
     397      std::string line;
     398      while (line = readNotEmptyLine(is, line_num), line[0] != '@') {
     399        std::istringstream ls(line);
     400        std::string name;
     401        ls >> name;
     402        typename EdgeReaders::iterator it = edge_readers.find(name);
     403        if (it != edge_readers.end()) {
     404          *(it -> second) = edgeInverter->read(ls);
     405        }
     406      }       
     407      return line;   
    338408    }
    339409
     
    346416        }
    347417      }
    348       throw Exception();
    349     }
     418      throw DataFormatException("End of stream");
     419    }
     420   
     421    // Inverters store and give back the Item from the id,
     422    // and may put the ids into a map.
    350423   
    351424    template <typename _Item>
     
    353426    public:
    354427      typedef _Item Item;
    355       virtual void read(istream&, const Item&) = 0;
    356       virtual Item read(istream&) = 0;
     428      virtual void read(std::istream&, const Item&) = 0;
     429      virtual Item read(std::istream&) = 0;
    357430    };
    358431
     
    373446        : map(_map), reader(_reader) {}
    374447
    375       virtual void read(istream& is, const Item& item) {
     448      virtual void read(std::istream& is, const Item& item) {
    376449        Value value;
    377450        reader.read(is, value);
     
    385458      }
    386459
    387       virtual Item read(istream& is) {
     460      virtual Item read(std::istream& is) {
    388461        Value value;
    389462        reader.read(is, value);
     
    410483        : reader(_reader) {}
    411484
    412       virtual void read(istream& is, const Item& item) {
     485      virtual void read(std::istream& is, const Item& item) {
    413486        Value value;
    414487        reader.read(is, value);
     
    421494      }
    422495
    423       virtual Item read(istream& is) {
     496      virtual Item read(std::istream& is) {
    424497        Value value;
    425498        reader.read(is, value);
     
    435508    };
    436509
     510    // Readers
    437511
    438512    template <typename _Item>   
     
    440514    public:
    441515      typedef _Item Item;
    442       virtual void read(istream& is, const Item& item) = 0;
     516
     517      virtual void read(std::istream& is, const Item& item) = 0;
    443518      virtual InverterBase<_Item>* getInverter() = 0;
    444519    };
     
    459534
    460535
    461       virtual void read(istream& is, const Item& item) {
     536      virtual void read(std::istream& is, const Item& item) {
    462537        Value value;
    463538        reader.read(is, value);
     
    481556      SkipReader(const Reader& _reader) : reader(_reader) {}
    482557
    483       virtual void read(istream& is, const Item& item) {
     558      virtual void read(std::istream& is, const Item& item) {
    484559        Value value;
    485560        reader.read(is, value);
     
    492567
    493568
    494     typedef std::map<std::string, ReaderBase<Node>* > NodeReaders;
     569    typedef std::map<std::string, ReaderBase<Node>*> NodeMapReaders;
     570    NodeMapReaders node_map_readers;
     571
     572    typedef std::map<std::string, ReaderBase<Edge>*> EdgeMapReaders;
     573    EdgeMapReaders edge_map_readers;
     574
     575    typedef std::map<std::string, Node*> NodeReaders;
    495576    NodeReaders node_readers;
    496577
    497     typedef std::map<std::string, ReaderBase<Edge>* > EdgeReaders;
     578    typedef std::map<std::string, Edge*> EdgeReaders;
    498579    EdgeReaders edge_readers;
    499580
Note: See TracChangeset for help on using the changeset viewer.