1 #include <iostream> |
|
2 #include <string> |
|
3 |
|
4 /// Beolvaso osztaly terve: |
|
5 |
|
6 // beolvaso es wrappelo bazis osztaly |
|
7 class MapReader { |
|
8 public: |
|
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 |
|
14 template <typename _Map> |
|
15 class DefaultReader : public MapReader { |
|
16 public: |
|
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 } |
|
26 private: |
|
27 Map& map; |
|
28 }; |
|
29 |
|
30 // egy adott tipusu elemet beolvas, de nem irja mapbe |
|
31 template <typename _Type> |
|
32 class SkipReader : public MapReader { |
|
33 public: |
|
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 |
|
42 template <typename _Map> |
|
43 class QuotedStringReader { |
|
44 public: |
|
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 |
|
58 template <typename _Graph, template <typename> class _SkipReader = SkipReader<std::string> > |
|
59 class 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 |
|
88 private: |
|
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 |
|
106 class TypeReaderTraits { |
|
107 public: |
|
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. |
|