# HG changeset patch # User deba # Date 1102076366 0 # Node ID 53e7969a92eb76102b507338e3b50a170e7edc16 # Parent 2497336d7e1461e58a4c29d0d3381ef72604e7d4 GraphReader implementation ideas. + Question: Why we need common input interface? diff -r 2497336d7e14 -r 53e7969a92eb src/work/deba/reader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/deba/reader.h Fri Dec 03 12:19:26 2004 +0000 @@ -0,0 +1,135 @@ +#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.