GraphReader implementation ideas.
+ Question: Why we need common input interface?
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/src/work/deba/reader.h Fri Dec 03 12:19:26 2004 +0000
1.3 @@ -0,0 +1,135 @@
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.