src/work/deba/reader.h
changeset 1029 53e7969a92eb
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/work/deba/reader.h	Fri Dec 03 12:19:26 2004 +0000
     1.3 @@ -0,0 +1,135 @@
     1.4 +#include <iostream>
     1.5 +#include <string>
     1.6 +
     1.7 +/// Beolvaso osztaly terve:
     1.8 +
     1.9 +// beolvaso es wrappelo bazis osztaly
    1.10 +class MapReader {
    1.11 +public:
    1.12 +  virtual void read(typename Map::Key& key, istream& is) = 0;
    1.13 +};
    1.14 +
    1.15 +// a default beolvaso osztaly egy maphez
    1.16 +// elboldogul olyan mappel is, amelyben valamilyen specialis tipus van
    1.17 +template <typename _Map>
    1.18 +class DefaultReader : public MapReader {
    1.19 +public:
    1.20 +  typedef _Map Map;
    1.21 +
    1.22 +  DefaultReader(Map& _map) : map(_map) {}
    1.23 +
    1.24 +  virtual void read(typename Map::Key& key, istream& is) {
    1.25 +    typename Map::Value val;
    1.26 +    is >> val;
    1.27 +    map.set(key, val);
    1.28 +  }
    1.29 +private:
    1.30 +  Map& map;
    1.31 +};
    1.32 +
    1.33 +// egy adott tipusu elemet beolvas, de nem irja mapbe
    1.34 +template <typename _Type>
    1.35 +class SkipReader : public MapReader {
    1.36 +public:
    1.37 +
    1.38 +  virtual void read(typename Map::Key&, istream& is) {
    1.39 +    _Type val;
    1.40 +    is >> val;
    1.41 +  }
    1.42 +};
    1.43 +
    1.44 +// majd olyan stringeket lehet olvasni, ami idezojelek kozott van
    1.45 +template <typename _Map>
    1.46 +class QuotedStringReader {
    1.47 +public:
    1.48 +  typedef _Map Map;
    1.49 +
    1.50 +  QuotedStringReader(Map& _map) : map(_map) {}
    1.51 +
    1.52 +  virtual void read(typename Map::Key&, istream& is) {
    1.53 +    char c;
    1.54 +    is >> c;
    1.55 +  }
    1.56 +  
    1.57 +};
    1.58 +
    1.59 +
    1.60 +// a beolvaso
    1.61 +template <typename _Graph, template <typename> class _SkipReader = SkipReader<std::string> >
    1.62 +class GraphReader {
    1.63 +
    1.64 +  GraphReader(istream& _is) : is(_is) {}
    1.65 +
    1.66 +  template <typename _Map, typename _Reader = DefaultReader<_Map> >
    1.67 +  void readMap(std::string& name, _Map& _map) {
    1.68 +    readers.push_back(_Reader(_map));
    1.69 +  }
    1.70 +
    1.71 +  template <_Type, typename _Reader = SkipReader<_Map> >
    1.72 +  void skipMap(std::string& name) {
    1.73 +    readers.push_back(_Reader());
    1.74 +  }
    1.75 +
    1.76 +  void read() {    
    1.77 +    ...
    1.78 +    vector<int> index;
    1.79 +    // egy sor olvasasa
    1.80 +    for (int i = 0; i < index.size(); ++i) {
    1.81 +      if (index[i] != -1) {
    1.82 +	readers[index[i]].read(item, is);
    1.83 +      } else {
    1.84 +	_SkipReader().read(item, is);
    1.85 +      }
    1.86 +    }
    1.87 +    ...
    1.88 +  }
    1.89 +
    1.90 +
    1.91 +private:
    1.92 +  istream& is;
    1.93 +  vector<MapReader> readers;
    1.94 +};
    1.95 +
    1.96 +// Ennek az implementacionak az elonye:
    1.97 +//  - altalanosabban mukodik a beolvasas
    1.98 +//  - konnyebb specialis beolvasasokat megvalositani
    1.99 +//  - ugyanolyan tipusu maphez ket kulonbozo beolvasasi modszert is alkalmazhatunk
   1.100 +//  - Megengedi, whitespace-t tartalmazo stringek beolvasasat is (?)
   1.101 +
   1.102 +// Hatranya
   1.103 +//  - Ha whitespace-t hasznalunk egy mapben, de nem olvassuk ki, akkor meg kell
   1.104 +//    hivni a skipMap fuggvenyt az aktualis tipussal /a ws-eket ezt ellenjavalhatjuk a doksiban/
   1.105 +
   1.106 +// Fejlesztesi lehetoseg:
   1.107 +// A GraphReader osztalynak nem a SkipReader lenne a parametere, hanem a kovetkezo tipusu osztaly:
   1.108 +
   1.109 +class TypeReaderTraits {
   1.110 +public:
   1.111 +  class DefaultSkipReader {
   1.112 +    ...
   1.113 +  };
   1.114 +
   1.115 +  template <typename Map>
   1.116 +  class MapReader {
   1.117 +    ...
   1.118 +  };
   1.119 +
   1.120 +  template <typename Type>
   1.121 +  class SkipReader {
   1.122 +    ...
   1.123 +  };
   1.124 +};
   1.125 +
   1.126 +// Ezt le lehetne cserelni peldaul DelimetedReaderTraits-re cserelni, amivel be lehetne spacekkel, vagy
   1.127 +// mas elvalasztojelekkel generalt file-t olvasni.  
   1.128 +
   1.129 +// Kerdes
   1.130 +// Ugy ertelmeztem, hogy fontos az hogy kozos beolvaso interface legyen a kulonbozo
   1.131 +// tipusu beolvasasokhoz/file, adatbazis.../.
   1.132 +// Szerintem ez annyira nem fontos, mivel sem szarmaztatott viszonyban nem allnak
   1.133 +// a beolvaso interfacek, es annak sem latom ertelmet, hogy template parameter legyen
   1.134 +// a beolvaso osztaly. 
   1.135 +// Ezert szerintem nem kell kozos interfacce!
   1.136 +//
   1.137 +// Azonban celszeru kozel azonos szintaktikat kialakitani a beolvasokhoz,
   1.138 +// hogy egyszeru legyen hasznalni.