COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/work/deba/reader.h @ 1247:60708e1475ae

Last change on this file since 1247:60708e1475ae was 1029:53e7969a92eb, checked in by Balazs Dezso, 20 years ago

GraphReader? implementation ideas.
+ Question: Why we need common input interface?

File size: 3.3 KB
RevLine 
[1029]1#include <iostream>
2#include <string>
3
4/// Beolvaso osztaly terve:
5
6// beolvaso es wrappelo bazis osztaly
7class MapReader {
8public:
9  virtual void read(typename Map::Key& key, istream& is) = 0;
10};
11
12// a default beolvaso osztaly egy maphez
13// elboldogul olyan mappel is, amelyben valamilyen specialis tipus van
14template <typename _Map>
15class DefaultReader : public MapReader {
16public:
17  typedef _Map Map;
18
19  DefaultReader(Map& _map) : map(_map) {}
20
21  virtual void read(typename Map::Key& key, istream& is) {
22    typename Map::Value val;
23    is >> val;
24    map.set(key, val);
25  }
26private:
27  Map& map;
28};
29
30// egy adott tipusu elemet beolvas, de nem irja mapbe
31template <typename _Type>
32class SkipReader : public MapReader {
33public:
34
35  virtual void read(typename Map::Key&, istream& is) {
36    _Type val;
37    is >> val;
38  }
39};
40
41// majd olyan stringeket lehet olvasni, ami idezojelek kozott van
42template <typename _Map>
43class QuotedStringReader {
44public:
45  typedef _Map Map;
46
47  QuotedStringReader(Map& _map) : map(_map) {}
48
49  virtual void read(typename Map::Key&, istream& is) {
50    char c;
51    is >> c;
52  }
53 
54};
55
56
57// a beolvaso
58template <typename _Graph, template <typename> class _SkipReader = SkipReader<std::string> >
59class GraphReader {
60
61  GraphReader(istream& _is) : is(_is) {}
62
63  template <typename _Map, typename _Reader = DefaultReader<_Map> >
64  void readMap(std::string& name, _Map& _map) {
65    readers.push_back(_Reader(_map));
66  }
67
68  template <_Type, typename _Reader = SkipReader<_Map> >
69  void skipMap(std::string& name) {
70    readers.push_back(_Reader());
71  }
72
73  void read() {   
74    ...
75    vector<int> index;
76    // egy sor olvasasa
77    for (int i = 0; i < index.size(); ++i) {
78      if (index[i] != -1) {
79        readers[index[i]].read(item, is);
80      } else {
81        _SkipReader().read(item, is);
82      }
83    }
84    ...
85  }
86
87
88private:
89  istream& is;
90  vector<MapReader> readers;
91};
92
93// Ennek az implementacionak az elonye:
94//  - altalanosabban mukodik a beolvasas
95//  - konnyebb specialis beolvasasokat megvalositani
96//  - ugyanolyan tipusu maphez ket kulonbozo beolvasasi modszert is alkalmazhatunk
97//  - Megengedi, whitespace-t tartalmazo stringek beolvasasat is (?)
98
99// Hatranya
100//  - Ha whitespace-t hasznalunk egy mapben, de nem olvassuk ki, akkor meg kell
101//    hivni a skipMap fuggvenyt az aktualis tipussal /a ws-eket ezt ellenjavalhatjuk a doksiban/
102
103// Fejlesztesi lehetoseg:
104// A GraphReader osztalynak nem a SkipReader lenne a parametere, hanem a kovetkezo tipusu osztaly:
105
106class TypeReaderTraits {
107public:
108  class DefaultSkipReader {
109    ...
110  };
111
112  template <typename Map>
113  class MapReader {
114    ...
115  };
116
117  template <typename Type>
118  class SkipReader {
119    ...
120  };
121};
122
123// Ezt le lehetne cserelni peldaul DelimetedReaderTraits-re cserelni, amivel be lehetne spacekkel, vagy
124// mas elvalasztojelekkel generalt file-t olvasni. 
125
126// Kerdes
127// Ugy ertelmeztem, hogy fontos az hogy kozos beolvaso interface legyen a kulonbozo
128// tipusu beolvasasokhoz/file, adatbazis.../.
129// Szerintem ez annyira nem fontos, mivel sem szarmaztatott viszonyban nem allnak
130// a beolvaso interfacek, es annak sem latom ertelmet, hogy template parameter legyen
131// a beolvaso osztaly.
132// Ezert szerintem nem kell kozos interfacce!
133//
134// Azonban celszeru kozel azonos szintaktikat kialakitani a beolvasokhoz,
135// hogy egyszeru legyen hasznalni.
Note: See TracBrowser for help on using the repository browser.