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