src/work/deba/reader.h
author alpar
Thu, 24 Feb 2005 17:48:25 +0000
changeset 1177 e41c2907fb49
permissions -rw-r--r--
Fix 'make distcheck' failure.
     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.