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