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