src/work/deba/reader.h
author alpar
Thu, 31 Mar 2005 13:30:27 +0000
changeset 1282 81e89e2b90d1
permissions -rw-r--r--
length() returns int istead of size_t
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.