alpar@972: #include alpar@972: #include alpar@972: #include alpar@972: alpar@972: using namespace lemon; alpar@972: alpar@972: template alpar@972: class Reader alpar@972: { alpar@972: alpar@972: public: alpar@972: typedef GR Graph; alpar@972: typedef typename Graph::Node Node; alpar@972: typedef typename Graph::Edge Edge; alpar@972: alpar@972: ///A beolvasando ertekek tipusa. alpar@972: alpar@972: ///Ebben gyakorlatilag egy stringet tarolunk. alpar@972: ///Tovabba ez egy olyan tipus, amitol elvarjuk, hogy konvertalodjon alpar@972: ///a beolvasando mapok Value-jara. alpar@972: class InputValue alpar@972: { alpar@972: public: alpar@972: operator int() const { return 0; } alpar@972: operator double() const { return 0; } alpar@972: }; alpar@972: alpar@972: ///Ez adja a mapok kozos interface-et. alpar@972: class WrapEdgeMapBase alpar@972: { alpar@972: public: alpar@972: virtual void set(Edge n,const InputValue &v) = 0; alpar@972: virtual ~WrapEdgeMapBase() {} alpar@972: }; alpar@972: alpar@972: ///Ez meg becsomagol egy mapot a kozos formara. alpar@972: template alpar@972: class WrapEdgeMap : public WrapEdgeMapBase alpar@972: { alpar@972: M ↦ alpar@972: alpar@972: public: alpar@972: WrapEdgeMap(M &m) : map(m) {} alpar@972: void set(Edge n,const InputValue &v) {map.set(n,v);} alpar@972: }; alpar@972: alpar@972: ///Ebben a strukturaban adunk meg egy feltoltendo mapot. alpar@972: struct EdgeMapDesc alpar@972: { alpar@972: std::string name; alpar@972: int column; alpar@972: WrapEdgeMapBase *map; alpar@972: alpar@972: template EdgeMapDesc(char *n,M &m) : name(n), map(&m) {} alpar@972: ~EdgeMapDesc() {} alpar@972: }; alpar@972: alpar@972: ///Itt vannak felsorolva a feltoltendo mapok alpar@972: std::list EdgeMaps; alpar@972: alpar@972: ///Ezzel lehet egy mapot hozzaadni a feltoltendok listajahoz. alpar@972: template void addEdgeMap(char *name,M &map) alpar@972: { alpar@972: EdgeMaps.push_back(EdgeMapDesc(name,*(new WrapEdgeMap(map)))); alpar@972: } alpar@972: alpar@972: ///Ez meg kiuriti a map-listat. alpar@972: void removeEdgeMaps() alpar@972: { alpar@972: while(EdgeMaps.begin()!=EdgeMaps.end()) { alpar@972: //Ez igy OK?: alpar@972: delete EdgeMaps.begin()->map; alpar@972: EdgeMaps.pop_front(); alpar@972: } alpar@972: } alpar@972: alpar@972: //Esetleg stream a file-nev helyett... alpar@972: Reader(char *file,Graph &G) alpar@972: { alpar@972: removeEdgeMaps(); alpar@972: } alpar@972: alpar@972: ///Ez inditja a beolvasast. alpar@972: void read() alpar@972: { alpar@972: //Ez olvassa be/vegig a file-t. alpar@972: } alpar@972: alpar@972: ~Reader() alpar@972: { alpar@972: //Ez kell!!! alpar@972: removeEdgeMaps(); alpar@972: } alpar@972: alpar@972: }; alpar@972: alpar@972: class SumMap : public MapBase alpar@972: { alpar@972: double sum; alpar@972: public: alpar@972: SumMap() : sum(0) {} alpar@972: void set(ListGraph::Edge e,double d) alpar@972: { alpar@972: sum+=d; alpar@972: } alpar@972: double getSum() { return sum; } alpar@972: }; alpar@972: alpar@972: int main() alpar@972: { alpar@972: ListGraph g; //Kis g!!! alpar@972: ListGraph::EdgeMap cost(g); alpar@972: ListGraph::EdgeMap channels(g); alpar@972: alpar@972: SumMap sum_cost; //Ez egy sajat "custom" irhato map alpar@972: alpar@972: Reader r("file_name.lgf",g); alpar@972: r.addEdgeMap("cost",cost); alpar@972: r.addEdgeMap("channels",channels); alpar@972: r.addEdgeMap("cost",sum_cost); alpar@972: r.read(); alpar@972: }