src/work/deba/reader.h
changeset 1365 c280de819a73
equal deleted inserted replaced
0:258e19de40c5 -1:000000000000
     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.