lemon/bfs.h
changeset 257 8d76a7bf9961
parent 247 f1158744a112
child 258 0310c8984732
equal deleted inserted replaced
7:023ea2581bd0 9:f6e2bf9fe60a
   228     ///\name Named template parameters
   228     ///\name Named template parameters
   229 
   229 
   230     ///@{
   230     ///@{
   231 
   231 
   232     template <class T>
   232     template <class T>
   233     struct DefPredMapTraits : public Traits {
   233     struct SetPredMapTraits : public Traits {
   234       typedef T PredMap;
   234       typedef T PredMap;
   235       static PredMap *createPredMap(const Digraph &)
   235       static PredMap *createPredMap(const Digraph &)
   236       {
   236       {
   237         throw UninitializedParameter();
   237         throw UninitializedParameter();
   238       }
   238       }
   241     ///\ref PredMap type.
   241     ///\ref PredMap type.
   242     ///
   242     ///
   243     ///\ref named-templ-param "Named parameter" for setting
   243     ///\ref named-templ-param "Named parameter" for setting
   244     ///\ref PredMap type.
   244     ///\ref PredMap type.
   245     template <class T>
   245     template <class T>
   246     struct DefPredMap : public Bfs< Digraph, DefPredMapTraits<T> > {
   246     struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
   247       typedef Bfs< Digraph, DefPredMapTraits<T> > Create;
   247       typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
   248     };
   248     };
   249 
   249 
   250     template <class T>
   250     template <class T>
   251     struct DefDistMapTraits : public Traits {
   251     struct SetDistMapTraits : public Traits {
   252       typedef T DistMap;
   252       typedef T DistMap;
   253       static DistMap *createDistMap(const Digraph &)
   253       static DistMap *createDistMap(const Digraph &)
   254       {
   254       {
   255         throw UninitializedParameter();
   255         throw UninitializedParameter();
   256       }
   256       }
   259     ///\ref DistMap type.
   259     ///\ref DistMap type.
   260     ///
   260     ///
   261     ///\ref named-templ-param "Named parameter" for setting
   261     ///\ref named-templ-param "Named parameter" for setting
   262     ///\ref DistMap type.
   262     ///\ref DistMap type.
   263     template <class T>
   263     template <class T>
   264     struct DefDistMap : public Bfs< Digraph, DefDistMapTraits<T> > {
   264     struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
   265       typedef Bfs< Digraph, DefDistMapTraits<T> > Create;
   265       typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
   266     };
   266     };
   267 
   267 
   268     template <class T>
   268     template <class T>
   269     struct DefReachedMapTraits : public Traits {
   269     struct SetReachedMapTraits : public Traits {
   270       typedef T ReachedMap;
   270       typedef T ReachedMap;
   271       static ReachedMap *createReachedMap(const Digraph &)
   271       static ReachedMap *createReachedMap(const Digraph &)
   272       {
   272       {
   273         throw UninitializedParameter();
   273         throw UninitializedParameter();
   274       }
   274       }
   277     ///\ref ReachedMap type.
   277     ///\ref ReachedMap type.
   278     ///
   278     ///
   279     ///\ref named-templ-param "Named parameter" for setting
   279     ///\ref named-templ-param "Named parameter" for setting
   280     ///\ref ReachedMap type.
   280     ///\ref ReachedMap type.
   281     template <class T>
   281     template <class T>
   282     struct DefReachedMap : public Bfs< Digraph, DefReachedMapTraits<T> > {
   282     struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
   283       typedef Bfs< Digraph, DefReachedMapTraits<T> > Create;
   283       typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
   284     };
   284     };
   285 
   285 
   286     template <class T>
   286     template <class T>
   287     struct DefProcessedMapTraits : public Traits {
   287     struct SetProcessedMapTraits : public Traits {
   288       typedef T ProcessedMap;
   288       typedef T ProcessedMap;
   289       static ProcessedMap *createProcessedMap(const Digraph &)
   289       static ProcessedMap *createProcessedMap(const Digraph &)
   290       {
   290       {
   291         throw UninitializedParameter();
   291         throw UninitializedParameter();
   292       }
   292       }
   295     ///\ref ProcessedMap type.
   295     ///\ref ProcessedMap type.
   296     ///
   296     ///
   297     ///\ref named-templ-param "Named parameter" for setting
   297     ///\ref named-templ-param "Named parameter" for setting
   298     ///\ref ProcessedMap type.
   298     ///\ref ProcessedMap type.
   299     template <class T>
   299     template <class T>
   300     struct DefProcessedMap : public Bfs< Digraph, DefProcessedMapTraits<T> > {
   300     struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
   301       typedef Bfs< Digraph, DefProcessedMapTraits<T> > Create;
   301       typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
   302     };
   302     };
   303 
   303 
   304     struct DefDigraphProcessedMapTraits : public Traits {
   304     struct SetStandardProcessedMapTraits : public Traits {
   305       typedef typename Digraph::template NodeMap<bool> ProcessedMap;
   305       typedef typename Digraph::template NodeMap<bool> ProcessedMap;
   306       static ProcessedMap *createProcessedMap(const Digraph &g)
   306       static ProcessedMap *createProcessedMap(const Digraph &g)
   307       {
   307       {
   308         return new ProcessedMap(g);
   308         return new ProcessedMap(g);
   309       }
   309       }
   312     ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
   312     ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
   313     ///
   313     ///
   314     ///\ref named-templ-param "Named parameter" for setting
   314     ///\ref named-templ-param "Named parameter" for setting
   315     ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
   315     ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
   316     ///If you don't set it explicitly, it will be automatically allocated.
   316     ///If you don't set it explicitly, it will be automatically allocated.
   317     template <class T>
   317     struct SetStandardProcessedMap :
   318     struct DefProcessedMapToBeDefaultMap :
   318       public Bfs< Digraph, SetStandardProcessedMapTraits > {
   319       public Bfs< Digraph, DefDigraphProcessedMapTraits> {
   319       typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
   320       typedef Bfs< Digraph, DefDigraphProcessedMapTraits> Create;
       
   321     };
   320     };
   322 
   321 
   323     ///@}
   322     ///@}
   324 
   323 
   325   public:
   324   public:
  1063       Base::_source=s;
  1062       Base::_source=s;
  1064       return *this;
  1063       return *this;
  1065     }
  1064     }
  1066 
  1065 
  1067     template<class T>
  1066     template<class T>
  1068     struct DefPredMapBase : public Base {
  1067     struct SetPredMapBase : public Base {
  1069       typedef T PredMap;
  1068       typedef T PredMap;
  1070       static PredMap *createPredMap(const Digraph &) { return 0; };
  1069       static PredMap *createPredMap(const Digraph &) { return 0; };
  1071       DefPredMapBase(const TR &b) : TR(b) {}
  1070       SetPredMapBase(const TR &b) : TR(b) {}
  1072     };
  1071     };
  1073     ///\brief \ref named-templ-param "Named parameter"
  1072     ///\brief \ref named-templ-param "Named parameter"
  1074     ///for setting \ref PredMap object.
  1073     ///for setting \ref PredMap object.
  1075     ///
  1074     ///
  1076     /// \ref named-templ-param "Named parameter"
  1075     /// \ref named-templ-param "Named parameter"
  1077     ///for setting \ref PredMap object.
  1076     ///for setting \ref PredMap object.
  1078     template<class T>
  1077     template<class T>
  1079     BfsWizard<DefPredMapBase<T> > predMap(const T &t)
  1078     BfsWizard<SetPredMapBase<T> > predMap(const T &t)
  1080     {
  1079     {
  1081       Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
  1080       Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
  1082       return BfsWizard<DefPredMapBase<T> >(*this);
  1081       return BfsWizard<SetPredMapBase<T> >(*this);
  1083     }
  1082     }
  1084 
  1083 
  1085     template<class T>
  1084     template<class T>
  1086     struct DefReachedMapBase : public Base {
  1085     struct SetReachedMapBase : public Base {
  1087       typedef T ReachedMap;
  1086       typedef T ReachedMap;
  1088       static ReachedMap *createReachedMap(const Digraph &) { return 0; };
  1087       static ReachedMap *createReachedMap(const Digraph &) { return 0; };
  1089       DefReachedMapBase(const TR &b) : TR(b) {}
  1088       SetReachedMapBase(const TR &b) : TR(b) {}
  1090     };
  1089     };
  1091     ///\brief \ref named-templ-param "Named parameter"
  1090     ///\brief \ref named-templ-param "Named parameter"
  1092     ///for setting \ref ReachedMap object.
  1091     ///for setting \ref ReachedMap object.
  1093     ///
  1092     ///
  1094     /// \ref named-templ-param "Named parameter"
  1093     /// \ref named-templ-param "Named parameter"
  1095     ///for setting \ref ReachedMap object.
  1094     ///for setting \ref ReachedMap object.
  1096     template<class T>
  1095     template<class T>
  1097     BfsWizard<DefReachedMapBase<T> > reachedMap(const T &t)
  1096     BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
  1098     {
  1097     {
  1099       Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
  1098       Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
  1100       return BfsWizard<DefReachedMapBase<T> >(*this);
  1099       return BfsWizard<SetReachedMapBase<T> >(*this);
  1101     }
  1100     }
  1102 
  1101 
  1103     template<class T>
  1102     template<class T>
  1104     struct DefProcessedMapBase : public Base {
  1103     struct SetProcessedMapBase : public Base {
  1105       typedef T ProcessedMap;
  1104       typedef T ProcessedMap;
  1106       static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
  1105       static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
  1107       DefProcessedMapBase(const TR &b) : TR(b) {}
  1106       SetProcessedMapBase(const TR &b) : TR(b) {}
  1108     };
  1107     };
  1109     ///\brief \ref named-templ-param "Named parameter"
  1108     ///\brief \ref named-templ-param "Named parameter"
  1110     ///for setting \ref ProcessedMap object.
  1109     ///for setting \ref ProcessedMap object.
  1111     ///
  1110     ///
  1112     /// \ref named-templ-param "Named parameter"
  1111     /// \ref named-templ-param "Named parameter"
  1113     ///for setting \ref ProcessedMap object.
  1112     ///for setting \ref ProcessedMap object.
  1114     template<class T>
  1113     template<class T>
  1115     BfsWizard<DefProcessedMapBase<T> > processedMap(const T &t)
  1114     BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
  1116     {
  1115     {
  1117       Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
  1116       Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
  1118       return BfsWizard<DefProcessedMapBase<T> >(*this);
  1117       return BfsWizard<SetProcessedMapBase<T> >(*this);
  1119     }
  1118     }
  1120 
  1119 
  1121     template<class T>
  1120     template<class T>
  1122     struct DefDistMapBase : public Base {
  1121     struct SetDistMapBase : public Base {
  1123       typedef T DistMap;
  1122       typedef T DistMap;
  1124       static DistMap *createDistMap(const Digraph &) { return 0; };
  1123       static DistMap *createDistMap(const Digraph &) { return 0; };
  1125       DefDistMapBase(const TR &b) : TR(b) {}
  1124       SetDistMapBase(const TR &b) : TR(b) {}
  1126     };
  1125     };
  1127     ///\brief \ref named-templ-param "Named parameter"
  1126     ///\brief \ref named-templ-param "Named parameter"
  1128     ///for setting \ref DistMap object.
  1127     ///for setting \ref DistMap object.
  1129     ///
  1128     ///
  1130     /// \ref named-templ-param "Named parameter"
  1129     /// \ref named-templ-param "Named parameter"
  1131     ///for setting \ref DistMap object.
  1130     ///for setting \ref DistMap object.
  1132     template<class T>
  1131     template<class T>
  1133     BfsWizard<DefDistMapBase<T> > distMap(const T &t)
  1132     BfsWizard<SetDistMapBase<T> > distMap(const T &t)
  1134     {
  1133     {
  1135       Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
  1134       Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
  1136       return BfsWizard<DefDistMapBase<T> >(*this);
  1135       return BfsWizard<SetDistMapBase<T> >(*this);
  1137     }
  1136     }
  1138 
  1137 
  1139   };
  1138   };
  1140 
  1139 
  1141   ///Function type interface for Bfs algorithm.
  1140   ///Function type interface for Bfs algorithm.
  1347 
  1346 
  1348     /// \name Named template parameters
  1347     /// \name Named template parameters
  1349 
  1348 
  1350     ///@{
  1349     ///@{
  1351     template <class T>
  1350     template <class T>
  1352     struct DefReachedMapTraits : public Traits {
  1351     struct SetReachedMapTraits : public Traits {
  1353       typedef T ReachedMap;
  1352       typedef T ReachedMap;
  1354       static ReachedMap *createReachedMap(const Digraph &digraph) {
  1353       static ReachedMap *createReachedMap(const Digraph &digraph) {
  1355         throw UninitializedParameter();
  1354         throw UninitializedParameter();
  1356       }
  1355       }
  1357     };
  1356     };
  1358     /// \brief \ref named-templ-param "Named parameter" for setting
  1357     /// \brief \ref named-templ-param "Named parameter" for setting
  1359     /// ReachedMap type.
  1358     /// ReachedMap type.
  1360     ///
  1359     ///
  1361     /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
  1360     /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
  1362     template <class T>
  1361     template <class T>
  1363     struct DefReachedMap : public BfsVisit< Digraph, Visitor,
  1362     struct SetReachedMap : public BfsVisit< Digraph, Visitor,
  1364                                             DefReachedMapTraits<T> > {
  1363                                             SetReachedMapTraits<T> > {
  1365       typedef BfsVisit< Digraph, Visitor, DefReachedMapTraits<T> > Create;
  1364       typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
  1366     };
  1365     };
  1367     ///@}
  1366     ///@}
  1368 
  1367 
  1369   public:
  1368   public:
  1370 
  1369