deba@1029: #include <iostream>
deba@1029: #include <string>
deba@1029: 
deba@1029: /// Beolvaso osztaly terve:
deba@1029: 
deba@1029: // beolvaso es wrappelo bazis osztaly
deba@1029: class MapReader {
deba@1029: public:
deba@1029:   virtual void read(typename Map::Key& key, istream& is) = 0;
deba@1029: };
deba@1029: 
deba@1029: // a default beolvaso osztaly egy maphez
deba@1029: // elboldogul olyan mappel is, amelyben valamilyen specialis tipus van
deba@1029: template <typename _Map>
deba@1029: class DefaultReader : public MapReader {
deba@1029: public:
deba@1029:   typedef _Map Map;
deba@1029: 
deba@1029:   DefaultReader(Map& _map) : map(_map) {}
deba@1029: 
deba@1029:   virtual void read(typename Map::Key& key, istream& is) {
deba@1029:     typename Map::Value val;
deba@1029:     is >> val;
deba@1029:     map.set(key, val);
deba@1029:   }
deba@1029: private:
deba@1029:   Map& map;
deba@1029: };
deba@1029: 
deba@1029: // egy adott tipusu elemet beolvas, de nem irja mapbe
deba@1029: template <typename _Type>
deba@1029: class SkipReader : public MapReader {
deba@1029: public:
deba@1029: 
deba@1029:   virtual void read(typename Map::Key&, istream& is) {
deba@1029:     _Type val;
deba@1029:     is >> val;
deba@1029:   }
deba@1029: };
deba@1029: 
deba@1029: // majd olyan stringeket lehet olvasni, ami idezojelek kozott van
deba@1029: template <typename _Map>
deba@1029: class QuotedStringReader {
deba@1029: public:
deba@1029:   typedef _Map Map;
deba@1029: 
deba@1029:   QuotedStringReader(Map& _map) : map(_map) {}
deba@1029: 
deba@1029:   virtual void read(typename Map::Key&, istream& is) {
deba@1029:     char c;
deba@1029:     is >> c;
deba@1029:   }
deba@1029:   
deba@1029: };
deba@1029: 
deba@1029: 
deba@1029: // a beolvaso
deba@1029: template <typename _Graph, template <typename> class _SkipReader = SkipReader<std::string> >
deba@1029: class GraphReader {
deba@1029: 
deba@1029:   GraphReader(istream& _is) : is(_is) {}
deba@1029: 
deba@1029:   template <typename _Map, typename _Reader = DefaultReader<_Map> >
deba@1029:   void readMap(std::string& name, _Map& _map) {
deba@1029:     readers.push_back(_Reader(_map));
deba@1029:   }
deba@1029: 
deba@1029:   template <_Type, typename _Reader = SkipReader<_Map> >
deba@1029:   void skipMap(std::string& name) {
deba@1029:     readers.push_back(_Reader());
deba@1029:   }
deba@1029: 
deba@1029:   void read() {    
deba@1029:     ...
deba@1029:     vector<int> index;
deba@1029:     // egy sor olvasasa
deba@1029:     for (int i = 0; i < index.size(); ++i) {
deba@1029:       if (index[i] != -1) {
deba@1029: 	readers[index[i]].read(item, is);
deba@1029:       } else {
deba@1029: 	_SkipReader().read(item, is);
deba@1029:       }
deba@1029:     }
deba@1029:     ...
deba@1029:   }
deba@1029: 
deba@1029: 
deba@1029: private:
deba@1029:   istream& is;
deba@1029:   vector<MapReader> readers;
deba@1029: };
deba@1029: 
deba@1029: // Ennek az implementacionak az elonye:
deba@1029: //  - altalanosabban mukodik a beolvasas
deba@1029: //  - konnyebb specialis beolvasasokat megvalositani
deba@1029: //  - ugyanolyan tipusu maphez ket kulonbozo beolvasasi modszert is alkalmazhatunk
deba@1029: //  - Megengedi, whitespace-t tartalmazo stringek beolvasasat is (?)
deba@1029: 
deba@1029: // Hatranya
deba@1029: //  - Ha whitespace-t hasznalunk egy mapben, de nem olvassuk ki, akkor meg kell
deba@1029: //    hivni a skipMap fuggvenyt az aktualis tipussal /a ws-eket ezt ellenjavalhatjuk a doksiban/
deba@1029: 
deba@1029: // Fejlesztesi lehetoseg:
deba@1029: // A GraphReader osztalynak nem a SkipReader lenne a parametere, hanem a kovetkezo tipusu osztaly:
deba@1029: 
deba@1029: class TypeReaderTraits {
deba@1029: public:
deba@1029:   class DefaultSkipReader {
deba@1029:     ...
deba@1029:   };
deba@1029: 
deba@1029:   template <typename Map>
deba@1029:   class MapReader {
deba@1029:     ...
deba@1029:   };
deba@1029: 
deba@1029:   template <typename Type>
deba@1029:   class SkipReader {
deba@1029:     ...
deba@1029:   };
deba@1029: };
deba@1029: 
deba@1029: // Ezt le lehetne cserelni peldaul DelimetedReaderTraits-re cserelni, amivel be lehetne spacekkel, vagy
deba@1029: // mas elvalasztojelekkel generalt file-t olvasni.  
deba@1029: 
deba@1029: // Kerdes
deba@1029: // Ugy ertelmeztem, hogy fontos az hogy kozos beolvaso interface legyen a kulonbozo
deba@1029: // tipusu beolvasasokhoz/file, adatbazis.../.
deba@1029: // Szerintem ez annyira nem fontos, mivel sem szarmaztatott viszonyban nem allnak
deba@1029: // a beolvaso interfacek, es annak sem latom ertelmet, hogy template parameter legyen
deba@1029: // a beolvaso osztaly. 
deba@1029: // Ezert szerintem nem kell kozos interfacce!
deba@1029: //
deba@1029: // Azonban celszeru kozel azonos szintaktikat kialakitani a beolvasokhoz,
deba@1029: // hogy egyszeru legyen hasznalni.