| 
     1 #include <lemon/list_graph.h>  | 
         | 
     2 #include <lemon/maps.h>  | 
         | 
     3 #include <list>  | 
         | 
     4   | 
         | 
     5 using namespace lemon;  | 
         | 
     6   | 
         | 
     7 template<class GR>  | 
         | 
     8 class Reader   | 
         | 
     9 { | 
         | 
    10     | 
         | 
    11 public:  | 
         | 
    12   typedef GR Graph;  | 
         | 
    13   typedef typename Graph::Node Node;  | 
         | 
    14   typedef typename Graph::Edge Edge;  | 
         | 
    15       | 
         | 
    16   ///A beolvasando ertekek tipusa.  | 
         | 
    17   | 
         | 
    18   ///Ebben gyakorlatilag egy stringet tarolunk.  | 
         | 
    19   ///Tovabba ez egy olyan tipus, amitol elvarjuk, hogy konvertalodjon  | 
         | 
    20   ///a beolvasando mapok Value-jara.  | 
         | 
    21   class InputValue   | 
         | 
    22   { | 
         | 
    23   public:  | 
         | 
    24     operator int()    const { return 0; } | 
         | 
    25     operator double() const { return 0; } | 
         | 
    26   };  | 
         | 
    27   | 
         | 
    28   ///Ez adja a mapok kozos interface-et.  | 
         | 
    29   class WrapEdgeMapBase   | 
         | 
    30   { | 
         | 
    31   public:  | 
         | 
    32     virtual void set(Edge n,const InputValue &v) = 0;  | 
         | 
    33     virtual ~WrapEdgeMapBase() {} | 
         | 
    34   };  | 
         | 
    35   | 
         | 
    36   ///Ez meg becsomagol egy mapot a kozos formara.  | 
         | 
    37   template<class M>  | 
         | 
    38   class WrapEdgeMap : public WrapEdgeMapBase  | 
         | 
    39   { | 
         | 
    40     M ↦  | 
         | 
    41       | 
         | 
    42   public:  | 
         | 
    43     WrapEdgeMap(M &m) : map(m) {} | 
         | 
    44     void set(Edge n,const InputValue &v) {map.set(n,v);} | 
         | 
    45   };  | 
         | 
    46   | 
         | 
    47   ///Ebben a strukturaban adunk meg egy feltoltendo mapot.  | 
         | 
    48   struct EdgeMapDesc   | 
         | 
    49   { | 
         | 
    50     std::string name;  | 
         | 
    51     int column;  | 
         | 
    52     WrapEdgeMapBase *map;  | 
         | 
    53       | 
         | 
    54     template<class M> EdgeMapDesc(char *n,M &m) : name(n), map(&m) {} | 
         | 
    55     ~EdgeMapDesc() {}     | 
         | 
    56   };  | 
         | 
    57     | 
         | 
    58   ///Itt vannak felsorolva a feltoltendo mapok  | 
         | 
    59   std::list<EdgeMapDesc> EdgeMaps;  | 
         | 
    60   | 
         | 
    61   ///Ezzel lehet egy mapot hozzaadni a feltoltendok listajahoz.  | 
         | 
    62   template<class M> void addEdgeMap(char *name,M &map)  | 
         | 
    63   { | 
         | 
    64     EdgeMaps.push_back(EdgeMapDesc(name,*(new WrapEdgeMap<M>(map))));  | 
         | 
    65   }  | 
         | 
    66     | 
         | 
    67   ///Ez meg kiuriti a map-listat.  | 
         | 
    68   void removeEdgeMaps()   | 
         | 
    69   { | 
         | 
    70     while(EdgeMaps.begin()!=EdgeMaps.end()) { | 
         | 
    71       //Ez igy OK?:  | 
         | 
    72       delete EdgeMaps.begin()->map;  | 
         | 
    73       EdgeMaps.pop_front();  | 
         | 
    74     }  | 
         | 
    75   }  | 
         | 
    76     | 
         | 
    77   //Esetleg stream a file-nev helyett...  | 
         | 
    78   Reader(char *file,Graph &G)  | 
         | 
    79   { | 
         | 
    80      removeEdgeMaps();  | 
         | 
    81   }  | 
         | 
    82     | 
         | 
    83   ///Ez inditja a beolvasast.  | 
         | 
    84   void read()   | 
         | 
    85   { | 
         | 
    86     //Ez olvassa be/vegig a file-t.  | 
         | 
    87   }  | 
         | 
    88     | 
         | 
    89   ~Reader()   | 
         | 
    90   { | 
         | 
    91     //Ez kell!!!  | 
         | 
    92     removeEdgeMaps();  | 
         | 
    93   }  | 
         | 
    94     | 
         | 
    95 };  | 
         | 
    96   | 
         | 
    97 class SumMap : public MapBase<ListGraph::Edge,double>  | 
         | 
    98 { | 
         | 
    99   double sum;  | 
         | 
   100 public:  | 
         | 
   101   SumMap() : sum(0) {} | 
         | 
   102   void set(ListGraph::Edge e,double d)   | 
         | 
   103   { | 
         | 
   104     sum+=d;  | 
         | 
   105   }  | 
         | 
   106   double getSum() { return sum; } | 
         | 
   107 };  | 
         | 
   108   | 
         | 
   109 int main()   | 
         | 
   110 { | 
         | 
   111   ListGraph g; //Kis g!!!  | 
         | 
   112   ListGraph::EdgeMap<double> cost(g);  | 
         | 
   113   ListGraph::EdgeMap<int> channels(g);  | 
         | 
   114     | 
         | 
   115   SumMap sum_cost; //Ez egy sajat "custom" irhato map  | 
         | 
   116     | 
         | 
   117   Reader<ListGraph> r("file_name.lgf",g); | 
         | 
   118   r.addEdgeMap("cost",cost); | 
         | 
   119   r.addEdgeMap("channels",channels); | 
         | 
   120   r.addEdgeMap("cost",sum_cost); | 
         | 
   121   r.read();  | 
         | 
   122 }  |