1.1 --- a/src/work/deba/reader.h Sun Apr 17 18:57:22 2005 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,135 +0,0 @@
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.