deba@1029: #include deba@1029: #include 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 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 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 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 class _SkipReader = SkipReader > deba@1029: class GraphReader { deba@1029: deba@1029: GraphReader(istream& _is) : is(_is) {} deba@1029: deba@1029: template > 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 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 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 deba@1029: class MapReader { deba@1029: ... deba@1029: }; deba@1029: deba@1029: template 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.