| 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.
 |