gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 7 0
merge default
3 files changed with 144 insertions and 86 deletions:
↑ Collapse diff ↑
Ignore white space 768 line context
... ...
@@ -880,768 +880,773 @@
880 880

	
881 881
    ///The type of the map that indicates which nodes are reached.
882 882
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
883 883
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
884 884
    ///Instantiates a \ref ReachedMap.
885 885

	
886 886
    ///This function instantiates a \ref ReachedMap.
887 887
    ///\param g is the digraph, to which
888 888
    ///we would like to define the \ref ReachedMap.
889 889
    static ReachedMap *createReachedMap(const Digraph &g)
890 890
    {
891 891
      return new ReachedMap(g);
892 892
    }
893 893

	
894 894
    ///The type of the map that stores the distances of the nodes.
895 895

	
896 896
    ///The type of the map that stores the distances of the nodes.
897 897
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
898 898
    ///
899 899
    typedef NullMap<typename Digraph::Node,int> DistMap;
900 900
    ///Instantiates a \ref DistMap.
901 901

	
902 902
    ///This function instantiates a \ref DistMap.
903 903
    ///\param g is the digraph, to which we would like to define
904 904
    ///the \ref DistMap
905 905
#ifdef DOXYGEN
906 906
    static DistMap *createDistMap(const Digraph &g)
907 907
#else
908 908
    static DistMap *createDistMap(const Digraph &)
909 909
#endif
910 910
    {
911 911
      return new DistMap();
912 912
    }
913 913
  };
914 914

	
915 915
  /// Default traits class used by \ref BfsWizard
916 916

	
917 917
  /// To make it easier to use Bfs algorithm
918 918
  /// we have created a wizard class.
919 919
  /// This \ref BfsWizard class needs default traits,
920 920
  /// as well as the \ref Bfs class.
921 921
  /// The \ref BfsWizardBase is a class to be the default traits of the
922 922
  /// \ref BfsWizard class.
923 923
  template<class GR>
924 924
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
925 925
  {
926 926

	
927 927
    typedef BfsWizardDefaultTraits<GR> Base;
928 928
  protected:
929 929
    //The type of the nodes in the digraph.
930 930
    typedef typename Base::Digraph::Node Node;
931 931

	
932 932
    //Pointer to the digraph the algorithm runs on.
933 933
    void *_g;
934 934
    //Pointer to the map of reached nodes.
935 935
    void *_reached;
936 936
    //Pointer to the map of processed nodes.
937 937
    void *_processed;
938 938
    //Pointer to the map of predecessors arcs.
939 939
    void *_pred;
940 940
    //Pointer to the map of distances.
941 941
    void *_dist;
942 942
    //Pointer to the source node.
943 943
    Node _source;
944 944

	
945 945
    public:
946 946
    /// Constructor.
947 947

	
948 948
    /// This constructor does not require parameters, therefore it initiates
949 949
    /// all of the attributes to default values (0, INVALID).
950 950
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
951 951
                      _dist(0), _source(INVALID) {}
952 952

	
953 953
    /// Constructor.
954 954

	
955 955
    /// This constructor requires some parameters,
956 956
    /// listed in the parameters list.
957 957
    /// Others are initiated to 0.
958 958
    /// \param g The digraph the algorithm runs on.
959 959
    /// \param s The source node.
960 960
    BfsWizardBase(const GR &g, Node s=INVALID) :
961 961
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
962 962
      _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {}
963 963

	
964 964
  };
965 965

	
966 966
  /// Auxiliary class for the function type interface of BFS algorithm.
967 967

	
968 968
  /// This auxiliary class is created to implement the function type
969 969
  /// interface of \ref Bfs algorithm. It uses the functions and features
970 970
  /// of the plain \ref Bfs, but it is much simpler to use it.
971 971
  /// It should only be used through the \ref bfs() function, which makes
972 972
  /// it easier to use the algorithm.
973 973
  ///
974 974
  /// Simplicity means that the way to change the types defined
975 975
  /// in the traits class is based on functions that returns the new class
976 976
  /// and not on templatable built-in classes.
977 977
  /// When using the plain \ref Bfs
978 978
  /// the new class with the modified type comes from
979 979
  /// the original class by using the ::
980 980
  /// operator. In the case of \ref BfsWizard only
981 981
  /// a function have to be called, and it will
982 982
  /// return the needed class.
983 983
  ///
984 984
  /// It does not have own \ref run() method. When its \ref run() method
985 985
  /// is called, it initiates a plain \ref Bfs object, and calls the
986 986
  /// \ref Bfs::run() method of it.
987 987
  template<class TR>
988 988
  class BfsWizard : public TR
989 989
  {
990 990
    typedef TR Base;
991 991

	
992 992
    ///The type of the digraph the algorithm runs on.
993 993
    typedef typename TR::Digraph Digraph;
994 994

	
995 995
    typedef typename Digraph::Node Node;
996 996
    typedef typename Digraph::NodeIt NodeIt;
997 997
    typedef typename Digraph::Arc Arc;
998 998
    typedef typename Digraph::OutArcIt OutArcIt;
999 999

	
1000 1000
    ///\brief The type of the map that stores the predecessor
1001 1001
    ///arcs of the shortest paths.
1002 1002
    typedef typename TR::PredMap PredMap;
1003 1003
    ///\brief The type of the map that stores the distances of the nodes.
1004 1004
    typedef typename TR::DistMap DistMap;
1005 1005
    ///\brief The type of the map that indicates which nodes are reached.
1006 1006
    typedef typename TR::ReachedMap ReachedMap;
1007 1007
    ///\brief The type of the map that indicates which nodes are processed.
1008 1008
    typedef typename TR::ProcessedMap ProcessedMap;
1009 1009

	
1010 1010
  public:
1011 1011

	
1012 1012
    /// Constructor.
1013 1013
    BfsWizard() : TR() {}
1014 1014

	
1015 1015
    /// Constructor that requires parameters.
1016 1016

	
1017 1017
    /// Constructor that requires parameters.
1018 1018
    /// These parameters will be the default values for the traits class.
1019 1019
    BfsWizard(const Digraph &g, Node s=INVALID) :
1020 1020
      TR(g,s) {}
1021 1021

	
1022 1022
    ///Copy constructor
1023 1023
    BfsWizard(const TR &b) : TR(b) {}
1024 1024

	
1025 1025
    ~BfsWizard() {}
1026 1026

	
1027 1027
    ///Runs BFS algorithm from a source node.
1028 1028

	
1029 1029
    ///Runs BFS algorithm from a source node.
1030 1030
    ///The node can be given with the \ref source() function.
1031 1031
    void run()
1032 1032
    {
1033 1033
      if(Base::_source==INVALID) throw UninitializedParameter();
1034 1034
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1035 1035
      if(Base::_reached)
1036 1036
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1037 1037
      if(Base::_processed)
1038 1038
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1039 1039
      if(Base::_pred)
1040 1040
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041 1041
      if(Base::_dist)
1042 1042
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043 1043
      alg.run(Base::_source);
1044 1044
    }
1045 1045

	
1046 1046
    ///Runs BFS algorithm from the given node.
1047 1047

	
1048 1048
    ///Runs BFS algorithm from the given node.
1049 1049
    ///\param s is the given source.
1050 1050
    void run(Node s)
1051 1051
    {
1052 1052
      Base::_source=s;
1053 1053
      run();
1054 1054
    }
1055 1055

	
1056 1056
    /// Sets the source node, from which the Bfs algorithm runs.
1057 1057

	
1058 1058
    /// Sets the source node, from which the Bfs algorithm runs.
1059 1059
    /// \param s is the source node.
1060 1060
    BfsWizard<TR> &source(Node s)
1061 1061
    {
1062 1062
      Base::_source=s;
1063 1063
      return *this;
1064 1064
    }
1065 1065

	
1066 1066
    template<class T>
1067 1067
    struct SetPredMapBase : public Base {
1068 1068
      typedef T PredMap;
1069 1069
      static PredMap *createPredMap(const Digraph &) { return 0; };
1070 1070
      SetPredMapBase(const TR &b) : TR(b) {}
1071 1071
    };
1072 1072
    ///\brief \ref named-templ-param "Named parameter"
1073 1073
    ///for setting \ref PredMap object.
1074 1074
    ///
1075 1075
    /// \ref named-templ-param "Named parameter"
1076 1076
    ///for setting \ref PredMap object.
1077 1077
    template<class T>
1078 1078
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1079 1079
    {
1080 1080
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1081 1081
      return BfsWizard<SetPredMapBase<T> >(*this);
1082 1082
    }
1083 1083

	
1084 1084
    template<class T>
1085 1085
    struct SetReachedMapBase : public Base {
1086 1086
      typedef T ReachedMap;
1087 1087
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1088 1088
      SetReachedMapBase(const TR &b) : TR(b) {}
1089 1089
    };
1090 1090
    ///\brief \ref named-templ-param "Named parameter"
1091 1091
    ///for setting \ref ReachedMap object.
1092 1092
    ///
1093 1093
    /// \ref named-templ-param "Named parameter"
1094 1094
    ///for setting \ref ReachedMap object.
1095 1095
    template<class T>
1096 1096
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1097 1097
    {
1098 1098
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1099 1099
      return BfsWizard<SetReachedMapBase<T> >(*this);
1100 1100
    }
1101 1101

	
1102 1102
    template<class T>
1103 1103
    struct SetProcessedMapBase : public Base {
1104 1104
      typedef T ProcessedMap;
1105 1105
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1106 1106
      SetProcessedMapBase(const TR &b) : TR(b) {}
1107 1107
    };
1108 1108
    ///\brief \ref named-templ-param "Named parameter"
1109 1109
    ///for setting \ref ProcessedMap object.
1110 1110
    ///
1111 1111
    /// \ref named-templ-param "Named parameter"
1112 1112
    ///for setting \ref ProcessedMap object.
1113 1113
    template<class T>
1114 1114
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1115 1115
    {
1116 1116
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1117 1117
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1118 1118
    }
1119 1119

	
1120 1120
    template<class T>
1121 1121
    struct SetDistMapBase : public Base {
1122 1122
      typedef T DistMap;
1123 1123
      static DistMap *createDistMap(const Digraph &) { return 0; };
1124 1124
      SetDistMapBase(const TR &b) : TR(b) {}
1125 1125
    };
1126 1126
    ///\brief \ref named-templ-param "Named parameter"
1127 1127
    ///for setting \ref DistMap object.
1128 1128
    ///
1129 1129
    /// \ref named-templ-param "Named parameter"
1130 1130
    ///for setting \ref DistMap object.
1131 1131
    template<class T>
1132 1132
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1133 1133
    {
1134 1134
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1135 1135
      return BfsWizard<SetDistMapBase<T> >(*this);
1136 1136
    }
1137 1137

	
1138 1138
  };
1139 1139

	
1140 1140
  ///Function type interface for Bfs algorithm.
1141 1141

	
1142 1142
  /// \ingroup search
1143 1143
  ///Function type interface for Bfs algorithm.
1144 1144
  ///
1145 1145
  ///This function also has several
1146 1146
  ///\ref named-templ-func-param "named parameters",
1147 1147
  ///they are declared as the members of class \ref BfsWizard.
1148 1148
  ///The following
1149 1149
  ///example shows how to use these parameters.
1150 1150
  ///\code
1151 1151
  ///  bfs(g,source).predMap(preds).run();
1152 1152
  ///\endcode
1153 1153
  ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
1154 1154
  ///to the end of the parameter list.
1155 1155
  ///\sa BfsWizard
1156 1156
  ///\sa Bfs
1157 1157
  template<class GR>
1158 1158
  BfsWizard<BfsWizardBase<GR> >
1159 1159
  bfs(const GR &g,typename GR::Node s=INVALID)
1160 1160
  {
1161 1161
    return BfsWizard<BfsWizardBase<GR> >(g,s);
1162 1162
  }
1163 1163

	
1164 1164
#ifdef DOXYGEN
1165 1165
  /// \brief Visitor class for BFS.
1166 1166
  ///
1167 1167
  /// This class defines the interface of the BfsVisit events, and
1168 1168
  /// it could be the base of a real visitor class.
1169 1169
  template <typename _Digraph>
1170 1170
  struct BfsVisitor {
1171 1171
    typedef _Digraph Digraph;
1172 1172
    typedef typename Digraph::Arc Arc;
1173 1173
    typedef typename Digraph::Node Node;
1174 1174
    /// \brief Called for the source node(s) of the BFS.
1175 1175
    ///
1176 1176
    /// This function is called for the source node(s) of the BFS.
1177 1177
    void start(const Node& node) {}
1178 1178
    /// \brief Called when a node is reached first time.
1179 1179
    ///
1180 1180
    /// This function is called when a node is reached first time.
1181 1181
    void reach(const Node& node) {}
1182 1182
    /// \brief Called when a node is processed.
1183 1183
    ///
1184 1184
    /// This function is called when a node is processed.
1185 1185
    void process(const Node& node) {}
1186 1186
    /// \brief Called when an arc reaches a new node.
1187 1187
    ///
1188 1188
    /// This function is called when the BFS finds an arc whose target node
1189 1189
    /// is not reached yet.
1190 1190
    void discover(const Arc& arc) {}
1191 1191
    /// \brief Called when an arc is examined but its target node is
1192 1192
    /// already discovered.
1193 1193
    ///
1194 1194
    /// This function is called when an arc is examined but its target node is
1195 1195
    /// already discovered.
1196 1196
    void examine(const Arc& arc) {}
1197 1197
  };
1198 1198
#else
1199 1199
  template <typename _Digraph>
1200 1200
  struct BfsVisitor {
1201 1201
    typedef _Digraph Digraph;
1202 1202
    typedef typename Digraph::Arc Arc;
1203 1203
    typedef typename Digraph::Node Node;
1204 1204
    void start(const Node&) {}
1205 1205
    void reach(const Node&) {}
1206 1206
    void process(const Node&) {}
1207 1207
    void discover(const Arc&) {}
1208 1208
    void examine(const Arc&) {}
1209 1209

	
1210 1210
    template <typename _Visitor>
1211 1211
    struct Constraints {
1212 1212
      void constraints() {
1213 1213
        Arc arc;
1214 1214
        Node node;
1215 1215
        visitor.start(node);
1216 1216
        visitor.reach(node);
1217 1217
        visitor.process(node);
1218 1218
        visitor.discover(arc);
1219 1219
        visitor.examine(arc);
1220 1220
      }
1221 1221
      _Visitor& visitor;
1222 1222
    };
1223 1223
  };
1224 1224
#endif
1225 1225

	
1226 1226
  /// \brief Default traits class of BfsVisit class.
1227 1227
  ///
1228 1228
  /// Default traits class of BfsVisit class.
1229 1229
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1230 1230
  template<class _Digraph>
1231 1231
  struct BfsVisitDefaultTraits {
1232 1232

	
1233 1233
    /// \brief The type of the digraph the algorithm runs on.
1234 1234
    typedef _Digraph Digraph;
1235 1235

	
1236 1236
    /// \brief The type of the map that indicates which nodes are reached.
1237 1237
    ///
1238 1238
    /// The type of the map that indicates which nodes are reached.
1239 1239
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1240 1240
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1241 1241

	
1242 1242
    /// \brief Instantiates a \ref ReachedMap.
1243 1243
    ///
1244 1244
    /// This function instantiates a \ref ReachedMap.
1245 1245
    /// \param digraph is the digraph, to which
1246 1246
    /// we would like to define the \ref ReachedMap.
1247 1247
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1248 1248
      return new ReachedMap(digraph);
1249 1249
    }
1250 1250

	
1251 1251
  };
1252 1252

	
1253 1253
  /// \ingroup search
1254 1254
  ///
1255 1255
  /// \brief %BFS algorithm class with visitor interface.
1256 1256
  ///
1257 1257
  /// This class provides an efficient implementation of the %BFS algorithm
1258 1258
  /// with visitor interface.
1259 1259
  ///
1260 1260
  /// The %BfsVisit class provides an alternative interface to the Bfs
1261 1261
  /// class. It works with callback mechanism, the BfsVisit object calls
1262 1262
  /// the member functions of the \c Visitor class on every BFS event.
1263 1263
  ///
1264
  /// This interface of the BFS algorithm should be used in special cases
1265
  /// when extra actions have to be performed in connection with certain
1266
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1267
  /// instead.
1268
  ///
1264 1269
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1265 1270
  /// The default value is
1266 1271
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1267 1272
  /// \ref BfsVisit, it is only passed to \ref BfsVisitDefaultTraits.
1268 1273
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1269 1274
  /// \ref BfsVisitor "BfsVisitor<_Digraph>" is an empty visitor, which
1270 1275
  /// does not observe the BFS events. If you want to observe the BFS
1271 1276
  /// events, you should implement your own visitor class.
1272 1277
  /// \tparam _Traits Traits class to set various data types used by the
1273 1278
  /// algorithm. The default traits class is
1274 1279
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<_Digraph>".
1275 1280
  /// See \ref BfsVisitDefaultTraits for the documentation of
1276 1281
  /// a BFS visit traits class.
1277 1282
#ifdef DOXYGEN
1278 1283
  template <typename _Digraph, typename _Visitor, typename _Traits>
1279 1284
#else
1280 1285
  template <typename _Digraph = ListDigraph,
1281 1286
            typename _Visitor = BfsVisitor<_Digraph>,
1282 1287
            typename _Traits = BfsDefaultTraits<_Digraph> >
1283 1288
#endif
1284 1289
  class BfsVisit {
1285 1290
  public:
1286 1291

	
1287 1292
    /// \brief \ref Exception for uninitialized parameters.
1288 1293
    ///
1289 1294
    /// This error represents problems in the initialization
1290 1295
    /// of the parameters of the algorithm.
1291 1296
    class UninitializedParameter : public lemon::UninitializedParameter {
1292 1297
    public:
1293 1298
      virtual const char* what() const throw()
1294 1299
      {
1295 1300
        return "lemon::BfsVisit::UninitializedParameter";
1296 1301
      }
1297 1302
    };
1298 1303

	
1299 1304
    ///The traits class.
1300 1305
    typedef _Traits Traits;
1301 1306

	
1302 1307
    ///The type of the digraph the algorithm runs on.
1303 1308
    typedef typename Traits::Digraph Digraph;
1304 1309

	
1305 1310
    ///The visitor type used by the algorithm.
1306 1311
    typedef _Visitor Visitor;
1307 1312

	
1308 1313
    ///The type of the map that indicates which nodes are reached.
1309 1314
    typedef typename Traits::ReachedMap ReachedMap;
1310 1315

	
1311 1316
  private:
1312 1317

	
1313 1318
    typedef typename Digraph::Node Node;
1314 1319
    typedef typename Digraph::NodeIt NodeIt;
1315 1320
    typedef typename Digraph::Arc Arc;
1316 1321
    typedef typename Digraph::OutArcIt OutArcIt;
1317 1322

	
1318 1323
    //Pointer to the underlying digraph.
1319 1324
    const Digraph *_digraph;
1320 1325
    //Pointer to the visitor object.
1321 1326
    Visitor *_visitor;
1322 1327
    //Pointer to the map of reached status of the nodes.
1323 1328
    ReachedMap *_reached;
1324 1329
    //Indicates if _reached is locally allocated (true) or not.
1325 1330
    bool local_reached;
1326 1331

	
1327 1332
    std::vector<typename Digraph::Node> _list;
1328 1333
    int _list_front, _list_back;
1329 1334

	
1330 1335
    ///Creates the maps if necessary.
1331 1336
    ///\todo Better memory allocation (instead of new).
1332 1337
    void create_maps() {
1333 1338
      if(!_reached) {
1334 1339
        local_reached = true;
1335 1340
        _reached = Traits::createReachedMap(*_digraph);
1336 1341
      }
1337 1342
    }
1338 1343

	
1339 1344
  protected:
1340 1345

	
1341 1346
    BfsVisit() {}
1342 1347

	
1343 1348
  public:
1344 1349

	
1345 1350
    typedef BfsVisit Create;
1346 1351

	
1347 1352
    /// \name Named template parameters
1348 1353

	
1349 1354
    ///@{
1350 1355
    template <class T>
1351 1356
    struct SetReachedMapTraits : public Traits {
1352 1357
      typedef T ReachedMap;
1353 1358
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1354 1359
        throw UninitializedParameter();
1355 1360
      }
1356 1361
    };
1357 1362
    /// \brief \ref named-templ-param "Named parameter" for setting
1358 1363
    /// ReachedMap type.
1359 1364
    ///
1360 1365
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1361 1366
    template <class T>
1362 1367
    struct SetReachedMap : public BfsVisit< Digraph, Visitor,
1363 1368
                                            SetReachedMapTraits<T> > {
1364 1369
      typedef BfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1365 1370
    };
1366 1371
    ///@}
1367 1372

	
1368 1373
  public:
1369 1374

	
1370 1375
    /// \brief Constructor.
1371 1376
    ///
1372 1377
    /// Constructor.
1373 1378
    ///
1374 1379
    /// \param digraph The digraph the algorithm runs on.
1375 1380
    /// \param visitor The visitor object of the algorithm.
1376 1381
    BfsVisit(const Digraph& digraph, Visitor& visitor)
1377 1382
      : _digraph(&digraph), _visitor(&visitor),
1378 1383
        _reached(0), local_reached(false) {}
1379 1384

	
1380 1385
    /// \brief Destructor.
1381 1386
    ~BfsVisit() {
1382 1387
      if(local_reached) delete _reached;
1383 1388
    }
1384 1389

	
1385 1390
    /// \brief Sets the map that indicates which nodes are reached.
1386 1391
    ///
1387 1392
    /// Sets the map that indicates which nodes are reached.
1388 1393
    /// If you don't use this function before calling \ref run(),
1389 1394
    /// it will allocate one. The destructor deallocates this
1390 1395
    /// automatically allocated map, of course.
1391 1396
    /// \return <tt> (*this) </tt>
1392 1397
    BfsVisit &reachedMap(ReachedMap &m) {
1393 1398
      if(local_reached) {
1394 1399
        delete _reached;
1395 1400
        local_reached = false;
1396 1401
      }
1397 1402
      _reached = &m;
1398 1403
      return *this;
1399 1404
    }
1400 1405

	
1401 1406
  public:
1402 1407

	
1403 1408
    /// \name Execution control
1404 1409
    /// The simplest way to execute the algorithm is to use
1405 1410
    /// one of the member functions called \ref lemon::BfsVisit::run()
1406 1411
    /// "run()".
1407 1412
    /// \n
1408 1413
    /// If you need more control on the execution, first you must call
1409 1414
    /// \ref lemon::BfsVisit::init() "init()", then you can add several
1410 1415
    /// source nodes with \ref lemon::BfsVisit::addSource() "addSource()".
1411 1416
    /// Finally \ref lemon::BfsVisit::start() "start()" will perform the
1412 1417
    /// actual path computation.
1413 1418

	
1414 1419
    /// @{
1415 1420

	
1416 1421
    /// \brief Initializes the internal data structures.
1417 1422
    ///
1418 1423
    /// Initializes the internal data structures.
1419 1424
    void init() {
1420 1425
      create_maps();
1421 1426
      _list.resize(countNodes(*_digraph));
1422 1427
      _list_front = _list_back = -1;
1423 1428
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1424 1429
        _reached->set(u, false);
1425 1430
      }
1426 1431
    }
1427 1432

	
1428 1433
    /// \brief Adds a new source node.
1429 1434
    ///
1430 1435
    /// Adds a new source node to the set of nodes to be processed.
1431 1436
    void addSource(Node s) {
1432 1437
      if(!(*_reached)[s]) {
1433 1438
          _reached->set(s,true);
1434 1439
          _visitor->start(s);
1435 1440
          _visitor->reach(s);
1436 1441
          _list[++_list_back] = s;
1437 1442
        }
1438 1443
    }
1439 1444

	
1440 1445
    /// \brief Processes the next node.
1441 1446
    ///
1442 1447
    /// Processes the next node.
1443 1448
    ///
1444 1449
    /// \return The processed node.
1445 1450
    ///
1446 1451
    /// \pre The queue must not be empty.
1447 1452
    Node processNextNode() {
1448 1453
      Node n = _list[++_list_front];
1449 1454
      _visitor->process(n);
1450 1455
      Arc e;
1451 1456
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1452 1457
        Node m = _digraph->target(e);
1453 1458
        if (!(*_reached)[m]) {
1454 1459
          _visitor->discover(e);
1455 1460
          _visitor->reach(m);
1456 1461
          _reached->set(m, true);
1457 1462
          _list[++_list_back] = m;
1458 1463
        } else {
1459 1464
          _visitor->examine(e);
1460 1465
        }
1461 1466
      }
1462 1467
      return n;
1463 1468
    }
1464 1469

	
1465 1470
    /// \brief Processes the next node.
1466 1471
    ///
1467 1472
    /// Processes the next node and checks if the given target node
1468 1473
    /// is reached. If the target node is reachable from the processed
1469 1474
    /// node, then the \c reach parameter will be set to \c true.
1470 1475
    ///
1471 1476
    /// \param target The target node.
1472 1477
    /// \retval reach Indicates if the target node is reached.
1473 1478
    /// It should be initially \c false.
1474 1479
    ///
1475 1480
    /// \return The processed node.
1476 1481
    ///
1477 1482
    /// \pre The queue must not be empty.
1478 1483
    Node processNextNode(Node target, bool& reach) {
1479 1484
      Node n = _list[++_list_front];
1480 1485
      _visitor->process(n);
1481 1486
      Arc e;
1482 1487
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1483 1488
        Node m = _digraph->target(e);
1484 1489
        if (!(*_reached)[m]) {
1485 1490
          _visitor->discover(e);
1486 1491
          _visitor->reach(m);
1487 1492
          _reached->set(m, true);
1488 1493
          _list[++_list_back] = m;
1489 1494
          reach = reach || (target == m);
1490 1495
        } else {
1491 1496
          _visitor->examine(e);
1492 1497
        }
1493 1498
      }
1494 1499
      return n;
1495 1500
    }
1496 1501

	
1497 1502
    /// \brief Processes the next node.
1498 1503
    ///
1499 1504
    /// Processes the next node and checks if at least one of reached
1500 1505
    /// nodes has \c true value in the \c nm node map. If one node
1501 1506
    /// with \c true value is reachable from the processed node, then the
1502 1507
    /// \c rnode parameter will be set to the first of such nodes.
1503 1508
    ///
1504 1509
    /// \param nm A \c bool (or convertible) node map that indicates the
1505 1510
    /// possible targets.
1506 1511
    /// \retval rnode The reached target node.
1507 1512
    /// It should be initially \c INVALID.
1508 1513
    ///
1509 1514
    /// \return The processed node.
1510 1515
    ///
1511 1516
    /// \pre The queue must not be empty.
1512 1517
    template <typename NM>
1513 1518
    Node processNextNode(const NM& nm, Node& rnode) {
1514 1519
      Node n = _list[++_list_front];
1515 1520
      _visitor->process(n);
1516 1521
      Arc e;
1517 1522
      for (_digraph->firstOut(e, n); e != INVALID; _digraph->nextOut(e)) {
1518 1523
        Node m = _digraph->target(e);
1519 1524
        if (!(*_reached)[m]) {
1520 1525
          _visitor->discover(e);
1521 1526
          _visitor->reach(m);
1522 1527
          _reached->set(m, true);
1523 1528
          _list[++_list_back] = m;
1524 1529
          if (nm[m] && rnode == INVALID) rnode = m;
1525 1530
        } else {
1526 1531
          _visitor->examine(e);
1527 1532
        }
1528 1533
      }
1529 1534
      return n;
1530 1535
    }
1531 1536

	
1532 1537
    /// \brief The next node to be processed.
1533 1538
    ///
1534 1539
    /// Returns the next node to be processed or \c INVALID if the queue
1535 1540
    /// is empty.
1536 1541
    Node nextNode() const {
1537 1542
      return _list_front != _list_back ? _list[_list_front + 1] : INVALID;
1538 1543
    }
1539 1544

	
1540 1545
    /// \brief Returns \c false if there are nodes
1541 1546
    /// to be processed.
1542 1547
    ///
1543 1548
    /// Returns \c false if there are nodes
1544 1549
    /// to be processed in the queue.
1545 1550
    bool emptyQueue() const { return _list_front == _list_back; }
1546 1551

	
1547 1552
    /// \brief Returns the number of the nodes to be processed.
1548 1553
    ///
1549 1554
    /// Returns the number of the nodes to be processed in the queue.
1550 1555
    int queueSize() const { return _list_back - _list_front; }
1551 1556

	
1552 1557
    /// \brief Executes the algorithm.
1553 1558
    ///
1554 1559
    /// Executes the algorithm.
1555 1560
    ///
1556 1561
    /// This method runs the %BFS algorithm from the root node(s)
1557 1562
    /// in order to compute the shortest path to each node.
1558 1563
    ///
1559 1564
    /// The algorithm computes
1560 1565
    /// - the shortest path tree (forest),
1561 1566
    /// - the distance of each node from the root(s).
1562 1567
    ///
1563 1568
    /// \pre init() must be called and at least one root node should be added
1564 1569
    /// with addSource() before using this function.
1565 1570
    ///
1566 1571
    /// \note <tt>b.start()</tt> is just a shortcut of the following code.
1567 1572
    /// \code
1568 1573
    ///   while ( !b.emptyQueue() ) {
1569 1574
    ///     b.processNextNode();
1570 1575
    ///   }
1571 1576
    /// \endcode
1572 1577
    void start() {
1573 1578
      while ( !emptyQueue() ) processNextNode();
1574 1579
    }
1575 1580

	
1576 1581
    /// \brief Executes the algorithm until the given target node is reached.
1577 1582
    ///
1578 1583
    /// Executes the algorithm until the given target node is reached.
1579 1584
    ///
1580 1585
    /// This method runs the %BFS algorithm from the root node(s)
1581 1586
    /// in order to compute the shortest path to \c dest.
1582 1587
    ///
1583 1588
    /// The algorithm computes
1584 1589
    /// - the shortest path to \c dest,
1585 1590
    /// - the distance of \c dest from the root(s).
1586 1591
    ///
1587 1592
    /// \pre init() must be called and at least one root node should be
1588 1593
    /// added with addSource() before using this function.
1589 1594
    ///
1590 1595
    /// \note <tt>b.start(t)</tt> is just a shortcut of the following code.
1591 1596
    /// \code
1592 1597
    ///   bool reach = false;
1593 1598
    ///   while ( !b.emptyQueue() && !reach ) {
1594 1599
    ///     b.processNextNode(t, reach);
1595 1600
    ///   }
1596 1601
    /// \endcode
1597 1602
    void start(Node dest) {
1598 1603
      bool reach = false;
1599 1604
      while ( !emptyQueue() && !reach ) processNextNode(dest, reach);
1600 1605
    }
1601 1606

	
1602 1607
    /// \brief Executes the algorithm until a condition is met.
1603 1608
    ///
1604 1609
    /// Executes the algorithm until a condition is met.
1605 1610
    ///
1606 1611
    /// This method runs the %BFS algorithm from the root node(s) in
1607 1612
    /// order to compute the shortest path to a node \c v with
1608 1613
    /// <tt>nm[v]</tt> true, if such a node can be found.
1609 1614
    ///
1610 1615
    /// \param nm must be a bool (or convertible) node map. The
1611 1616
    /// algorithm will stop when it reaches a node \c v with
1612 1617
    /// <tt>nm[v]</tt> true.
1613 1618
    ///
1614 1619
    /// \return The reached node \c v with <tt>nm[v]</tt> true or
1615 1620
    /// \c INVALID if no such node was found.
1616 1621
    ///
1617 1622
    /// \pre init() must be called and at least one root node should be
1618 1623
    /// added with addSource() before using this function.
1619 1624
    ///
1620 1625
    /// \note <tt>b.start(nm)</tt> is just a shortcut of the following code.
1621 1626
    /// \code
1622 1627
    ///   Node rnode = INVALID;
1623 1628
    ///   while ( !b.emptyQueue() && rnode == INVALID ) {
1624 1629
    ///     b.processNextNode(nm, rnode);
1625 1630
    ///   }
1626 1631
    ///   return rnode;
1627 1632
    /// \endcode
1628 1633
    template <typename NM>
1629 1634
    Node start(const NM &nm) {
1630 1635
      Node rnode = INVALID;
1631 1636
      while ( !emptyQueue() && rnode == INVALID ) {
1632 1637
        processNextNode(nm, rnode);
1633 1638
      }
1634 1639
      return rnode;
1635 1640
    }
1636 1641

	
1637 1642
    /// \brief Runs the algorithm from the given node.
1638 1643
    ///
1639 1644
    /// This method runs the %BFS algorithm from node \c s
1640 1645
    /// in order to compute the shortest path to each node.
1641 1646
    ///
1642 1647
    /// The algorithm computes
1643 1648
    /// - the shortest path tree,
1644 1649
    /// - the distance of each node from the root.
1645 1650
    ///
1646 1651
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1647 1652
    ///\code
Ignore white space 768 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BITS_BASE_EXTENDER_H
20 20
#define LEMON_BITS_BASE_EXTENDER_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/error.h>
24 24

	
25 25
#include <lemon/bits/map_extender.h>
26 26
#include <lemon/bits/default_map.h>
27 27

	
28 28
#include <lemon/concept_check.h>
29 29
#include <lemon/concepts/maps.h>
30 30

	
31 31
///\ingroup digraphbits
32 32
///\file
33 33
///\brief Extenders for the digraph types
34 34
namespace lemon {
35 35

	
36 36
  /// \ingroup digraphbits
37 37
  ///
38 38
  /// \brief BaseDigraph to BaseGraph extender
39 39
  template <typename Base>
40 40
  class UndirDigraphExtender : public Base {
41 41

	
42 42
  public:
43 43

	
44 44
    typedef Base Parent;
45 45
    typedef typename Parent::Arc Edge;
46 46
    typedef typename Parent::Node Node;
47 47

	
48 48
    typedef True UndirectedTag;
49 49

	
50 50
    class Arc : public Edge {
51 51
      friend class UndirDigraphExtender;
52 52

	
53 53
    protected:
54 54
      bool forward;
55 55

	
56 56
      Arc(const Edge &ue, bool _forward) :
57 57
        Edge(ue), forward(_forward) {}
58 58

	
59 59
    public:
60 60
      Arc() {}
61 61

	
62
      /// Invalid arc constructor
62
      // Invalid arc constructor
63 63
      Arc(Invalid i) : Edge(i), forward(true) {}
64 64

	
65 65
      bool operator==(const Arc &that) const {
66 66
        return forward==that.forward && Edge(*this)==Edge(that);
67 67
      }
68 68
      bool operator!=(const Arc &that) const {
69 69
        return forward!=that.forward || Edge(*this)!=Edge(that);
70 70
      }
71 71
      bool operator<(const Arc &that) const {
72 72
        return forward<that.forward ||
73 73
          (!(that.forward<forward) && Edge(*this)<Edge(that));
74 74
      }
75 75
    };
76 76

	
77
    /// First node of the edge
78
    Node u(const Edge &e) const {
79
      return Parent::source(e);
80
    }
77 81

	
78

	
79
    using Parent::source;
80

	
81
    /// Source of the given Arc.
82
    /// Source of the given arc
82 83
    Node source(const Arc &e) const {
83 84
      return e.forward ? Parent::source(e) : Parent::target(e);
84 85
    }
85 86

	
86
    using Parent::target;
87
    /// Second node of the edge
88
    Node v(const Edge &e) const {
89
      return Parent::target(e);
90
    }
87 91

	
88
    /// Target of the given Arc.
92
    /// Target of the given arc
89 93
    Node target(const Arc &e) const {
90 94
      return e.forward ? Parent::target(e) : Parent::source(e);
91 95
    }
92 96

	
93 97
    /// \brief Directed arc from an edge.
94 98
    ///
95
    /// Returns a directed arc corresponding to the specified Edge.
96
    /// If the given bool is true the given edge and the
97
    /// returned arc have the same source node.
98
    static Arc direct(const Edge &ue, bool d) {
99
      return Arc(ue, d);
99
    /// Returns a directed arc corresponding to the specified edge.
100
    /// If the given bool is true, the first node of the given edge and
101
    /// the source node of the returned arc are the same.
102
    static Arc direct(const Edge &e, bool d) {
103
      return Arc(e, d);
100 104
    }
101 105

	
102
    /// Returns whether the given directed arc is same orientation as the
103
    /// corresponding edge.
106
    /// Returns whether the given directed arc has the same orientation
107
    /// as the corresponding edge.
104 108
    ///
105 109
    /// \todo reference to the corresponding point of the undirected digraph
106 110
    /// concept. "What does the direction of an edge mean?"
107
    static bool direction(const Arc &e) { return e.forward; }
108

	
111
    static bool direction(const Arc &a) { return a.forward; }
109 112

	
110 113
    using Parent::first;
111 114
    using Parent::next;
112 115

	
113 116
    void first(Arc &e) const {
114 117
      Parent::first(e);
115 118
      e.forward=true;
116 119
    }
117 120

	
118 121
    void next(Arc &e) const {
119 122
      if( e.forward ) {
120 123
        e.forward = false;
121 124
      }
122 125
      else {
123 126
        Parent::next(e);
124 127
        e.forward = true;
125 128
      }
126 129
    }
127 130

	
128 131
    void firstOut(Arc &e, const Node &n) const {
129 132
      Parent::firstIn(e,n);
130 133
      if( Edge(e) != INVALID ) {
131 134
        e.forward = false;
132 135
      }
133 136
      else {
134 137
        Parent::firstOut(e,n);
135 138
        e.forward = true;
136 139
      }
137 140
    }
138 141
    void nextOut(Arc &e) const {
139 142
      if( ! e.forward ) {
140 143
        Node n = Parent::target(e);
141 144
        Parent::nextIn(e);
142 145
        if( Edge(e) == INVALID ) {
143 146
          Parent::firstOut(e, n);
144 147
          e.forward = true;
145 148
        }
146 149
      }
147 150
      else {
148 151
        Parent::nextOut(e);
149 152
      }
150 153
    }
151 154

	
152 155
    void firstIn(Arc &e, const Node &n) const {
153 156
      Parent::firstOut(e,n);
154 157
      if( Edge(e) != INVALID ) {
155 158
        e.forward = false;
156 159
      }
157 160
      else {
158 161
        Parent::firstIn(e,n);
159 162
        e.forward = true;
160 163
      }
161 164
    }
162 165
    void nextIn(Arc &e) const {
163 166
      if( ! e.forward ) {
164 167
        Node n = Parent::source(e);
165 168
        Parent::nextOut(e);
166 169
        if( Edge(e) == INVALID ) {
167 170
          Parent::firstIn(e, n);
168 171
          e.forward = true;
169 172
        }
170 173
      }
171 174
      else {
172 175
        Parent::nextIn(e);
173 176
      }
174 177
    }
175 178

	
176 179
    void firstInc(Edge &e, bool &d, const Node &n) const {
177 180
      d = true;
178 181
      Parent::firstOut(e, n);
179 182
      if (e != INVALID) return;
180 183
      d = false;
181 184
      Parent::firstIn(e, n);
182 185
    }
183 186

	
184 187
    void nextInc(Edge &e, bool &d) const {
185 188
      if (d) {
186 189
        Node s = Parent::source(e);
187 190
        Parent::nextOut(e);
188 191
        if (e != INVALID) return;
189 192
        d = false;
190 193
        Parent::firstIn(e, s);
191 194
      } else {
192 195
        Parent::nextIn(e);
193 196
      }
194 197
    }
195 198

	
196 199
    Node nodeFromId(int ix) const {
197 200
      return Parent::nodeFromId(ix);
198 201
    }
199 202

	
200 203
    Arc arcFromId(int ix) const {
201 204
      return direct(Parent::arcFromId(ix >> 1), bool(ix & 1));
202 205
    }
203 206

	
204 207
    Edge edgeFromId(int ix) const {
205 208
      return Parent::arcFromId(ix);
206 209
    }
207 210

	
208 211
    int id(const Node &n) const {
209 212
      return Parent::id(n);
210 213
    }
211 214

	
212 215
    int id(const Edge &e) const {
213 216
      return Parent::id(e);
214 217
    }
215 218

	
216 219
    int id(const Arc &e) const {
217 220
      return 2 * Parent::id(e) + int(e.forward);
218 221
    }
219 222

	
220 223
    int maxNodeId() const {
221 224
      return Parent::maxNodeId();
222 225
    }
223 226

	
224 227
    int maxArcId() const {
225 228
      return 2 * Parent::maxArcId() + 1;
226 229
    }
227 230

	
228 231
    int maxEdgeId() const {
229 232
      return Parent::maxArcId();
230 233
    }
231 234

	
232

	
233 235
    int arcNum() const {
234 236
      return 2 * Parent::arcNum();
235 237
    }
236 238

	
237 239
    int edgeNum() const {
238 240
      return Parent::arcNum();
239 241
    }
240 242

	
241 243
    Arc findArc(Node s, Node t, Arc p = INVALID) const {
242 244
      if (p == INVALID) {
243 245
        Edge arc = Parent::findArc(s, t);
244 246
        if (arc != INVALID) return direct(arc, true);
245 247
        arc = Parent::findArc(t, s);
246 248
        if (arc != INVALID) return direct(arc, false);
247 249
      } else if (direction(p)) {
248 250
        Edge arc = Parent::findArc(s, t, p);
249 251
        if (arc != INVALID) return direct(arc, true);
250 252
        arc = Parent::findArc(t, s);
251 253
        if (arc != INVALID) return direct(arc, false);
252 254
      } else {
253 255
        Edge arc = Parent::findArc(t, s, p);
254 256
        if (arc != INVALID) return direct(arc, false);
255 257
      }
256 258
      return INVALID;
257 259
    }
258 260

	
259 261
    Edge findEdge(Node s, Node t, Edge p = INVALID) const {
260 262
      if (s != t) {
261 263
        if (p == INVALID) {
262 264
          Edge arc = Parent::findArc(s, t);
263 265
          if (arc != INVALID) return arc;
264 266
          arc = Parent::findArc(t, s);
265 267
          if (arc != INVALID) return arc;
266 268
        } else if (Parent::s(p) == s) {
267 269
          Edge arc = Parent::findArc(s, t, p);
268 270
          if (arc != INVALID) return arc;
269 271
          arc = Parent::findArc(t, s);
270 272
          if (arc != INVALID) return arc;
271 273
        } else {
272 274
          Edge arc = Parent::findArc(t, s, p);
273 275
          if (arc != INVALID) return arc;
274 276
        }
275 277
      } else {
276 278
        return Parent::findArc(s, t, p);
277 279
      }
278 280
      return INVALID;
279 281
    }
280 282
  };
281 283

	
282 284
  template <typename Base>
283 285
  class BidirBpGraphExtender : public Base {
284 286
  public:
285 287
    typedef Base Parent;
286 288
    typedef BidirBpGraphExtender Digraph;
287 289

	
288 290
    typedef typename Parent::Node Node;
289 291
    typedef typename Parent::Edge Edge;
290 292

	
291 293

	
292 294
    using Parent::first;
293 295
    using Parent::next;
294 296

	
295 297
    using Parent::id;
296 298

	
297 299
    class Red : public Node {
298 300
      friend class BidirBpGraphExtender;
299 301
    public:
300 302
      Red() {}
301 303
      Red(const Node& node) : Node(node) {
302 304
        LEMON_ASSERT(Parent::red(node) || node == INVALID,
303 305
                     typename Parent::NodeSetError());
304 306
      }
305 307
      Red& operator=(const Node& node) {
306 308
        LEMON_ASSERT(Parent::red(node) || node == INVALID,
307 309
                     typename Parent::NodeSetError());
308 310
        Node::operator=(node);
309 311
        return *this;
310 312
      }
311 313
      Red(Invalid) : Node(INVALID) {}
312 314
      Red& operator=(Invalid) {
313 315
        Node::operator=(INVALID);
314 316
        return *this;
315 317
      }
316 318
    };
317 319

	
318 320
    void first(Red& node) const {
319 321
      Parent::firstRed(static_cast<Node&>(node));
320 322
    }
321 323
    void next(Red& node) const {
322 324
      Parent::nextRed(static_cast<Node&>(node));
323 325
    }
324 326

	
325 327
    int id(const Red& node) const {
326 328
      return Parent::redId(node);
327 329
    }
328 330

	
329 331
    class Blue : public Node {
330 332
      friend class BidirBpGraphExtender;
331 333
    public:
332 334
      Blue() {}
333 335
      Blue(const Node& node) : Node(node) {
334 336
        LEMON_ASSERT(Parent::blue(node) || node == INVALID,
335 337
                     typename Parent::NodeSetError());
336 338
      }
337 339
      Blue& operator=(const Node& node) {
338 340
        LEMON_ASSERT(Parent::blue(node) || node == INVALID,
339 341
                     typename Parent::NodeSetError());
340 342
        Node::operator=(node);
341 343
        return *this;
342 344
      }
343 345
      Blue(Invalid) : Node(INVALID) {}
344 346
      Blue& operator=(Invalid) {
345 347
        Node::operator=(INVALID);
346 348
        return *this;
347 349
      }
348 350
    };
349 351

	
350 352
    void first(Blue& node) const {
351 353
      Parent::firstBlue(static_cast<Node&>(node));
352 354
    }
353 355
    void next(Blue& node) const {
354 356
      Parent::nextBlue(static_cast<Node&>(node));
355 357
    }
356 358

	
357 359
    int id(const Blue& node) const {
358 360
      return Parent::redId(node);
359 361
    }
360 362

	
361 363
    Node source(const Edge& arc) const {
362 364
      return red(arc);
363 365
    }
364 366
    Node target(const Edge& arc) const {
365 367
      return blue(arc);
366 368
    }
367 369

	
368 370
    void firstInc(Edge& arc, bool& dir, const Node& node) const {
369 371
      if (Parent::red(node)) {
370 372
        Parent::firstFromRed(arc, node);
371 373
        dir = true;
372 374
      } else {
373 375
        Parent::firstFromBlue(arc, node);
374 376
        dir = static_cast<Edge&>(arc) == INVALID;
375 377
      }
376 378
    }
377 379
    void nextInc(Edge& arc, bool& dir) const {
378 380
      if (dir) {
379 381
        Parent::nextFromRed(arc);
380 382
      } else {
381 383
        Parent::nextFromBlue(arc);
382 384
        if (arc == INVALID) dir = true;
383 385
      }
384 386
    }
385 387

	
386 388
    class Arc : public Edge {
387 389
      friend class BidirBpGraphExtender;
388 390
    protected:
389 391
      bool forward;
390 392

	
391 393
      Arc(const Edge& arc, bool _forward)
392 394
        : Edge(arc), forward(_forward) {}
393 395

	
394 396
    public:
395 397
      Arc() {}
396 398
      Arc (Invalid) : Edge(INVALID), forward(true) {}
397 399
      bool operator==(const Arc& i) const {
398 400
        return Edge::operator==(i) && forward == i.forward;
399 401
      }
400 402
      bool operator!=(const Arc& i) const {
401 403
        return Edge::operator!=(i) || forward != i.forward;
402 404
      }
403 405
      bool operator<(const Arc& i) const {
404 406
        return Edge::operator<(i) ||
405 407
          (!(i.forward<forward) && Edge(*this)<Edge(i));
406 408
      }
407 409
    };
408 410

	
409 411
    void first(Arc& arc) const {
410 412
      Parent::first(static_cast<Edge&>(arc));
411 413
      arc.forward = true;
412 414
    }
413 415

	
414 416
    void next(Arc& arc) const {
415 417
      if (!arc.forward) {
416 418
        Parent::next(static_cast<Edge&>(arc));
417 419
      }
418 420
      arc.forward = !arc.forward;
419 421
    }
420 422

	
421 423
    void firstOut(Arc& arc, const Node& node) const {
422 424
      if (Parent::red(node)) {
423 425
        Parent::firstFromRed(arc, node);
424 426
        arc.forward = true;
425 427
      } else {
426 428
        Parent::firstFromBlue(arc, node);
427 429
        arc.forward = static_cast<Edge&>(arc) == INVALID;
428 430
      }
429 431
    }
430 432
    void nextOut(Arc& arc) const {
431 433
      if (arc.forward) {
432 434
        Parent::nextFromRed(arc);
433 435
      } else {
434 436
        Parent::nextFromBlue(arc);
435 437
        arc.forward = static_cast<Edge&>(arc) == INVALID;
436 438
      }
437 439
    }
438 440

	
439 441
    void firstIn(Arc& arc, const Node& node) const {
440 442
      if (Parent::blue(node)) {
441 443
        Parent::firstFromBlue(arc, node);
442 444
        arc.forward = true;
443 445
      } else {
444 446
        Parent::firstFromRed(arc, node);
445 447
        arc.forward = static_cast<Edge&>(arc) == INVALID;
446 448
      }
447 449
    }
448 450
    void nextIn(Arc& arc) const {
449 451
      if (arc.forward) {
450 452
        Parent::nextFromBlue(arc);
451 453
      } else {
452 454
        Parent::nextFromRed(arc);
453 455
        arc.forward = static_cast<Edge&>(arc) == INVALID;
454 456
      }
455 457
    }
456 458

	
457 459
    Node source(const Arc& arc) const {
458 460
      return arc.forward ? Parent::red(arc) : Parent::blue(arc);
459 461
    }
460 462
    Node target(const Arc& arc) const {
461 463
      return arc.forward ? Parent::blue(arc) : Parent::red(arc);
462 464
    }
463 465

	
464 466
    int id(const Arc& arc) const {
465 467
      return (Parent::id(static_cast<const Edge&>(arc)) << 1) +
466 468
        (arc.forward ? 0 : 1);
467 469
    }
468 470
    Arc arcFromId(int ix) const {
469 471
      return Arc(Parent::fromEdgeId(ix >> 1), (ix & 1) == 0);
470 472
    }
471 473
    int maxArcId() const {
472 474
      return (Parent::maxEdgeId() << 1) + 1;
473 475
    }
474 476

	
475 477
    bool direction(const Arc& arc) const {
476 478
      return arc.forward;
477 479
    }
478 480

	
479 481
    Arc direct(const Edge& arc, bool dir) const {
480 482
      return Arc(arc, dir);
481 483
    }
482 484

	
483 485
    int arcNum() const {
484 486
      return 2 * Parent::edgeNum();
485 487
    }
486 488

	
487 489
    int edgeNum() const {
488 490
      return Parent::edgeNum();
489 491
    }
490 492

	
491 493

	
492 494
  };
493 495
}
494 496

	
495 497
#endif
Ignore white space 768 line context
... ...
@@ -827,768 +827,773 @@
827 827
    }
828 828

	
829 829
    ///The type of the map that stores the distances of the nodes.
830 830

	
831 831
    ///The type of the map that stores the distances of the nodes.
832 832
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
833 833
    ///
834 834
    typedef NullMap<typename Digraph::Node,int> DistMap;
835 835
    ///Instantiates a \ref DistMap.
836 836

	
837 837
    ///This function instantiates a \ref DistMap.
838 838
    ///\param g is the digraph, to which we would like to define
839 839
    ///the \ref DistMap
840 840
#ifdef DOXYGEN
841 841
    static DistMap *createDistMap(const Digraph &g)
842 842
#else
843 843
    static DistMap *createDistMap(const Digraph &)
844 844
#endif
845 845
    {
846 846
      return new DistMap();
847 847
    }
848 848
  };
849 849

	
850 850
  /// Default traits class used by \ref DfsWizard
851 851

	
852 852
  /// To make it easier to use Dfs algorithm
853 853
  /// we have created a wizard class.
854 854
  /// This \ref DfsWizard class needs default traits,
855 855
  /// as well as the \ref Dfs class.
856 856
  /// The \ref DfsWizardBase is a class to be the default traits of the
857 857
  /// \ref DfsWizard class.
858 858
  template<class GR>
859 859
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
860 860
  {
861 861

	
862 862
    typedef DfsWizardDefaultTraits<GR> Base;
863 863
  protected:
864 864
    //The type of the nodes in the digraph.
865 865
    typedef typename Base::Digraph::Node Node;
866 866

	
867 867
    //Pointer to the digraph the algorithm runs on.
868 868
    void *_g;
869 869
    //Pointer to the map of reached nodes.
870 870
    void *_reached;
871 871
    //Pointer to the map of processed nodes.
872 872
    void *_processed;
873 873
    //Pointer to the map of predecessors arcs.
874 874
    void *_pred;
875 875
    //Pointer to the map of distances.
876 876
    void *_dist;
877 877
    //Pointer to the source node.
878 878
    Node _source;
879 879

	
880 880
    public:
881 881
    /// Constructor.
882 882

	
883 883
    /// This constructor does not require parameters, therefore it initiates
884 884
    /// all of the attributes to default values (0, INVALID).
885 885
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
886 886
                      _dist(0), _source(INVALID) {}
887 887

	
888 888
    /// Constructor.
889 889

	
890 890
    /// This constructor requires some parameters,
891 891
    /// listed in the parameters list.
892 892
    /// Others are initiated to 0.
893 893
    /// \param g The digraph the algorithm runs on.
894 894
    /// \param s The source node.
895 895
    DfsWizardBase(const GR &g, Node s=INVALID) :
896 896
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
897 897
      _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {}
898 898

	
899 899
  };
900 900

	
901 901
  /// Auxiliary class for the function type interface of DFS algorithm.
902 902

	
903 903
  /// This auxiliary class is created to implement the function type
904 904
  /// interface of \ref Dfs algorithm. It uses the functions and features
905 905
  /// of the plain \ref Dfs, but it is much simpler to use it.
906 906
  /// It should only be used through the \ref dfs() function, which makes
907 907
  /// it easier to use the algorithm.
908 908
  ///
909 909
  /// Simplicity means that the way to change the types defined
910 910
  /// in the traits class is based on functions that returns the new class
911 911
  /// and not on templatable built-in classes.
912 912
  /// When using the plain \ref Dfs
913 913
  /// the new class with the modified type comes from
914 914
  /// the original class by using the ::
915 915
  /// operator. In the case of \ref DfsWizard only
916 916
  /// a function have to be called, and it will
917 917
  /// return the needed class.
918 918
  ///
919 919
  /// It does not have own \ref run() method. When its \ref run() method
920 920
  /// is called, it initiates a plain \ref Dfs object, and calls the
921 921
  /// \ref Dfs::run() method of it.
922 922
  template<class TR>
923 923
  class DfsWizard : public TR
924 924
  {
925 925
    typedef TR Base;
926 926

	
927 927
    ///The type of the digraph the algorithm runs on.
928 928
    typedef typename TR::Digraph Digraph;
929 929

	
930 930
    typedef typename Digraph::Node Node;
931 931
    typedef typename Digraph::NodeIt NodeIt;
932 932
    typedef typename Digraph::Arc Arc;
933 933
    typedef typename Digraph::OutArcIt OutArcIt;
934 934

	
935 935
    ///\brief The type of the map that stores the predecessor
936 936
    ///arcs of the shortest paths.
937 937
    typedef typename TR::PredMap PredMap;
938 938
    ///\brief The type of the map that stores the distances of the nodes.
939 939
    typedef typename TR::DistMap DistMap;
940 940
    ///\brief The type of the map that indicates which nodes are reached.
941 941
    typedef typename TR::ReachedMap ReachedMap;
942 942
    ///\brief The type of the map that indicates which nodes are processed.
943 943
    typedef typename TR::ProcessedMap ProcessedMap;
944 944

	
945 945
  public:
946 946

	
947 947
    /// Constructor.
948 948
    DfsWizard() : TR() {}
949 949

	
950 950
    /// Constructor that requires parameters.
951 951

	
952 952
    /// Constructor that requires parameters.
953 953
    /// These parameters will be the default values for the traits class.
954 954
    DfsWizard(const Digraph &g, Node s=INVALID) :
955 955
      TR(g,s) {}
956 956

	
957 957
    ///Copy constructor
958 958
    DfsWizard(const TR &b) : TR(b) {}
959 959

	
960 960
    ~DfsWizard() {}
961 961

	
962 962
    ///Runs DFS algorithm from a source node.
963 963

	
964 964
    ///Runs DFS algorithm from a source node.
965 965
    ///The node can be given with the \ref source() function.
966 966
    void run()
967 967
    {
968 968
      if(Base::_source==INVALID) throw UninitializedParameter();
969 969
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
970 970
      if(Base::_reached)
971 971
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
972 972
      if(Base::_processed)
973 973
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
974 974
      if(Base::_pred)
975 975
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
976 976
      if(Base::_dist)
977 977
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
978 978
      alg.run(Base::_source);
979 979
    }
980 980

	
981 981
    ///Runs DFS algorithm from the given node.
982 982

	
983 983
    ///Runs DFS algorithm from the given node.
984 984
    ///\param s is the given source.
985 985
    void run(Node s)
986 986
    {
987 987
      Base::_source=s;
988 988
      run();
989 989
    }
990 990

	
991 991
    /// Sets the source node, from which the Dfs algorithm runs.
992 992

	
993 993
    /// Sets the source node, from which the Dfs algorithm runs.
994 994
    /// \param s is the source node.
995 995
    DfsWizard<TR> &source(Node s)
996 996
    {
997 997
      Base::_source=s;
998 998
      return *this;
999 999
    }
1000 1000

	
1001 1001
    template<class T>
1002 1002
    struct SetPredMapBase : public Base {
1003 1003
      typedef T PredMap;
1004 1004
      static PredMap *createPredMap(const Digraph &) { return 0; };
1005 1005
      SetPredMapBase(const TR &b) : TR(b) {}
1006 1006
    };
1007 1007
    ///\brief \ref named-templ-param "Named parameter"
1008 1008
    ///for setting \ref PredMap object.
1009 1009
    ///
1010 1010
    ///\ref named-templ-param "Named parameter"
1011 1011
    ///for setting \ref PredMap object.
1012 1012
    template<class T>
1013 1013
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1014 1014
    {
1015 1015
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1016 1016
      return DfsWizard<SetPredMapBase<T> >(*this);
1017 1017
    }
1018 1018

	
1019 1019
    template<class T>
1020 1020
    struct SetReachedMapBase : public Base {
1021 1021
      typedef T ReachedMap;
1022 1022
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1023 1023
      SetReachedMapBase(const TR &b) : TR(b) {}
1024 1024
    };
1025 1025
    ///\brief \ref named-templ-param "Named parameter"
1026 1026
    ///for setting \ref ReachedMap object.
1027 1027
    ///
1028 1028
    /// \ref named-templ-param "Named parameter"
1029 1029
    ///for setting \ref ReachedMap object.
1030 1030
    template<class T>
1031 1031
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1032 1032
    {
1033 1033
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1034 1034
      return DfsWizard<SetReachedMapBase<T> >(*this);
1035 1035
    }
1036 1036

	
1037 1037
    template<class T>
1038 1038
    struct SetProcessedMapBase : public Base {
1039 1039
      typedef T ProcessedMap;
1040 1040
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1041 1041
      SetProcessedMapBase(const TR &b) : TR(b) {}
1042 1042
    };
1043 1043
    ///\brief \ref named-templ-param "Named parameter"
1044 1044
    ///for setting \ref ProcessedMap object.
1045 1045
    ///
1046 1046
    /// \ref named-templ-param "Named parameter"
1047 1047
    ///for setting \ref ProcessedMap object.
1048 1048
    template<class T>
1049 1049
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1050 1050
    {
1051 1051
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1052 1052
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1053 1053
    }
1054 1054

	
1055 1055
    template<class T>
1056 1056
    struct SetDistMapBase : public Base {
1057 1057
      typedef T DistMap;
1058 1058
      static DistMap *createDistMap(const Digraph &) { return 0; };
1059 1059
      SetDistMapBase(const TR &b) : TR(b) {}
1060 1060
    };
1061 1061
    ///\brief \ref named-templ-param "Named parameter"
1062 1062
    ///for setting \ref DistMap object.
1063 1063
    ///
1064 1064
    ///\ref named-templ-param "Named parameter"
1065 1065
    ///for setting \ref DistMap object.
1066 1066
    template<class T>
1067 1067
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1068 1068
    {
1069 1069
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1070 1070
      return DfsWizard<SetDistMapBase<T> >(*this);
1071 1071
    }
1072 1072

	
1073 1073
  };
1074 1074

	
1075 1075
  ///Function type interface for Dfs algorithm.
1076 1076

	
1077 1077
  ///\ingroup search
1078 1078
  ///Function type interface for Dfs algorithm.
1079 1079
  ///
1080 1080
  ///This function also has several
1081 1081
  ///\ref named-templ-func-param "named parameters",
1082 1082
  ///they are declared as the members of class \ref DfsWizard.
1083 1083
  ///The following
1084 1084
  ///example shows how to use these parameters.
1085 1085
  ///\code
1086 1086
  ///  dfs(g,source).predMap(preds).run();
1087 1087
  ///\endcode
1088 1088
  ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
1089 1089
  ///to the end of the parameter list.
1090 1090
  ///\sa DfsWizard
1091 1091
  ///\sa Dfs
1092 1092
  template<class GR>
1093 1093
  DfsWizard<DfsWizardBase<GR> >
1094 1094
  dfs(const GR &g,typename GR::Node s=INVALID)
1095 1095
  {
1096 1096
    return DfsWizard<DfsWizardBase<GR> >(g,s);
1097 1097
  }
1098 1098

	
1099 1099
#ifdef DOXYGEN
1100 1100
  /// \brief Visitor class for DFS.
1101 1101
  ///
1102 1102
  /// This class defines the interface of the DfsVisit events, and
1103 1103
  /// it could be the base of a real visitor class.
1104 1104
  template <typename _Digraph>
1105 1105
  struct DfsVisitor {
1106 1106
    typedef _Digraph Digraph;
1107 1107
    typedef typename Digraph::Arc Arc;
1108 1108
    typedef typename Digraph::Node Node;
1109 1109
    /// \brief Called for the source node of the DFS.
1110 1110
    ///
1111 1111
    /// This function is called for the source node of the DFS.
1112 1112
    void start(const Node& node) {}
1113 1113
    /// \brief Called when the source node is leaved.
1114 1114
    ///
1115 1115
    /// This function is called when the source node is leaved.
1116 1116
    void stop(const Node& node) {}
1117 1117
    /// \brief Called when a node is reached first time.
1118 1118
    ///
1119 1119
    /// This function is called when a node is reached first time.
1120 1120
    void reach(const Node& node) {}
1121 1121
    /// \brief Called when an arc reaches a new node.
1122 1122
    ///
1123 1123
    /// This function is called when the DFS finds an arc whose target node
1124 1124
    /// is not reached yet.
1125 1125
    void discover(const Arc& arc) {}
1126 1126
    /// \brief Called when an arc is examined but its target node is
1127 1127
    /// already discovered.
1128 1128
    ///
1129 1129
    /// This function is called when an arc is examined but its target node is
1130 1130
    /// already discovered.
1131 1131
    void examine(const Arc& arc) {}
1132 1132
    /// \brief Called when the DFS steps back from a node.
1133 1133
    ///
1134 1134
    /// This function is called when the DFS steps back from a node.
1135 1135
    void leave(const Node& node) {}
1136 1136
    /// \brief Called when the DFS steps back on an arc.
1137 1137
    ///
1138 1138
    /// This function is called when the DFS steps back on an arc.
1139 1139
    void backtrack(const Arc& arc) {}
1140 1140
  };
1141 1141
#else
1142 1142
  template <typename _Digraph>
1143 1143
  struct DfsVisitor {
1144 1144
    typedef _Digraph Digraph;
1145 1145
    typedef typename Digraph::Arc Arc;
1146 1146
    typedef typename Digraph::Node Node;
1147 1147
    void start(const Node&) {}
1148 1148
    void stop(const Node&) {}
1149 1149
    void reach(const Node&) {}
1150 1150
    void discover(const Arc&) {}
1151 1151
    void examine(const Arc&) {}
1152 1152
    void leave(const Node&) {}
1153 1153
    void backtrack(const Arc&) {}
1154 1154

	
1155 1155
    template <typename _Visitor>
1156 1156
    struct Constraints {
1157 1157
      void constraints() {
1158 1158
        Arc arc;
1159 1159
        Node node;
1160 1160
        visitor.start(node);
1161 1161
        visitor.stop(arc);
1162 1162
        visitor.reach(node);
1163 1163
        visitor.discover(arc);
1164 1164
        visitor.examine(arc);
1165 1165
        visitor.leave(node);
1166 1166
        visitor.backtrack(arc);
1167 1167
      }
1168 1168
      _Visitor& visitor;
1169 1169
    };
1170 1170
  };
1171 1171
#endif
1172 1172

	
1173 1173
  /// \brief Default traits class of DfsVisit class.
1174 1174
  ///
1175 1175
  /// Default traits class of DfsVisit class.
1176 1176
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1177 1177
  template<class _Digraph>
1178 1178
  struct DfsVisitDefaultTraits {
1179 1179

	
1180 1180
    /// \brief The type of the digraph the algorithm runs on.
1181 1181
    typedef _Digraph Digraph;
1182 1182

	
1183 1183
    /// \brief The type of the map that indicates which nodes are reached.
1184 1184
    ///
1185 1185
    /// The type of the map that indicates which nodes are reached.
1186 1186
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1187 1187
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1188 1188

	
1189 1189
    /// \brief Instantiates a \ref ReachedMap.
1190 1190
    ///
1191 1191
    /// This function instantiates a \ref ReachedMap.
1192 1192
    /// \param digraph is the digraph, to which
1193 1193
    /// we would like to define the \ref ReachedMap.
1194 1194
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1195 1195
      return new ReachedMap(digraph);
1196 1196
    }
1197 1197

	
1198 1198
  };
1199 1199

	
1200 1200
  /// \ingroup search
1201 1201
  ///
1202 1202
  /// \brief %DFS algorithm class with visitor interface.
1203 1203
  ///
1204 1204
  /// This class provides an efficient implementation of the %DFS algorithm
1205 1205
  /// with visitor interface.
1206 1206
  ///
1207 1207
  /// The %DfsVisit class provides an alternative interface to the Dfs
1208 1208
  /// class. It works with callback mechanism, the DfsVisit object calls
1209 1209
  /// the member functions of the \c Visitor class on every DFS event.
1210 1210
  ///
1211
  /// This interface of the DFS algorithm should be used in special cases
1212
  /// when extra actions have to be performed in connection with certain
1213
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1214
  /// instead.
1215
  ///
1211 1216
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1212 1217
  /// The default value is
1213 1218
  /// \ref ListDigraph. The value of _Digraph is not used directly by
1214 1219
  /// \ref DfsVisit, it is only passed to \ref DfsVisitDefaultTraits.
1215 1220
  /// \tparam _Visitor The Visitor type that is used by the algorithm.
1216 1221
  /// \ref DfsVisitor "DfsVisitor<_Digraph>" is an empty visitor, which
1217 1222
  /// does not observe the DFS events. If you want to observe the DFS
1218 1223
  /// events, you should implement your own visitor class.
1219 1224
  /// \tparam _Traits Traits class to set various data types used by the
1220 1225
  /// algorithm. The default traits class is
1221 1226
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<_Digraph>".
1222 1227
  /// See \ref DfsVisitDefaultTraits for the documentation of
1223 1228
  /// a DFS visit traits class.
1224 1229
#ifdef DOXYGEN
1225 1230
  template <typename _Digraph, typename _Visitor, typename _Traits>
1226 1231
#else
1227 1232
  template <typename _Digraph = ListDigraph,
1228 1233
            typename _Visitor = DfsVisitor<_Digraph>,
1229 1234
            typename _Traits = DfsDefaultTraits<_Digraph> >
1230 1235
#endif
1231 1236
  class DfsVisit {
1232 1237
  public:
1233 1238

	
1234 1239
    /// \brief \ref Exception for uninitialized parameters.
1235 1240
    ///
1236 1241
    /// This error represents problems in the initialization
1237 1242
    /// of the parameters of the algorithm.
1238 1243
    class UninitializedParameter : public lemon::UninitializedParameter {
1239 1244
    public:
1240 1245
      virtual const char* what() const throw()
1241 1246
      {
1242 1247
        return "lemon::DfsVisit::UninitializedParameter";
1243 1248
      }
1244 1249
    };
1245 1250

	
1246 1251
    ///The traits class.
1247 1252
    typedef _Traits Traits;
1248 1253

	
1249 1254
    ///The type of the digraph the algorithm runs on.
1250 1255
    typedef typename Traits::Digraph Digraph;
1251 1256

	
1252 1257
    ///The visitor type used by the algorithm.
1253 1258
    typedef _Visitor Visitor;
1254 1259

	
1255 1260
    ///The type of the map that indicates which nodes are reached.
1256 1261
    typedef typename Traits::ReachedMap ReachedMap;
1257 1262

	
1258 1263
  private:
1259 1264

	
1260 1265
    typedef typename Digraph::Node Node;
1261 1266
    typedef typename Digraph::NodeIt NodeIt;
1262 1267
    typedef typename Digraph::Arc Arc;
1263 1268
    typedef typename Digraph::OutArcIt OutArcIt;
1264 1269

	
1265 1270
    //Pointer to the underlying digraph.
1266 1271
    const Digraph *_digraph;
1267 1272
    //Pointer to the visitor object.
1268 1273
    Visitor *_visitor;
1269 1274
    //Pointer to the map of reached status of the nodes.
1270 1275
    ReachedMap *_reached;
1271 1276
    //Indicates if _reached is locally allocated (true) or not.
1272 1277
    bool local_reached;
1273 1278

	
1274 1279
    std::vector<typename Digraph::Arc> _stack;
1275 1280
    int _stack_head;
1276 1281

	
1277 1282
    ///Creates the maps if necessary.
1278 1283
    ///\todo Better memory allocation (instead of new).
1279 1284
    void create_maps() {
1280 1285
      if(!_reached) {
1281 1286
        local_reached = true;
1282 1287
        _reached = Traits::createReachedMap(*_digraph);
1283 1288
      }
1284 1289
    }
1285 1290

	
1286 1291
  protected:
1287 1292

	
1288 1293
    DfsVisit() {}
1289 1294

	
1290 1295
  public:
1291 1296

	
1292 1297
    typedef DfsVisit Create;
1293 1298

	
1294 1299
    /// \name Named template parameters
1295 1300

	
1296 1301
    ///@{
1297 1302
    template <class T>
1298 1303
    struct SetReachedMapTraits : public Traits {
1299 1304
      typedef T ReachedMap;
1300 1305
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1301 1306
        throw UninitializedParameter();
1302 1307
      }
1303 1308
    };
1304 1309
    /// \brief \ref named-templ-param "Named parameter" for setting
1305 1310
    /// ReachedMap type.
1306 1311
    ///
1307 1312
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
1308 1313
    template <class T>
1309 1314
    struct SetReachedMap : public DfsVisit< Digraph, Visitor,
1310 1315
                                            SetReachedMapTraits<T> > {
1311 1316
      typedef DfsVisit< Digraph, Visitor, SetReachedMapTraits<T> > Create;
1312 1317
    };
1313 1318
    ///@}
1314 1319

	
1315 1320
  public:
1316 1321

	
1317 1322
    /// \brief Constructor.
1318 1323
    ///
1319 1324
    /// Constructor.
1320 1325
    ///
1321 1326
    /// \param digraph The digraph the algorithm runs on.
1322 1327
    /// \param visitor The visitor object of the algorithm.
1323 1328
    DfsVisit(const Digraph& digraph, Visitor& visitor)
1324 1329
      : _digraph(&digraph), _visitor(&visitor),
1325 1330
        _reached(0), local_reached(false) {}
1326 1331

	
1327 1332
    /// \brief Destructor.
1328 1333
    ~DfsVisit() {
1329 1334
      if(local_reached) delete _reached;
1330 1335
    }
1331 1336

	
1332 1337
    /// \brief Sets the map that indicates which nodes are reached.
1333 1338
    ///
1334 1339
    /// Sets the map that indicates which nodes are reached.
1335 1340
    /// If you don't use this function before calling \ref run(),
1336 1341
    /// it will allocate one. The destructor deallocates this
1337 1342
    /// automatically allocated map, of course.
1338 1343
    /// \return <tt> (*this) </tt>
1339 1344
    DfsVisit &reachedMap(ReachedMap &m) {
1340 1345
      if(local_reached) {
1341 1346
        delete _reached;
1342 1347
        local_reached=false;
1343 1348
      }
1344 1349
      _reached = &m;
1345 1350
      return *this;
1346 1351
    }
1347 1352

	
1348 1353
  public:
1349 1354

	
1350 1355
    /// \name Execution control
1351 1356
    /// The simplest way to execute the algorithm is to use
1352 1357
    /// one of the member functions called \ref lemon::DfsVisit::run()
1353 1358
    /// "run()".
1354 1359
    /// \n
1355 1360
    /// If you need more control on the execution, first you must call
1356 1361
    /// \ref lemon::DfsVisit::init() "init()", then you can add several
1357 1362
    /// source nodes with \ref lemon::DfsVisit::addSource() "addSource()".
1358 1363
    /// Finally \ref lemon::DfsVisit::start() "start()" will perform the
1359 1364
    /// actual path computation.
1360 1365

	
1361 1366
    /// @{
1362 1367

	
1363 1368
    /// \brief Initializes the internal data structures.
1364 1369
    ///
1365 1370
    /// Initializes the internal data structures.
1366 1371
    void init() {
1367 1372
      create_maps();
1368 1373
      _stack.resize(countNodes(*_digraph));
1369 1374
      _stack_head = -1;
1370 1375
      for (NodeIt u(*_digraph) ; u != INVALID ; ++u) {
1371 1376
        _reached->set(u, false);
1372 1377
      }
1373 1378
    }
1374 1379

	
1375 1380
    ///Adds a new source node.
1376 1381

	
1377 1382
    ///Adds a new source node to the set of nodes to be processed.
1378 1383
    ///
1379 1384
    ///\pre The stack must be empty. (Otherwise the algorithm gives
1380 1385
    ///false results.)
1381 1386
    ///
1382 1387
    ///\warning Distances will be wrong (or at least strange) in case of
1383 1388
    ///multiple sources.
1384 1389
    void addSource(Node s)
1385 1390
    {
1386 1391
      LEMON_DEBUG(emptyQueue(), "The stack is not empty.");
1387 1392
      if(!(*_reached)[s]) {
1388 1393
          _reached->set(s,true);
1389 1394
          _visitor->start(s);
1390 1395
          _visitor->reach(s);
1391 1396
          Arc e;
1392 1397
          _digraph->firstOut(e, s);
1393 1398
          if (e != INVALID) {
1394 1399
            _stack[++_stack_head] = e;
1395 1400
          } else {
1396 1401
            _visitor->leave(s);
1397 1402
          }
1398 1403
        }
1399 1404
    }
1400 1405

	
1401 1406
    /// \brief Processes the next arc.
1402 1407
    ///
1403 1408
    /// Processes the next arc.
1404 1409
    ///
1405 1410
    /// \return The processed arc.
1406 1411
    ///
1407 1412
    /// \pre The stack must not be empty.
1408 1413
    Arc processNextArc() {
1409 1414
      Arc e = _stack[_stack_head];
1410 1415
      Node m = _digraph->target(e);
1411 1416
      if(!(*_reached)[m]) {
1412 1417
        _visitor->discover(e);
1413 1418
        _visitor->reach(m);
1414 1419
        _reached->set(m, true);
1415 1420
        _digraph->firstOut(_stack[++_stack_head], m);
1416 1421
      } else {
1417 1422
        _visitor->examine(e);
1418 1423
        m = _digraph->source(e);
1419 1424
        _digraph->nextOut(_stack[_stack_head]);
1420 1425
      }
1421 1426
      while (_stack_head>=0 && _stack[_stack_head] == INVALID) {
1422 1427
        _visitor->leave(m);
1423 1428
        --_stack_head;
1424 1429
        if (_stack_head >= 0) {
1425 1430
          _visitor->backtrack(_stack[_stack_head]);
1426 1431
          m = _digraph->source(_stack[_stack_head]);
1427 1432
          _digraph->nextOut(_stack[_stack_head]);
1428 1433
        } else {
1429 1434
          _visitor->stop(m);
1430 1435
        }
1431 1436
      }
1432 1437
      return e;
1433 1438
    }
1434 1439

	
1435 1440
    /// \brief Next arc to be processed.
1436 1441
    ///
1437 1442
    /// Next arc to be processed.
1438 1443
    ///
1439 1444
    /// \return The next arc to be processed or INVALID if the stack is
1440 1445
    /// empty.
1441 1446
    Arc nextArc() const {
1442 1447
      return _stack_head >= 0 ? _stack[_stack_head] : INVALID;
1443 1448
    }
1444 1449

	
1445 1450
    /// \brief Returns \c false if there are nodes
1446 1451
    /// to be processed.
1447 1452
    ///
1448 1453
    /// Returns \c false if there are nodes
1449 1454
    /// to be processed in the queue (stack).
1450 1455
    bool emptyQueue() const { return _stack_head < 0; }
1451 1456

	
1452 1457
    /// \brief Returns the number of the nodes to be processed.
1453 1458
    ///
1454 1459
    /// Returns the number of the nodes to be processed in the queue (stack).
1455 1460
    int queueSize() const { return _stack_head + 1; }
1456 1461

	
1457 1462
    /// \brief Executes the algorithm.
1458 1463
    ///
1459 1464
    /// Executes the algorithm.
1460 1465
    ///
1461 1466
    /// This method runs the %DFS algorithm from the root node
1462 1467
    /// in order to compute the %DFS path to each node.
1463 1468
    ///
1464 1469
    /// The algorithm computes
1465 1470
    /// - the %DFS tree,
1466 1471
    /// - the distance of each node from the root in the %DFS tree.
1467 1472
    ///
1468 1473
    /// \pre init() must be called and a root node should be
1469 1474
    /// added with addSource() before using this function.
1470 1475
    ///
1471 1476
    /// \note <tt>d.start()</tt> is just a shortcut of the following code.
1472 1477
    /// \code
1473 1478
    ///   while ( !d.emptyQueue() ) {
1474 1479
    ///     d.processNextArc();
1475 1480
    ///   }
1476 1481
    /// \endcode
1477 1482
    void start() {
1478 1483
      while ( !emptyQueue() ) processNextArc();
1479 1484
    }
1480 1485

	
1481 1486
    /// \brief Executes the algorithm until the given target node is reached.
1482 1487
    ///
1483 1488
    /// Executes the algorithm until the given target node is reached.
1484 1489
    ///
1485 1490
    /// This method runs the %DFS algorithm from the root node
1486 1491
    /// in order to compute the DFS path to \c dest.
1487 1492
    ///
1488 1493
    /// The algorithm computes
1489 1494
    /// - the %DFS path to \c dest,
1490 1495
    /// - the distance of \c dest from the root in the %DFS tree.
1491 1496
    ///
1492 1497
    /// \pre init() must be called and a root node should be added
1493 1498
    /// with addSource() before using this function.
1494 1499
    void start(Node dest) {
1495 1500
      while ( !emptyQueue() && _digraph->target(_stack[_stack_head]) != dest )
1496 1501
        processNextArc();
1497 1502
    }
1498 1503

	
1499 1504
    /// \brief Executes the algorithm until a condition is met.
1500 1505
    ///
1501 1506
    /// Executes the algorithm until a condition is met.
1502 1507
    ///
1503 1508
    /// This method runs the %DFS algorithm from the root node
1504 1509
    /// until an arc \c a with <tt>am[a]</tt> true is found.
1505 1510
    ///
1506 1511
    /// \param am A \c bool (or convertible) arc map. The algorithm
1507 1512
    /// will stop when it reaches an arc \c a with <tt>am[a]</tt> true.
1508 1513
    ///
1509 1514
    /// \return The reached arc \c a with <tt>am[a]</tt> true or
1510 1515
    /// \c INVALID if no such arc was found.
1511 1516
    ///
1512 1517
    /// \pre init() must be called and a root node should be added
1513 1518
    /// with addSource() before using this function.
1514 1519
    ///
1515 1520
    /// \warning Contrary to \ref Bfs and \ref Dijkstra, \c am is an arc map,
1516 1521
    /// not a node map.
1517 1522
    template <typename AM>
1518 1523
    Arc start(const AM &am) {
1519 1524
      while ( !emptyQueue() && !am[_stack[_stack_head]] )
1520 1525
        processNextArc();
1521 1526
      return emptyQueue() ? INVALID : _stack[_stack_head];
1522 1527
    }
1523 1528

	
1524 1529
    /// \brief Runs the algorithm from the given node.
1525 1530
    ///
1526 1531
    /// This method runs the %DFS algorithm from node \c s.
1527 1532
    /// in order to compute the DFS path to each node.
1528 1533
    ///
1529 1534
    /// The algorithm computes
1530 1535
    /// - the %DFS tree,
1531 1536
    /// - the distance of each node from the root in the %DFS tree.
1532 1537
    ///
1533 1538
    /// \note <tt>d.run(s)</tt> is just a shortcut of the following code.
1534 1539
    ///\code
1535 1540
    ///   d.init();
1536 1541
    ///   d.addSource(s);
1537 1542
    ///   d.start();
1538 1543
    ///\endcode
1539 1544
    void run(Node s) {
1540 1545
      init();
1541 1546
      addSource(s);
1542 1547
      start();
1543 1548
    }
1544 1549

	
1545 1550
    /// \brief Finds the %DFS path between \c s and \c t.
1546 1551

	
1547 1552
    /// This method runs the %DFS algorithm from node \c s
1548 1553
    /// in order to compute the DFS path to \c t.
1549 1554
    ///
1550 1555
    /// \return The length of the <tt>s</tt>--<tt>t</tt> DFS path,
1551 1556
    /// if \c t is reachable form \c s, \c 0 otherwise.
1552 1557
    ///
1553 1558
    /// \note Apart from the return value, <tt>d.run(s,t)</tt> is
1554 1559
    /// just a shortcut of the following code.
1555 1560
    ///\code
1556 1561
    ///   d.init();
1557 1562
    ///   d.addSource(s);
1558 1563
    ///   d.start(t);
1559 1564
    ///\endcode
1560 1565
    int run(Node s,Node t) {
1561 1566
      init();
1562 1567
      addSource(s);
1563 1568
      start(t);
1564 1569
      return reached(t)?_stack_head+1:0;
1565 1570
    }
1566 1571

	
1567 1572
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1568 1573

	
1569 1574
    /// This method runs the %DFS algorithm in order to
1570 1575
    /// compute the %DFS path to each node.
1571 1576
    ///
1572 1577
    /// The algorithm computes
1573 1578
    /// - the %DFS tree,
1574 1579
    /// - the distance of each node from the root in the %DFS tree.
1575 1580
    ///
1576 1581
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1577 1582
    ///\code
1578 1583
    ///   d.init();
1579 1584
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1580 1585
    ///     if (!d.reached(n)) {
1581 1586
    ///       d.addSource(n);
1582 1587
    ///       d.start();
1583 1588
    ///     }
1584 1589
    ///   }
1585 1590
    ///\endcode
1586 1591
    void run() {
1587 1592
      init();
1588 1593
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1589 1594
        if (!reached(it)) {
1590 1595
          addSource(it);
1591 1596
          start();
1592 1597
        }
1593 1598
      }
1594 1599
    }
Ignore white space 768 line context
... ...
@@ -686,597 +686,603 @@
686 686
    ///priority heap is empty.
687 687
    Node nextNode() const
688 688
    {
689 689
      return !_heap->empty()?_heap->top():INVALID;
690 690
    }
691 691

	
692 692
    ///\brief Returns \c false if there are nodes
693 693
    ///to be processed.
694 694
    ///
695 695
    ///Returns \c false if there are nodes
696 696
    ///to be processed in the priority heap.
697 697
    bool emptyQueue() const { return _heap->empty(); }
698 698

	
699 699
    ///Returns the number of the nodes to be processed in the priority heap
700 700

	
701 701
    ///Returns the number of the nodes to be processed in the priority heap.
702 702
    ///
703 703
    int queueSize() const { return _heap->size(); }
704 704

	
705 705
    ///Executes the algorithm.
706 706

	
707 707
    ///Executes the algorithm.
708 708
    ///
709 709
    ///This method runs the %Dijkstra algorithm from the root node(s)
710 710
    ///in order to compute the shortest path to each node.
711 711
    ///
712 712
    ///The algorithm computes
713 713
    ///- the shortest path tree (forest),
714 714
    ///- the distance of each node from the root(s).
715 715
    ///
716 716
    ///\pre init() must be called and at least one root node should be
717 717
    ///added with addSource() before using this function.
718 718
    ///
719 719
    ///\note <tt>d.start()</tt> is just a shortcut of the following code.
720 720
    ///\code
721 721
    ///  while ( !d.emptyQueue() ) {
722 722
    ///    d.processNextNode();
723 723
    ///  }
724 724
    ///\endcode
725 725
    void start()
726 726
    {
727 727
      while ( !emptyQueue() ) processNextNode();
728 728
    }
729 729

	
730 730
    ///Executes the algorithm until the given target node is reached.
731 731

	
732 732
    ///Executes the algorithm until the given target node is reached.
733 733
    ///
734 734
    ///This method runs the %Dijkstra algorithm from the root node(s)
735 735
    ///in order to compute the shortest path to \c dest.
736 736
    ///
737 737
    ///The algorithm computes
738 738
    ///- the shortest path to \c dest,
739 739
    ///- the distance of \c dest from the root(s).
740 740
    ///
741 741
    ///\pre init() must be called and at least one root node should be
742 742
    ///added with addSource() before using this function.
743 743
    void start(Node dest)
744 744
    {
745 745
      while ( !_heap->empty() && _heap->top()!=dest ) processNextNode();
746 746
      if ( !_heap->empty() ) finalizeNodeData(_heap->top(),_heap->prio());
747 747
    }
748 748

	
749 749
    ///Executes the algorithm until a condition is met.
750 750

	
751 751
    ///Executes the algorithm until a condition is met.
752 752
    ///
753 753
    ///This method runs the %Dijkstra algorithm from the root node(s) in
754 754
    ///order to compute the shortest path to a node \c v with
755 755
    /// <tt>nm[v]</tt> true, if such a node can be found.
756 756
    ///
757 757
    ///\param nm A \c bool (or convertible) node map. The algorithm
758 758
    ///will stop when it reaches a node \c v with <tt>nm[v]</tt> true.
759 759
    ///
760 760
    ///\return The reached node \c v with <tt>nm[v]</tt> true or
761 761
    ///\c INVALID if no such node was found.
762 762
    ///
763 763
    ///\pre init() must be called and at least one root node should be
764 764
    ///added with addSource() before using this function.
765 765
    template<class NodeBoolMap>
766 766
    Node start(const NodeBoolMap &nm)
767 767
    {
768 768
      while ( !_heap->empty() && !nm[_heap->top()] ) processNextNode();
769 769
      if ( _heap->empty() ) return INVALID;
770 770
      finalizeNodeData(_heap->top(),_heap->prio());
771 771
      return _heap->top();
772 772
    }
773 773

	
774 774
    ///Runs the algorithm from the given node.
775 775

	
776 776
    ///This method runs the %Dijkstra algorithm from node \c s
777 777
    ///in order to compute the shortest path to each node.
778 778
    ///
779 779
    ///The algorithm computes
780 780
    ///- the shortest path tree,
781 781
    ///- the distance of each node from the root.
782 782
    ///
783 783
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
784 784
    ///\code
785 785
    ///  d.init();
786 786
    ///  d.addSource(s);
787 787
    ///  d.start();
788 788
    ///\endcode
789 789
    void run(Node s) {
790 790
      init();
791 791
      addSource(s);
792 792
      start();
793 793
    }
794 794

	
795 795
    ///Finds the shortest path between \c s and \c t.
796 796

	
797 797
    ///This method runs the %Dijkstra algorithm from node \c s
798 798
    ///in order to compute the shortest path to \c t.
799 799
    ///
800 800
    ///\return The length of the shortest <tt>s</tt>--<tt>t</tt> path,
801 801
    ///if \c t is reachable form \c s, \c 0 otherwise.
802 802
    ///
803 803
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is just a
804 804
    ///shortcut of the following code.
805 805
    ///\code
806 806
    ///  d.init();
807 807
    ///  d.addSource(s);
808 808
    ///  d.start(t);
809 809
    ///\endcode
810 810
    Value run(Node s,Node t) {
811 811
      init();
812 812
      addSource(s);
813 813
      start(t);
814 814
      return (*_pred)[t]==INVALID?OperationTraits::zero():(*_dist)[t];
815 815
    }
816 816

	
817 817
    ///@}
818 818

	
819 819
    ///\name Query Functions
820 820
    ///The result of the %Dijkstra algorithm can be obtained using these
821 821
    ///functions.\n
822 822
    ///Either \ref lemon::Dijkstra::run() "run()" or
823 823
    ///\ref lemon::Dijkstra::start() "start()" must be called before
824 824
    ///using them.
825 825

	
826 826
    ///@{
827 827

	
828 828
    ///The shortest path to a node.
829 829

	
830 830
    ///Returns the shortest path to a node.
831 831
    ///
832 832
    ///\warning \c t should be reachable from the root(s).
833 833
    ///
834 834
    ///\pre Either \ref run() or \ref start() must be called before
835 835
    ///using this function.
836 836
    Path path(Node t) const { return Path(*G, *_pred, t); }
837 837

	
838 838
    ///The distance of a node from the root(s).
839 839

	
840 840
    ///Returns the distance of a node from the root(s).
841 841
    ///
842 842
    ///\warning If node \c v is not reachable from the root(s), then
843 843
    ///the return value of this function is undefined.
844 844
    ///
845 845
    ///\pre Either \ref run() or \ref start() must be called before
846 846
    ///using this function.
847 847
    Value dist(Node v) const { return (*_dist)[v]; }
848 848

	
849 849
    ///Returns the 'previous arc' of the shortest path tree for a node.
850 850

	
851 851
    ///This function returns the 'previous arc' of the shortest path
852 852
    ///tree for the node \c v, i.e. it returns the last arc of a
853 853
    ///shortest path from the root(s) to \c v. It is \c INVALID if \c v
854 854
    ///is not reachable from the root(s) or if \c v is a root.
855 855
    ///
856 856
    ///The shortest path tree used here is equal to the shortest path
857 857
    ///tree used in \ref predNode().
858 858
    ///
859 859
    ///\pre Either \ref run() or \ref start() must be called before
860 860
    ///using this function.
861 861
    Arc predArc(Node v) const { return (*_pred)[v]; }
862 862

	
863 863
    ///Returns the 'previous node' of the shortest path tree for a node.
864 864

	
865 865
    ///This function returns the 'previous node' of the shortest path
866 866
    ///tree for the node \c v, i.e. it returns the last but one node
867 867
    ///from a shortest path from the root(s) to \c v. It is \c INVALID
868 868
    ///if \c v is not reachable from the root(s) or if \c v is a root.
869 869
    ///
870 870
    ///The shortest path tree used here is equal to the shortest path
871 871
    ///tree used in \ref predArc().
872 872
    ///
873 873
    ///\pre Either \ref run() or \ref start() must be called before
874 874
    ///using this function.
875 875
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
876 876
                                  G->source((*_pred)[v]); }
877 877

	
878 878
    ///\brief Returns a const reference to the node map that stores the
879 879
    ///distances of the nodes.
880 880
    ///
881 881
    ///Returns a const reference to the node map that stores the distances
882 882
    ///of the nodes calculated by the algorithm.
883 883
    ///
884 884
    ///\pre Either \ref run() or \ref init()
885 885
    ///must be called before using this function.
886 886
    const DistMap &distMap() const { return *_dist;}
887 887

	
888 888
    ///\brief Returns a const reference to the node map that stores the
889 889
    ///predecessor arcs.
890 890
    ///
891 891
    ///Returns a const reference to the node map that stores the predecessor
892 892
    ///arcs, which form the shortest path tree.
893 893
    ///
894 894
    ///\pre Either \ref run() or \ref init()
895 895
    ///must be called before using this function.
896 896
    const PredMap &predMap() const { return *_pred;}
897 897

	
898 898
    ///Checks if a node is reachable from the root(s).
899 899

	
900 900
    ///Returns \c true if \c v is reachable from the root(s).
901 901
    ///\pre Either \ref run() or \ref start()
902 902
    ///must be called before using this function.
903 903
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
904 904
                                        Heap::PRE_HEAP; }
905 905

	
906 906
    ///Checks if a node is processed.
907 907

	
908 908
    ///Returns \c true if \c v is processed, i.e. the shortest
909 909
    ///path to \c v has already found.
910 910
    ///\pre Either \ref run() or \ref start()
911 911
    ///must be called before using this function.
912 912
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
913 913
                                          Heap::POST_HEAP; }
914 914

	
915 915
    ///The current distance of a node from the root(s).
916 916

	
917 917
    ///Returns the current distance of a node from the root(s).
918 918
    ///It may be decreased in the following processes.
919 919
    ///\pre \c v should be reached but not processed.
920 920
    Value currentDist(Node v) const { return (*_heap)[v]; }
921 921

	
922 922
    ///@}
923 923
  };
924 924

	
925 925

	
926 926
  ///Default traits class of dijkstra() function.
927 927

	
928 928
  ///Default traits class of dijkstra() function.
929 929
  ///\tparam GR The type of the digraph.
930 930
  ///\tparam LM The type of the length map.
931 931
  template<class GR, class LM>
932 932
  struct DijkstraWizardDefaultTraits
933 933
  {
934 934
    ///The type of the digraph the algorithm runs on.
935 935
    typedef GR Digraph;
936 936
    ///The type of the map that stores the arc lengths.
937 937

	
938 938
    ///The type of the map that stores the arc lengths.
939 939
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
940 940
    typedef LM LengthMap;
941 941
    ///The type of the length of the arcs.
942 942
    typedef typename LM::Value Value;
943 943

	
944 944
    /// Operation traits for Dijkstra algorithm.
945 945

	
946 946
    /// This class defines the operations that are used in the algorithm.
947 947
    /// \see DijkstraDefaultOperationTraits
948 948
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
949 949

	
950 950
    /// The cross reference type used by the heap.
951 951

	
952 952
    /// The cross reference type used by the heap.
953 953
    /// Usually it is \c Digraph::NodeMap<int>.
954 954
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
955 955
    ///Instantiates a \ref HeapCrossRef.
956 956

	
957 957
    ///This function instantiates a \ref HeapCrossRef.
958 958
    /// \param g is the digraph, to which we would like to define the
959 959
    /// HeapCrossRef.
960 960
    /// \todo The digraph alone may be insufficient for the initialization
961 961
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
962 962
    {
963 963
      return new HeapCrossRef(g);
964 964
    }
965 965

	
966 966
    ///The heap type used by the Dijkstra algorithm.
967 967

	
968 968
    ///The heap type used by the Dijkstra algorithm.
969 969
    ///
970 970
    ///\sa BinHeap
971 971
    ///\sa Dijkstra
972 972
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
973 973
                    std::less<Value> > Heap;
974 974

	
975 975
    ///Instantiates a \ref Heap.
976 976

	
977 977
    ///This function instantiates a \ref Heap.
978 978
    /// \param r is the HeapCrossRef which is used.
979 979
    static Heap *createHeap(HeapCrossRef& r)
980 980
    {
981 981
      return new Heap(r);
982 982
    }
983 983

	
984 984
    ///\brief The type of the map that stores the predecessor
985 985
    ///arcs of the shortest paths.
986 986
    ///
987 987
    ///The type of the map that stores the predecessor
988 988
    ///arcs of the shortest paths.
989 989
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
990 990
    typedef NullMap <typename Digraph::Node,typename Digraph::Arc> PredMap;
991 991
    ///Instantiates a \ref PredMap.
992 992

	
993 993
    ///This function instantiates a \ref PredMap.
994 994
    ///\param g is the digraph, to which we would like to define the
995 995
    ///\ref PredMap.
996 996
    ///\todo The digraph alone may be insufficient to initialize
997 997
#ifdef DOXYGEN
998 998
    static PredMap *createPredMap(const Digraph &g)
999 999
#else
1000 1000
    static PredMap *createPredMap(const Digraph &)
1001 1001
#endif
1002 1002
    {
1003 1003
      return new PredMap();
1004 1004
    }
1005 1005

	
1006 1006
    ///The type of the map that indicates which nodes are processed.
1007 1007

	
1008 1008
    ///The type of the map that indicates which nodes are processed.
1009 1009
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1010 1010
    ///By default it is a NullMap.
1011 1011
    ///\todo If it is set to a real map,
1012 1012
    ///Dijkstra::processed() should read this.
1013 1013
    ///\todo named parameter to set this type, function to read and write.
1014 1014
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
1015 1015
    ///Instantiates a \ref ProcessedMap.
1016 1016

	
1017 1017
    ///This function instantiates a \ref ProcessedMap.
1018 1018
    ///\param g is the digraph, to which
1019 1019
    ///we would like to define the \ref ProcessedMap.
1020 1020
#ifdef DOXYGEN
1021 1021
    static ProcessedMap *createProcessedMap(const Digraph &g)
1022 1022
#else
1023 1023
    static ProcessedMap *createProcessedMap(const Digraph &)
1024 1024
#endif
1025 1025
    {
1026 1026
      return new ProcessedMap();
1027 1027
    }
1028 1028

	
1029 1029
    ///The type of the map that stores the distances of the nodes.
1030 1030

	
1031 1031
    ///The type of the map that stores the distances of the nodes.
1032 1032
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1033 1033
    typedef NullMap<typename Digraph::Node,Value> DistMap;
1034 1034
    ///Instantiates a \ref DistMap.
1035 1035

	
1036 1036
    ///This function instantiates a \ref DistMap.
1037 1037
    ///\param g is the digraph, to which we would like to define
1038 1038
    ///the \ref DistMap
1039 1039
#ifdef DOXYGEN
1040 1040
    static DistMap *createDistMap(const Digraph &g)
1041 1041
#else
1042 1042
    static DistMap *createDistMap(const Digraph &)
1043 1043
#endif
1044 1044
    {
1045 1045
      return new DistMap();
1046 1046
    }
1047 1047
  };
1048 1048

	
1049 1049
  /// Default traits class used by \ref DijkstraWizard
1050 1050

	
1051 1051
  /// To make it easier to use Dijkstra algorithm
1052 1052
  /// we have created a wizard class.
1053 1053
  /// This \ref DijkstraWizard class needs default traits,
1054 1054
  /// as well as the \ref Dijkstra class.
1055 1055
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1056 1056
  /// \ref DijkstraWizard class.
1057 1057
  /// \todo More named parameters are required...
1058 1058
  template<class GR,class LM>
1059 1059
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LM>
1060 1060
  {
1061 1061
    typedef DijkstraWizardDefaultTraits<GR,LM> Base;
1062 1062
  protected:
1063 1063
    //The type of the nodes in the digraph.
1064 1064
    typedef typename Base::Digraph::Node Node;
1065 1065

	
1066 1066
    //Pointer to the digraph the algorithm runs on.
1067 1067
    void *_g;
1068 1068
    //Pointer to the length map
1069 1069
    void *_length;
1070
    //Pointer to the map of processed nodes.
1071
    void *_processed;
1070 1072
    //Pointer to the map of predecessors arcs.
1071 1073
    void *_pred;
1072 1074
    //Pointer to the map of distances.
1073 1075
    void *_dist;
1074 1076
    //Pointer to the source node.
1075 1077
    Node _source;
1076 1078

	
1077 1079
  public:
1078 1080
    /// Constructor.
1079 1081

	
1080 1082
    /// This constructor does not require parameters, therefore it initiates
1081 1083
    /// all of the attributes to default values (0, INVALID).
1082
    DijkstraWizardBase() : _g(0), _length(0), _pred(0),
1084
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1083 1085
                           _dist(0), _source(INVALID) {}
1084 1086

	
1085 1087
    /// Constructor.
1086 1088

	
1087 1089
    /// This constructor requires some parameters,
1088 1090
    /// listed in the parameters list.
1089 1091
    /// Others are initiated to 0.
1090 1092
    /// \param g The digraph the algorithm runs on.
1091 1093
    /// \param l The length map.
1092 1094
    /// \param s The source node.
1093 1095
    DijkstraWizardBase(const GR &g,const LM &l, Node s=INVALID) :
1094 1096
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1095 1097
      _length(reinterpret_cast<void*>(const_cast<LM*>(&l))),
1096
      _pred(0), _dist(0), _source(s) {}
1098
      _processed(0), _pred(0), _dist(0), _source(s) {}
1097 1099

	
1098 1100
  };
1099 1101

	
1100 1102
  /// Auxiliary class for the function type interface of Dijkstra algorithm.
1101 1103

	
1102 1104
  /// This auxiliary class is created to implement the function type
1103 1105
  /// interface of \ref Dijkstra algorithm. It uses the functions and features
1104 1106
  /// of the plain \ref Dijkstra, but it is much simpler to use it.
1105 1107
  /// It should only be used through the \ref dijkstra() function, which makes
1106 1108
  /// it easier to use the algorithm.
1107 1109
  ///
1108 1110
  /// Simplicity means that the way to change the types defined
1109 1111
  /// in the traits class is based on functions that returns the new class
1110 1112
  /// and not on templatable built-in classes.
1111 1113
  /// When using the plain \ref Dijkstra
1112 1114
  /// the new class with the modified type comes from
1113 1115
  /// the original class by using the ::
1114 1116
  /// operator. In the case of \ref DijkstraWizard only
1115 1117
  /// a function have to be called, and it will
1116 1118
  /// return the needed class.
1117 1119
  ///
1118 1120
  /// It does not have own \ref run() method. When its \ref run() method
1119 1121
  /// is called, it initiates a plain \ref Dijkstra object, and calls the
1120 1122
  /// \ref Dijkstra::run() method of it.
1121 1123
  template<class TR>
1122 1124
  class DijkstraWizard : public TR
1123 1125
  {
1124 1126
    typedef TR Base;
1125 1127

	
1126 1128
    ///The type of the digraph the algorithm runs on.
1127 1129
    typedef typename TR::Digraph Digraph;
1128 1130

	
1129 1131
    typedef typename Digraph::Node Node;
1130 1132
    typedef typename Digraph::NodeIt NodeIt;
1131 1133
    typedef typename Digraph::Arc Arc;
1132 1134
    typedef typename Digraph::OutArcIt OutArcIt;
1133 1135

	
1134 1136
    ///The type of the map that stores the arc lengths.
1135 1137
    typedef typename TR::LengthMap LengthMap;
1136 1138
    ///The type of the length of the arcs.
1137 1139
    typedef typename LengthMap::Value Value;
1138 1140
    ///\brief The type of the map that stores the predecessor
1139 1141
    ///arcs of the shortest paths.
1140 1142
    typedef typename TR::PredMap PredMap;
1141 1143
    ///The type of the map that stores the distances of the nodes.
1142 1144
    typedef typename TR::DistMap DistMap;
1143 1145
    ///The type of the map that indicates which nodes are processed.
1144 1146
    typedef typename TR::ProcessedMap ProcessedMap;
1145 1147
    ///The heap type used by the dijkstra algorithm.
1146 1148
    typedef typename TR::Heap Heap;
1147 1149

	
1148 1150
  public:
1149 1151

	
1150 1152
    /// Constructor.
1151 1153
    DijkstraWizard() : TR() {}
1152 1154

	
1153 1155
    /// Constructor that requires parameters.
1154 1156

	
1155 1157
    /// Constructor that requires parameters.
1156 1158
    /// These parameters will be the default values for the traits class.
1157 1159
    DijkstraWizard(const Digraph &g,const LengthMap &l, Node s=INVALID) :
1158 1160
      TR(g,l,s) {}
1159 1161

	
1160 1162
    ///Copy constructor
1161 1163
    DijkstraWizard(const TR &b) : TR(b) {}
1162 1164

	
1163 1165
    ~DijkstraWizard() {}
1164 1166

	
1165 1167
    ///Runs Dijkstra algorithm from a source node.
1166 1168

	
1167 1169
    ///Runs Dijkstra algorithm from a source node.
1168 1170
    ///The node can be given with the \ref source() function.
1169 1171
    void run()
1170 1172
    {
1171 1173
      if(Base::_source==INVALID) throw UninitializedParameter();
1172 1174
      Dijkstra<Digraph,LengthMap,TR>
1173 1175
        dij(*reinterpret_cast<const Digraph*>(Base::_g),
1174 1176
            *reinterpret_cast<const LengthMap*>(Base::_length));
1175
      if(Base::_pred) dij.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1176
      if(Base::_dist) dij.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1177
      if(Base::_processed)
1178
        dij.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1179
      if(Base::_pred)
1180
        dij.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1181
      if(Base::_dist)
1182
        dij.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1177 1183
      dij.run(Base::_source);
1178 1184
    }
1179 1185

	
1180 1186
    ///Runs Dijkstra algorithm from the given node.
1181 1187

	
1182 1188
    ///Runs Dijkstra algorithm from the given node.
1183 1189
    ///\param s is the given source.
1184 1190
    void run(Node s)
1185 1191
    {
1186 1192
      Base::_source=s;
1187 1193
      run();
1188 1194
    }
1189 1195

	
1190 1196
    /// Sets the source node, from which the Dijkstra algorithm runs.
1191 1197

	
1192 1198
    /// Sets the source node, from which the Dijkstra algorithm runs.
1193 1199
    /// \param s is the source node.
1194 1200
    DijkstraWizard<TR> &source(Node s)
1195 1201
    {
1196 1202
      Base::_source=s;
1197 1203
      return *this;
1198 1204
    }
1199 1205

	
1200 1206
    template<class T>
1201 1207
    struct SetPredMapBase : public Base {
1202 1208
      typedef T PredMap;
1203 1209
      static PredMap *createPredMap(const Digraph &) { return 0; };
1204 1210
      SetPredMapBase(const TR &b) : TR(b) {}
1205 1211
    };
1206 1212
    ///\brief \ref named-templ-param "Named parameter"
1207 1213
    ///for setting \ref PredMap object.
1208 1214
    ///
1209 1215
    ///\ref named-templ-param "Named parameter"
1210 1216
    ///for setting \ref PredMap object.
1211 1217
    template<class T>
1212 1218
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1213 1219
    {
1214 1220
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1215 1221
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1216 1222
    }
1217 1223

	
1218 1224
    template<class T>
1219 1225
    struct SetProcessedMapBase : public Base {
1220 1226
      typedef T ProcessedMap;
1221 1227
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1222 1228
      SetProcessedMapBase(const TR &b) : TR(b) {}
1223 1229
    };
1224 1230
    ///\brief \ref named-templ-param "Named parameter"
1225 1231
    ///for setting \ref ProcessedMap object.
1226 1232
    ///
1227 1233
    /// \ref named-templ-param "Named parameter"
1228 1234
    ///for setting \ref ProcessedMap object.
1229 1235
    template<class T>
1230 1236
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1231 1237
    {
1232 1238
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1233 1239
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1234 1240
    }
1235 1241

	
1236 1242
    template<class T>
1237 1243
    struct SetDistMapBase : public Base {
1238 1244
      typedef T DistMap;
1239 1245
      static DistMap *createDistMap(const Digraph &) { return 0; };
1240 1246
      SetDistMapBase(const TR &b) : TR(b) {}
1241 1247
    };
1242 1248
    ///\brief \ref named-templ-param "Named parameter"
1243 1249
    ///for setting \ref DistMap object.
1244 1250
    ///
1245 1251
    ///\ref named-templ-param "Named parameter"
1246 1252
    ///for setting \ref DistMap object.
1247 1253
    template<class T>
1248 1254
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1249 1255
    {
1250 1256
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1251 1257
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1252 1258
    }
1253 1259

	
1254 1260
  };
1255 1261

	
1256 1262
  ///Function type interface for Dijkstra algorithm.
1257 1263

	
1258 1264
  /// \ingroup shortest_path
1259 1265
  ///Function type interface for Dijkstra algorithm.
1260 1266
  ///
1261 1267
  ///This function also has several
1262 1268
  ///\ref named-templ-func-param "named parameters",
1263 1269
  ///they are declared as the members of class \ref DijkstraWizard.
1264 1270
  ///The following
1265 1271
  ///example shows how to use these parameters.
1266 1272
  ///\code
1267 1273
  ///  dijkstra(g,length,source).predMap(preds).run();
1268 1274
  ///\endcode
1269 1275
  ///\warning Don't forget to put the \ref DijkstraWizard::run() "run()"
1270 1276
  ///to the end of the parameter list.
1271 1277
  ///\sa DijkstraWizard
1272 1278
  ///\sa Dijkstra
1273 1279
  template<class GR, class LM>
1274 1280
  DijkstraWizard<DijkstraWizardBase<GR,LM> >
1275 1281
  dijkstra(const GR &g,const LM &l,typename GR::Node s=INVALID)
1276 1282
  {
1277 1283
    return DijkstraWizard<DijkstraWizardBase<GR,LM> >(g,l,s);
1278 1284
  }
1279 1285

	
1280 1286
} //END OF NAMESPACE LEMON
1281 1287

	
1282 1288
#endif
Ignore white space 768 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DIM2_H
20 20
#define LEMON_DIM2_H
21 21

	
22 22
#include <iostream>
23 23

	
24 24
///\ingroup misc
25 25
///\file
26 26
///\brief A simple two dimensional vector and a bounding box implementation
27 27
///
28 28
/// The class \ref lemon::dim2::Point "dim2::Point" implements
29 29
/// a two dimensional vector with the usual operations.
30 30
///
31
/// The class \ref lemon::dim2::BoundingBox "dim2::BoundingBox"
32
/// can be used to determine
31
/// The class \ref lemon::dim2::Box "dim2::Box" can be used to determine
33 32
/// the rectangular bounding box of a set of
34 33
/// \ref lemon::dim2::Point "dim2::Point"'s.
35 34

	
36 35
namespace lemon {
37 36

	
38 37
  ///Tools for handling two dimensional coordinates
39 38

	
40 39
  ///This namespace is a storage of several
41 40
  ///tools for handling two dimensional coordinates
42 41
  namespace dim2 {
43 42

	
44 43
  /// \addtogroup misc
45 44
  /// @{
46 45

	
47
  /// A simple two dimensional vector (plain vector) implementation
46
  /// Two dimensional vector (plain vector)
48 47

	
49 48
  /// A simple two dimensional vector (plain vector) implementation
50 49
  /// with the usual vector operations.
51 50
  template<typename T>
52 51
    class Point {
53 52

	
54 53
    public:
55 54

	
56 55
      typedef T Value;
57 56

	
58 57
      ///First coordinate
59 58
      T x;
60 59
      ///Second coordinate
61 60
      T y;
62 61

	
63 62
      ///Default constructor
64 63
      Point() {}
65 64

	
66 65
      ///Construct an instance from coordinates
67 66
      Point(T a, T b) : x(a), y(b) { }
68 67

	
69 68
      ///Returns the dimension of the vector (i.e. returns 2).
70 69

	
71 70
      ///The dimension of the vector.
72 71
      ///This function always returns 2.
73 72
      int size() const { return 2; }
74 73

	
75 74
      ///Subscripting operator
76 75

	
77 76
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
78 77
      ///
79 78
      T& operator[](int idx) { return idx == 0 ? x : y; }
80 79

	
81 80
      ///Const subscripting operator
82 81

	
83 82
      ///\c p[0] is \c p.x and \c p[1] is \c p.y
84 83
      ///
85 84
      const T& operator[](int idx) const { return idx == 0 ? x : y; }
86 85

	
87 86
      ///Conversion constructor
88 87
      template<class TT> Point(const Point<TT> &p) : x(p.x), y(p.y) {}
89 88

	
90 89
      ///Give back the square of the norm of the vector
91 90
      T normSquare() const {
92 91
        return x*x+y*y;
93 92
      }
94 93

	
95 94
      ///Increment the left hand side by \c u
96 95
      Point<T>& operator +=(const Point<T>& u) {
97 96
        x += u.x;
98 97
        y += u.y;
99 98
        return *this;
100 99
      }
101 100

	
102 101
      ///Decrement the left hand side by \c u
103 102
      Point<T>& operator -=(const Point<T>& u) {
104 103
        x -= u.x;
105 104
        y -= u.y;
106 105
        return *this;
107 106
      }
108 107

	
109 108
      ///Multiply the left hand side with a scalar
110 109
      Point<T>& operator *=(const T &u) {
111 110
        x *= u;
112 111
        y *= u;
113 112
        return *this;
114 113
      }
115 114

	
116 115
      ///Divide the left hand side by a scalar
117 116
      Point<T>& operator /=(const T &u) {
118 117
        x /= u;
119 118
        y /= u;
120 119
        return *this;
121 120
      }
122 121

	
123 122
      ///Return the scalar product of two vectors
124 123
      T operator *(const Point<T>& u) const {
125 124
        return x*u.x+y*u.y;
126 125
      }
127 126

	
128 127
      ///Return the sum of two vectors
129 128
      Point<T> operator+(const Point<T> &u) const {
130 129
        Point<T> b=*this;
131 130
        return b+=u;
132 131
      }
133 132

	
134 133
      ///Return the negative of the vector
135 134
      Point<T> operator-() const {
136 135
        Point<T> b=*this;
137 136
        b.x=-b.x; b.y=-b.y;
138 137
        return b;
139 138
      }
140 139

	
141 140
      ///Return the difference of two vectors
142 141
      Point<T> operator-(const Point<T> &u) const {
143 142
        Point<T> b=*this;
144 143
        return b-=u;
145 144
      }
146 145

	
147 146
      ///Return a vector multiplied by a scalar
148 147
      Point<T> operator*(const T &u) const {
149 148
        Point<T> b=*this;
150 149
        return b*=u;
151 150
      }
152 151

	
153 152
      ///Return a vector divided by a scalar
154 153
      Point<T> operator/(const T &u) const {
155 154
        Point<T> b=*this;
156 155
        return b/=u;
157 156
      }
158 157

	
159 158
      ///Test equality
160 159
      bool operator==(const Point<T> &u) const {
161 160
        return (x==u.x) && (y==u.y);
162 161
      }
163 162

	
164 163
      ///Test inequality
165 164
      bool operator!=(Point u) const {
166 165
        return  (x!=u.x) || (y!=u.y);
167 166
      }
168 167

	
169 168
    };
170 169

	
171 170
  ///Return a Point
172 171

	
173 172
  ///Return a Point.
174 173
  ///\relates Point
175 174
  template <typename T>
176 175
  inline Point<T> makePoint(const T& x, const T& y) {
177 176
    return Point<T>(x, y);
178 177
  }
179 178

	
180 179
  ///Return a vector multiplied by a scalar
181 180

	
182 181
  ///Return a vector multiplied by a scalar.
183 182
  ///\relates Point
184 183
  template<typename T> Point<T> operator*(const T &u,const Point<T> &x) {
185 184
    return x*u;
186 185
  }
187 186

	
188 187
  ///Read a plain vector from a stream
189 188

	
190 189
  ///Read a plain vector from a stream.
191 190
  ///\relates Point
192 191
  ///
193 192
  template<typename T>
194 193
  inline std::istream& operator>>(std::istream &is, Point<T> &z) {
195 194
    char c;
196 195
    if (is >> c) {
197 196
      if (c != '(') is.putback(c);
198 197
    } else {
199 198
      is.clear();
200 199
    }
201 200
    if (!(is >> z.x)) return is;
202 201
    if (is >> c) {
203 202
      if (c != ',') is.putback(c);
204 203
    } else {
205 204
      is.clear();
206 205
    }
207 206
    if (!(is >> z.y)) return is;
208 207
    if (is >> c) {
209 208
      if (c != ')') is.putback(c);
210 209
    } else {
211 210
      is.clear();
212 211
    }
213 212
    return is;
214 213
  }
215 214

	
216 215
  ///Write a plain vector to a stream
217 216

	
218 217
  ///Write a plain vector to a stream.
219 218
  ///\relates Point
220 219
  ///
221 220
  template<typename T>
222 221
  inline std::ostream& operator<<(std::ostream &os, const Point<T>& z)
223 222
  {
224
    os << "(" << z.x << ", " << z.y << ")";
223
    os << "(" << z.x << "," << z.y << ")";
225 224
    return os;
226 225
  }
227 226

	
228 227
  ///Rotate by 90 degrees
229 228

	
230 229
  ///Returns the parameter rotated by 90 degrees in positive direction.
231 230
  ///\relates Point
232 231
  ///
233 232
  template<typename T>
234 233
  inline Point<T> rot90(const Point<T> &z)
235 234
  {
236 235
    return Point<T>(-z.y,z.x);
237 236
  }
238 237

	
239 238
  ///Rotate by 180 degrees
240 239

	
241 240
  ///Returns the parameter rotated by 180 degrees.
242 241
  ///\relates Point
243 242
  ///
244 243
  template<typename T>
245 244
  inline Point<T> rot180(const Point<T> &z)
246 245
  {
247 246
    return Point<T>(-z.x,-z.y);
248 247
  }
249 248

	
250 249
  ///Rotate by 270 degrees
251 250

	
252 251
  ///Returns the parameter rotated by 90 degrees in negative direction.
253 252
  ///\relates Point
254 253
  ///
255 254
  template<typename T>
256 255
  inline Point<T> rot270(const Point<T> &z)
257 256
  {
258 257
    return Point<T>(z.y,-z.x);
259 258
  }
260 259

	
261 260

	
262 261

	
263
    /// A class to calculate or store the bounding box of plain vectors.
262
  /// Bounding box of plain vectors (\ref Point points).
264 263

	
265
    /// A class to calculate or store the bounding box of plain vectors.
266
    ///
267
    template<typename T>
268
    class BoundingBox {
264
  /// A class to calculate or store the bounding box of plain vectors
265
  /// (\ref Point points).
266
  template<typename T>
267
  class Box {
269 268
      Point<T> _bottom_left, _top_right;
270 269
      bool _empty;
271 270
    public:
272 271

	
273
      ///Default constructor: creates an empty bounding box
274
      BoundingBox() { _empty = true; }
272
      ///Default constructor: creates an empty box
273
      Box() { _empty = true; }
275 274

	
276
      ///Construct an instance from one point
277
      BoundingBox(Point<T> a) {
275
      ///Construct a box from one point
276
      Box(Point<T> a) {
278 277
        _bottom_left = _top_right = a;
279 278
        _empty = false;
280 279
      }
281 280

	
282
      ///Construct an instance from two points
281
      ///Construct a box from two points
283 282

	
284
      ///Construct an instance from two points.
283
      ///Construct a box from two points.
285 284
      ///\param a The bottom left corner.
286 285
      ///\param b The top right corner.
287 286
      ///\warning The coordinates of the bottom left corner must be no more
288 287
      ///than those of the top right one.
289
      BoundingBox(Point<T> a,Point<T> b)
288
      Box(Point<T> a,Point<T> b)
290 289
      {
291 290
        _bottom_left = a;
292 291
        _top_right = b;
293 292
        _empty = false;
294 293
      }
295 294

	
296
      ///Construct an instance from four numbers
295
      ///Construct a box from four numbers
297 296

	
298
      ///Construct an instance from four numbers.
297
      ///Construct a box from four numbers.
299 298
      ///\param l The left side of the box.
300 299
      ///\param b The bottom of the box.
301 300
      ///\param r The right side of the box.
302 301
      ///\param t The top of the box.
303 302
      ///\warning The left side must be no more than the right side and
304 303
      ///bottom must be no more than the top.
305
      BoundingBox(T l,T b,T r,T t)
304
      Box(T l,T b,T r,T t)
306 305
      {
307 306
        _bottom_left=Point<T>(l,b);
308 307
        _top_right=Point<T>(r,t);
309 308
        _empty = false;
310 309
      }
311 310

	
312
      ///Return \c true if the bounding box is empty.
311
      ///Return \c true if the box is empty.
313 312

	
314
      ///Return \c true if the bounding box is empty (i.e. return \c false
313
      ///Return \c true if the box is empty (i.e. return \c false
315 314
      ///if at least one point was added to the box or the coordinates of
316 315
      ///the box were set).
317 316
      ///
318
      ///The coordinates of an empty bounding box are not defined.
317
      ///The coordinates of an empty box are not defined.
319 318
      bool empty() const {
320 319
        return _empty;
321 320
      }
322 321

	
323
      ///Make the BoundingBox empty
322
      ///Make the box empty
324 323
      void clear() {
325 324
        _empty = true;
326 325
      }
327 326

	
328 327
      ///Give back the bottom left corner of the box
329 328

	
330 329
      ///Give back the bottom left corner of the box.
331
      ///If the bounding box is empty, then the return value is not defined.
330
      ///If the box is empty, then the return value is not defined.
332 331
      Point<T> bottomLeft() const {
333 332
        return _bottom_left;
334 333
      }
335 334

	
336 335
      ///Set the bottom left corner of the box
337 336

	
338 337
      ///Set the bottom left corner of the box.
339 338
      ///\pre The box must not be empty.
340 339
      void bottomLeft(Point<T> p) {
341 340
        _bottom_left = p;
342 341
      }
343 342

	
344 343
      ///Give back the top right corner of the box
345 344

	
346 345
      ///Give back the top right corner of the box.
347
      ///If the bounding box is empty, then the return value is not defined.
346
      ///If the box is empty, then the return value is not defined.
348 347
      Point<T> topRight() const {
349 348
        return _top_right;
350 349
      }
351 350

	
352 351
      ///Set the top right corner of the box
353 352

	
354 353
      ///Set the top right corner of the box.
355 354
      ///\pre The box must not be empty.
356 355
      void topRight(Point<T> p) {
357 356
        _top_right = p;
358 357
      }
359 358

	
360 359
      ///Give back the bottom right corner of the box
361 360

	
362 361
      ///Give back the bottom right corner of the box.
363
      ///If the bounding box is empty, then the return value is not defined.
362
      ///If the box is empty, then the return value is not defined.
364 363
      Point<T> bottomRight() const {
365 364
        return Point<T>(_top_right.x,_bottom_left.y);
366 365
      }
367 366

	
368 367
      ///Set the bottom right corner of the box
369 368

	
370 369
      ///Set the bottom right corner of the box.
371 370
      ///\pre The box must not be empty.
372 371
      void bottomRight(Point<T> p) {
373 372
        _top_right.x = p.x;
374 373
        _bottom_left.y = p.y;
375 374
      }
376 375

	
377 376
      ///Give back the top left corner of the box
378 377

	
379 378
      ///Give back the top left corner of the box.
380
      ///If the bounding box is empty, then the return value is not defined.
379
      ///If the box is empty, then the return value is not defined.
381 380
      Point<T> topLeft() const {
382 381
        return Point<T>(_bottom_left.x,_top_right.y);
383 382
      }
384 383

	
385 384
      ///Set the top left corner of the box
386 385

	
387 386
      ///Set the top left corner of the box.
388 387
      ///\pre The box must not be empty.
389 388
      void topLeft(Point<T> p) {
390 389
        _top_right.y = p.y;
391 390
        _bottom_left.x = p.x;
392 391
      }
393 392

	
394 393
      ///Give back the bottom of the box
395 394

	
396 395
      ///Give back the bottom of the box.
397
      ///If the bounding box is empty, then the return value is not defined.
396
      ///If the box is empty, then the return value is not defined.
398 397
      T bottom() const {
399 398
        return _bottom_left.y;
400 399
      }
401 400

	
402 401
      ///Set the bottom of the box
403 402

	
404 403
      ///Set the bottom of the box.
405 404
      ///\pre The box must not be empty.
406 405
      void bottom(T t) {
407 406
        _bottom_left.y = t;
408 407
      }
409 408

	
410 409
      ///Give back the top of the box
411 410

	
412 411
      ///Give back the top of the box.
413
      ///If the bounding box is empty, then the return value is not defined.
412
      ///If the box is empty, then the return value is not defined.
414 413
      T top() const {
415 414
        return _top_right.y;
416 415
      }
417 416

	
418 417
      ///Set the top of the box
419 418

	
420 419
      ///Set the top of the box.
421 420
      ///\pre The box must not be empty.
422 421
      void top(T t) {
423 422
        _top_right.y = t;
424 423
      }
425 424

	
426 425
      ///Give back the left side of the box
427 426

	
428 427
      ///Give back the left side of the box.
429
      ///If the bounding box is empty, then the return value is not defined.
428
      ///If the box is empty, then the return value is not defined.
430 429
      T left() const {
431 430
        return _bottom_left.x;
432 431
      }
433 432

	
434 433
      ///Set the left side of the box
435 434

	
436 435
      ///Set the left side of the box.
437 436
      ///\pre The box must not be empty.
438 437
      void left(T t) {
439 438
        _bottom_left.x = t;
440 439
      }
441 440

	
442 441
      /// Give back the right side of the box
443 442

	
444 443
      /// Give back the right side of the box.
445
      ///If the bounding box is empty, then the return value is not defined.
444
      ///If the box is empty, then the return value is not defined.
446 445
      T right() const {
447 446
        return _top_right.x;
448 447
      }
449 448

	
450 449
      ///Set the right side of the box
451 450

	
452 451
      ///Set the right side of the box.
453 452
      ///\pre The box must not be empty.
454 453
      void right(T t) {
455 454
        _top_right.x = t;
456 455
      }
457 456

	
458 457
      ///Give back the height of the box
459 458

	
460 459
      ///Give back the height of the box.
461
      ///If the bounding box is empty, then the return value is not defined.
460
      ///If the box is empty, then the return value is not defined.
462 461
      T height() const {
463 462
        return _top_right.y-_bottom_left.y;
464 463
      }
465 464

	
466 465
      ///Give back the width of the box
467 466

	
468 467
      ///Give back the width of the box.
469
      ///If the bounding box is empty, then the return value is not defined.
468
      ///If the box is empty, then the return value is not defined.
470 469
      T width() const {
471 470
        return _top_right.x-_bottom_left.x;
472 471
      }
473 472

	
474
      ///Checks whether a point is inside a bounding box
473
      ///Checks whether a point is inside the box
475 474
      bool inside(const Point<T>& u) const {
476 475
        if (_empty)
477 476
          return false;
478 477
        else {
479 478
          return ( (u.x-_bottom_left.x)*(_top_right.x-u.x) >= 0 &&
480 479
                   (u.y-_bottom_left.y)*(_top_right.y-u.y) >= 0 );
481 480
        }
482 481
      }
483 482

	
484
      ///Increments a bounding box with a point
483
      ///Increments the box with a point
485 484

	
486
      ///Increments a bounding box with a point.
485
      ///Increments the box with a point.
487 486
      ///
488
      BoundingBox& add(const Point<T>& u){
487
      Box& add(const Point<T>& u){
489 488
        if (_empty) {
490 489
          _bottom_left = _top_right = u;
491 490
          _empty = false;
492 491
        }
493 492
        else {
494 493
          if (_bottom_left.x > u.x) _bottom_left.x = u.x;
495 494
          if (_bottom_left.y > u.y) _bottom_left.y = u.y;
496 495
          if (_top_right.x < u.x) _top_right.x = u.x;
497 496
          if (_top_right.y < u.y) _top_right.y = u.y;
498 497
        }
499 498
        return *this;
500 499
      }
501 500

	
502
      ///Increments a bounding box to contain another bounding box
501
      ///Increments the box to contain another box
503 502

	
504
      ///Increments a bounding box to contain another bounding box.
503
      ///Increments the box to contain another box.
505 504
      ///
506
      BoundingBox& add(const BoundingBox &u){
505
      Box& add(const Box &u){
507 506
        if ( !u.empty() ){
508 507
          add(u._bottom_left);
509 508
          add(u._top_right);
510 509
        }
511 510
        return *this;
512 511
      }
513 512

	
514
      ///Intersection of two bounding boxes
513
      ///Intersection of two boxes
515 514

	
516
      ///Intersection of two bounding boxes.
515
      ///Intersection of two boxes.
517 516
      ///
518
      BoundingBox operator&(const BoundingBox& u) const {
519
        BoundingBox b;
517
      Box operator&(const Box& u) const {
518
        Box b;
520 519
        if (_empty || u._empty) {
521 520
          b._empty = true;
522 521
        } else {
523 522
          b._bottom_left.x = std::max(_bottom_left.x, u._bottom_left.x);
524 523
          b._bottom_left.y = std::max(_bottom_left.y, u._bottom_left.y);
525 524
          b._top_right.x = std::min(_top_right.x, u._top_right.x);
526 525
          b._top_right.y = std::min(_top_right.y, u._top_right.y);
527 526
          b._empty = b._bottom_left.x > b._top_right.x ||
528 527
                     b._bottom_left.y > b._top_right.y;
529 528
        }
530 529
        return b;
531 530
      }
532 531

	
533
    };//class Boundingbox
532
  };//class Box
534 533

	
535 534

	
535
  ///Read a box from a stream
536

	
537
  ///Read a box from a stream.
538
  ///\relates Box
539
  template<typename T>
540
  inline std::istream& operator>>(std::istream &is, Box<T>& b) {
541
    char c;
542
    Point<T> p;
543
    if (is >> c) {
544
      if (c != '(') is.putback(c);
545
    } else {
546
      is.clear();
547
    }
548
    if (!(is >> p)) return is;
549
    b.bottomLeft(p);
550
    if (is >> c) {
551
      if (c != ',') is.putback(c);
552
    } else {
553
      is.clear();
554
    }
555
    if (!(is >> p)) return is;
556
    b.topRight(p);
557
    if (is >> c) {
558
      if (c != ')') is.putback(c);
559
    } else {
560
      is.clear();
561
    }
562
    return is;
563
  }
564

	
565
  ///Write a box to a stream
566

	
567
  ///Write a box to a stream.
568
  ///\relates Box
569
  template<typename T>
570
  inline std::ostream& operator<<(std::ostream &os, const Box<T>& b)
571
  {
572
    os << "(" << b.bottomLeft() << "," << b.topRight() << ")";
573
    return os;
574
  }
575

	
536 576
  ///Map of x-coordinates of a \ref Point "Point"-map
537 577

	
538 578
  ///\ingroup maps
539 579
  ///Map of x-coordinates of a \ref Point "Point"-map.
540 580
  ///
541 581
  template<class M>
542 582
  class XMap
543 583
  {
544 584
    M& _map;
545 585
  public:
546 586

	
547 587
    typedef typename M::Value::Value Value;
548 588
    typedef typename M::Key Key;
549 589
    ///\e
550 590
    XMap(M& map) : _map(map) {}
551 591
    Value operator[](Key k) const {return _map[k].x;}
552 592
    void set(Key k,Value v) {_map.set(k,typename M::Value(v,_map[k].y));}
553 593
  };
554 594

	
555 595
  ///Returns an \ref XMap class
556 596

	
557 597
  ///This function just returns an \ref XMap class.
558 598
  ///
559 599
  ///\ingroup maps
560 600
  ///\relates XMap
561 601
  template<class M>
562 602
  inline XMap<M> xMap(M &m)
563 603
  {
564 604
    return XMap<M>(m);
565 605
  }
566 606

	
567 607
  template<class M>
568 608
  inline XMap<M> xMap(const M &m)
569 609
  {
570 610
    return XMap<M>(m);
571 611
  }
572 612

	
573 613
  ///Constant (read only) version of \ref XMap
574 614

	
575 615
  ///\ingroup maps
576 616
  ///Constant (read only) version of \ref XMap
577 617
  ///
578 618
  template<class M>
579 619
  class ConstXMap
580 620
  {
581 621
    const M& _map;
582 622
  public:
583 623

	
584 624
    typedef typename M::Value::Value Value;
585 625
    typedef typename M::Key Key;
586 626
    ///\e
587 627
    ConstXMap(const M &map) : _map(map) {}
588 628
    Value operator[](Key k) const {return _map[k].x;}
589 629
  };
590 630

	
591 631
  ///Returns a \ref ConstXMap class
592 632

	
593 633
  ///This function just returns a \ref ConstXMap class.
594 634
  ///
595 635
  ///\ingroup maps
596 636
  ///\relates ConstXMap
597 637
  template<class M>
598 638
  inline ConstXMap<M> xMap(const M &m)
599 639
  {
600 640
    return ConstXMap<M>(m);
601 641
  }
602 642

	
603 643
  ///Map of y-coordinates of a \ref Point "Point"-map
604 644

	
605 645
  ///\ingroup maps
606 646
  ///Map of y-coordinates of a \ref Point "Point"-map.
607 647
  ///
608 648
  template<class M>
609 649
  class YMap
610 650
  {
611 651
    M& _map;
612 652
  public:
613 653

	
614 654
    typedef typename M::Value::Value Value;
615 655
    typedef typename M::Key Key;
616 656
    ///\e
617 657
    YMap(M& map) : _map(map) {}
618 658
    Value operator[](Key k) const {return _map[k].y;}
619 659
    void set(Key k,Value v) {_map.set(k,typename M::Value(_map[k].x,v));}
620 660
  };
621 661

	
622 662
  ///Returns a \ref YMap class
623 663

	
624 664
  ///This function just returns a \ref YMap class.
625 665
  ///
626 666
  ///\ingroup maps
627 667
  ///\relates YMap
628 668
  template<class M>
629 669
  inline YMap<M> yMap(M &m)
630 670
  {
631 671
    return YMap<M>(m);
632 672
  }
633 673

	
634 674
  template<class M>
635 675
  inline YMap<M> yMap(const M &m)
636 676
  {
637 677
    return YMap<M>(m);
638 678
  }
639 679

	
640 680
  ///Constant (read only) version of \ref YMap
641 681

	
642 682
  ///\ingroup maps
643 683
  ///Constant (read only) version of \ref YMap
644 684
  ///
645 685
  template<class M>
646 686
  class ConstYMap
647 687
  {
648 688
    const M& _map;
649 689
  public:
650 690

	
651 691
    typedef typename M::Value::Value Value;
652 692
    typedef typename M::Key Key;
653 693
    ///\e
654 694
    ConstYMap(const M &map) : _map(map) {}
655 695
    Value operator[](Key k) const {return _map[k].y;}
656 696
  };
657 697

	
658 698
  ///Returns a \ref ConstYMap class
659 699

	
660 700
  ///This function just returns a \ref ConstYMap class.
661 701
  ///
662 702
  ///\ingroup maps
663 703
  ///\relates ConstYMap
664 704
  template<class M>
665 705
  inline ConstYMap<M> yMap(const M &m)
666 706
  {
667 707
    return ConstYMap<M>(m);
668 708
  }
669 709

	
670 710

	
671 711
  ///\brief Map of the \ref Point::normSquare() "normSquare()"
672 712
  ///of a \ref Point "Point"-map
673 713
  ///
674 714
  ///Map of the \ref Point::normSquare() "normSquare()"
675 715
  ///of a \ref Point "Point"-map.
676 716
  ///\ingroup maps
677 717
  template<class M>
678 718
  class NormSquareMap
679 719
  {
680 720
    const M& _map;
681 721
  public:
682 722

	
683 723
    typedef typename M::Value::Value Value;
684 724
    typedef typename M::Key Key;
685 725
    ///\e
686 726
    NormSquareMap(const M &map) : _map(map) {}
687 727
    Value operator[](Key k) const {return _map[k].normSquare();}
688 728
  };
689 729

	
690 730
  ///Returns a \ref NormSquareMap class
691 731

	
692 732
  ///This function just returns a \ref NormSquareMap class.
693 733
  ///
694 734
  ///\ingroup maps
695 735
  ///\relates NormSquareMap
696 736
  template<class M>
697 737
  inline NormSquareMap<M> normSquareMap(const M &m)
698 738
  {
699 739
    return NormSquareMap<M>(m);
700 740
  }
701 741

	
702 742
  /// @}
703 743

	
704 744
  } //namespce dim2
705 745

	
706 746
} //namespace lemon
707 747

	
708 748
#endif //LEMON_DIM2_H
Ignore white space 768 line context
... ...
@@ -344,802 +344,802 @@
344 344
    return GraphToEps<CoordsTraits<X> >(CoordsTraits<X>(*this,x));
345 345
  }
346 346
  template<class X> struct NodeSizesTraits : public T {
347 347
    const X &_nodeSizes;
348 348
    NodeSizesTraits(const T &t,const X &x) : T(t), _nodeSizes(x) {}
349 349
  };
350 350
  ///Sets the map of the node sizes
351 351

	
352 352
  ///Sets the map of the node sizes.
353 353
  ///\param x must be a node map with \c double (or convertible) values.
354 354
  template<class X> GraphToEps<NodeSizesTraits<X> > nodeSizes(const X &x)
355 355
  {
356 356
    dontPrint=true;
357 357
    return GraphToEps<NodeSizesTraits<X> >(NodeSizesTraits<X>(*this,x));
358 358
  }
359 359
  template<class X> struct NodeShapesTraits : public T {
360 360
    const X &_nodeShapes;
361 361
    NodeShapesTraits(const T &t,const X &x) : T(t), _nodeShapes(x) {}
362 362
  };
363 363
  ///Sets the map of the node shapes
364 364

	
365 365
  ///Sets the map of the node shapes.
366 366
  ///The available shape values
367 367
  ///can be found in \ref NodeShapes "enum NodeShapes".
368 368
  ///\param x must be a node map with \c int (or convertible) values.
369 369
  ///\sa NodeShapes
370 370
  template<class X> GraphToEps<NodeShapesTraits<X> > nodeShapes(const X &x)
371 371
  {
372 372
    dontPrint=true;
373 373
    return GraphToEps<NodeShapesTraits<X> >(NodeShapesTraits<X>(*this,x));
374 374
  }
375 375
  template<class X> struct NodeTextsTraits : public T {
376 376
    const X &_nodeTexts;
377 377
    NodeTextsTraits(const T &t,const X &x) : T(t), _nodeTexts(x) {}
378 378
  };
379 379
  ///Sets the text printed on the nodes
380 380

	
381 381
  ///Sets the text printed on the nodes.
382 382
  ///\param x must be a node map with type that can be pushed to a standard
383 383
  ///\c ostream.
384 384
  template<class X> GraphToEps<NodeTextsTraits<X> > nodeTexts(const X &x)
385 385
  {
386 386
    dontPrint=true;
387 387
    _showNodeText=true;
388 388
    return GraphToEps<NodeTextsTraits<X> >(NodeTextsTraits<X>(*this,x));
389 389
  }
390 390
  template<class X> struct NodePsTextsTraits : public T {
391 391
    const X &_nodePsTexts;
392 392
    NodePsTextsTraits(const T &t,const X &x) : T(t), _nodePsTexts(x) {}
393 393
  };
394 394
  ///Inserts a PostScript block to the nodes
395 395

	
396 396
  ///With this command it is possible to insert a verbatim PostScript
397 397
  ///block to the nodes.
398 398
  ///The PS current point will be moved to the center of the node before
399 399
  ///the PostScript block inserted.
400 400
  ///
401 401
  ///Before and after the block a newline character is inserted so you
402 402
  ///don't have to bother with the separators.
403 403
  ///
404 404
  ///\param x must be a node map with type that can be pushed to a standard
405 405
  ///\c ostream.
406 406
  ///
407 407
  ///\sa nodePsTextsPreamble()
408 408
  template<class X> GraphToEps<NodePsTextsTraits<X> > nodePsTexts(const X &x)
409 409
  {
410 410
    dontPrint=true;
411 411
    _showNodePsText=true;
412 412
    return GraphToEps<NodePsTextsTraits<X> >(NodePsTextsTraits<X>(*this,x));
413 413
  }
414 414
  template<class X> struct ArcWidthsTraits : public T {
415 415
    const X &_arcWidths;
416 416
    ArcWidthsTraits(const T &t,const X &x) : T(t), _arcWidths(x) {}
417 417
  };
418 418
  ///Sets the map of the arc widths
419 419

	
420 420
  ///Sets the map of the arc widths.
421 421
  ///\param x must be an arc map with \c double (or convertible) values.
422 422
  template<class X> GraphToEps<ArcWidthsTraits<X> > arcWidths(const X &x)
423 423
  {
424 424
    dontPrint=true;
425 425
    return GraphToEps<ArcWidthsTraits<X> >(ArcWidthsTraits<X>(*this,x));
426 426
  }
427 427

	
428 428
  template<class X> struct NodeColorsTraits : public T {
429 429
    const X &_nodeColors;
430 430
    NodeColorsTraits(const T &t,const X &x) : T(t), _nodeColors(x) {}
431 431
  };
432 432
  ///Sets the map of the node colors
433 433

	
434 434
  ///Sets the map of the node colors.
435 435
  ///\param x must be a node map with \ref Color values.
436 436
  ///
437 437
  ///\sa Palette
438 438
  template<class X> GraphToEps<NodeColorsTraits<X> >
439 439
  nodeColors(const X &x)
440 440
  {
441 441
    dontPrint=true;
442 442
    return GraphToEps<NodeColorsTraits<X> >(NodeColorsTraits<X>(*this,x));
443 443
  }
444 444
  template<class X> struct NodeTextColorsTraits : public T {
445 445
    const X &_nodeTextColors;
446 446
    NodeTextColorsTraits(const T &t,const X &x) : T(t), _nodeTextColors(x) {}
447 447
  };
448 448
  ///Sets the map of the node text colors
449 449

	
450 450
  ///Sets the map of the node text colors.
451 451
  ///\param x must be a node map with \ref Color values.
452 452
  ///
453 453
  ///\sa Palette
454 454
  template<class X> GraphToEps<NodeTextColorsTraits<X> >
455 455
  nodeTextColors(const X &x)
456 456
  {
457 457
    dontPrint=true;
458 458
    _nodeTextColorType=CUST_COL;
459 459
    return GraphToEps<NodeTextColorsTraits<X> >
460 460
      (NodeTextColorsTraits<X>(*this,x));
461 461
  }
462 462
  template<class X> struct ArcColorsTraits : public T {
463 463
    const X &_arcColors;
464 464
    ArcColorsTraits(const T &t,const X &x) : T(t), _arcColors(x) {}
465 465
  };
466 466
  ///Sets the map of the arc colors
467 467

	
468 468
  ///Sets the map of the arc colors.
469 469
  ///\param x must be an arc map with \ref Color values.
470 470
  ///
471 471
  ///\sa Palette
472 472
  template<class X> GraphToEps<ArcColorsTraits<X> >
473 473
  arcColors(const X &x)
474 474
  {
475 475
    dontPrint=true;
476 476
    return GraphToEps<ArcColorsTraits<X> >(ArcColorsTraits<X>(*this,x));
477 477
  }
478 478
  ///Sets a global scale factor for node sizes
479 479

	
480 480
  ///Sets a global scale factor for node sizes.
481 481
  ///
482 482
  /// If nodeSizes() is not given, this function simply sets the node
483 483
  /// sizes to \c d.  If nodeSizes() is given, but
484 484
  /// autoNodeScale() is not, then the node size given by
485 485
  /// nodeSizes() will be multiplied by the value \c d.
486 486
  /// If both nodeSizes() and autoNodeScale() are used, then the
487 487
  /// node sizes will be scaled in such a way that the greatest size will be
488 488
  /// equal to \c d.
489 489
  /// \sa nodeSizes()
490 490
  /// \sa autoNodeScale()
491 491
  GraphToEps<T> &nodeScale(double d=.01) {_nodeScale=d;return *this;}
492 492
  ///Turns on/off the automatic node size scaling.
493 493

	
494 494
  ///Turns on/off the automatic node size scaling.
495 495
  ///
496 496
  ///\sa nodeScale()
497 497
  ///
498 498
  GraphToEps<T> &autoNodeScale(bool b=true) {
499 499
    _autoNodeScale=b;return *this;
500 500
  }
501 501

	
502 502
  ///Turns on/off the absolutematic node size scaling.
503 503

	
504 504
  ///Turns on/off the absolutematic node size scaling.
505 505
  ///
506 506
  ///\sa nodeScale()
507 507
  ///
508 508
  GraphToEps<T> &absoluteNodeSizes(bool b=true) {
509 509
    _absoluteNodeSizes=b;return *this;
510 510
  }
511 511

	
512 512
  ///Negates the Y coordinates.
513 513
  GraphToEps<T> &negateY(bool b=true) {
514 514
    _negY=b;return *this;
515 515
  }
516 516

	
517 517
  ///Turn on/off pre-scaling
518 518

	
519 519
  ///By default graphToEps() rescales the whole image in order to avoid
520 520
  ///very big or very small bounding boxes.
521 521
  ///
522 522
  ///This (p)rescaling can be turned off with this function.
523 523
  ///
524 524
  GraphToEps<T> &preScale(bool b=true) {
525 525
    _preScale=b;return *this;
526 526
  }
527 527

	
528 528
  ///Sets a global scale factor for arc widths
529 529

	
530 530
  /// Sets a global scale factor for arc widths.
531 531
  ///
532 532
  /// If arcWidths() is not given, this function simply sets the arc
533 533
  /// widths to \c d.  If arcWidths() is given, but
534 534
  /// autoArcWidthScale() is not, then the arc withs given by
535 535
  /// arcWidths() will be multiplied by the value \c d.
536 536
  /// If both arcWidths() and autoArcWidthScale() are used, then the
537 537
  /// arc withs will be scaled in such a way that the greatest width will be
538 538
  /// equal to \c d.
539 539
  GraphToEps<T> &arcWidthScale(double d=.003) {_arcWidthScale=d;return *this;}
540 540
  ///Turns on/off the automatic arc width scaling.
541 541

	
542 542
  ///Turns on/off the automatic arc width scaling.
543 543
  ///
544 544
  ///\sa arcWidthScale()
545 545
  ///
546 546
  GraphToEps<T> &autoArcWidthScale(bool b=true) {
547 547
    _autoArcWidthScale=b;return *this;
548 548
  }
549 549
  ///Turns on/off the absolutematic arc width scaling.
550 550

	
551 551
  ///Turns on/off the absolutematic arc width scaling.
552 552
  ///
553 553
  ///\sa arcWidthScale()
554 554
  ///
555 555
  GraphToEps<T> &absoluteArcWidths(bool b=true) {
556 556
    _absoluteArcWidths=b;return *this;
557 557
  }
558 558
  ///Sets a global scale factor for the whole picture
559 559
  GraphToEps<T> &scale(double d) {_scale=d;return *this;}
560 560
  ///Sets the width of the border around the picture
561 561
  GraphToEps<T> &border(double b=10) {_xBorder=_yBorder=b;return *this;}
562 562
  ///Sets the width of the border around the picture
563 563
  GraphToEps<T> &border(double x, double y) {
564 564
    _xBorder=x;_yBorder=y;return *this;
565 565
  }
566 566
  ///Sets whether to draw arrows
567 567
  GraphToEps<T> &drawArrows(bool b=true) {_drawArrows=b;return *this;}
568 568
  ///Sets the length of the arrowheads
569 569
  GraphToEps<T> &arrowLength(double d=1.0) {_arrowLength*=d;return *this;}
570 570
  ///Sets the width of the arrowheads
571 571
  GraphToEps<T> &arrowWidth(double d=.3) {_arrowWidth*=d;return *this;}
572 572

	
573 573
  ///Scales the drawing to fit to A4 page
574 574
  GraphToEps<T> &scaleToA4() {_scaleToA4=true;return *this;}
575 575

	
576 576
  ///Enables parallel arcs
577 577
  GraphToEps<T> &enableParallel(bool b=true) {_enableParallel=b;return *this;}
578 578

	
579 579
  ///Sets the distance between parallel arcs
580 580
  GraphToEps<T> &parArcDist(double d) {_parArcDist*=d;return *this;}
581 581

	
582 582
  ///Hides the arcs
583 583
  GraphToEps<T> &hideArcs(bool b=true) {_showArcs=!b;return *this;}
584 584
  ///Hides the nodes
585 585
  GraphToEps<T> &hideNodes(bool b=true) {_showNodes=!b;return *this;}
586 586

	
587 587
  ///Sets the size of the node texts
588 588
  GraphToEps<T> &nodeTextSize(double d) {_nodeTextSize=d;return *this;}
589 589

	
590 590
  ///Sets the color of the node texts to be different from the node color
591 591

	
592 592
  ///Sets the color of the node texts to be as different from the node color
593 593
  ///as it is possible.
594 594
  GraphToEps<T> &distantColorNodeTexts()
595 595
  {_nodeTextColorType=DIST_COL;return *this;}
596 596
  ///Sets the color of the node texts to be black or white and always visible.
597 597

	
598 598
  ///Sets the color of the node texts to be black or white according to
599 599
  ///which is more different from the node color.
600 600
  GraphToEps<T> &distantBWNodeTexts()
601 601
  {_nodeTextColorType=DIST_BW;return *this;}
602 602

	
603 603
  ///Gives a preamble block for node Postscript block.
604 604

	
605 605
  ///Gives a preamble block for node Postscript block.
606 606
  ///
607 607
  ///\sa nodePsTexts()
608 608
  GraphToEps<T> & nodePsTextsPreamble(const char *str) {
609 609
    _nodePsTextsPreamble=str ;return *this;
610 610
  }
611 611
  ///Sets whether the graph is undirected
612 612

	
613 613
  ///Sets whether the graph is undirected.
614 614
  ///
615 615
  ///This setting is the default for undirected graphs.
616 616
  ///
617 617
  ///\sa directed()
618 618
   GraphToEps<T> &undirected(bool b=true) {_undirected=b;return *this;}
619 619

	
620 620
  ///Sets whether the graph is directed
621 621

	
622 622
  ///Sets whether the graph is directed.
623 623
  ///Use it to show the edges as a pair of directed ones.
624 624
  ///
625 625
  ///This setting is the default for digraphs.
626 626
  ///
627 627
  ///\sa undirected()
628 628
  GraphToEps<T> &directed(bool b=true) {_undirected=!b;return *this;}
629 629

	
630 630
  ///Sets the title.
631 631

	
632 632
  ///Sets the title of the generated image,
633 633
  ///namely it inserts a <tt>%%Title:</tt> DSC field to the header of
634 634
  ///the EPS file.
635 635
  GraphToEps<T> &title(const std::string &t) {_title=t;return *this;}
636 636
  ///Sets the copyright statement.
637 637

	
638 638
  ///Sets the copyright statement of the generated image,
639 639
  ///namely it inserts a <tt>%%Copyright:</tt> DSC field to the header of
640 640
  ///the EPS file.
641 641
  GraphToEps<T> &copyright(const std::string &t) {_copyright=t;return *this;}
642 642

	
643 643
protected:
644 644
  bool isInsideNode(dim2::Point<double> p, double r,int t)
645 645
  {
646 646
    switch(t) {
647 647
    case CIRCLE:
648 648
    case MALE:
649 649
    case FEMALE:
650 650
      return p.normSquare()<=r*r;
651 651
    case SQUARE:
652 652
      return p.x<=r&&p.x>=-r&&p.y<=r&&p.y>=-r;
653 653
    case DIAMOND:
654 654
      return p.x+p.y<=r && p.x-p.y<=r && -p.x+p.y<=r && -p.x-p.y<=r;
655 655
    }
656 656
    return false;
657 657
  }
658 658

	
659 659
public:
660 660
  ~GraphToEps() { }
661 661

	
662 662
  ///Draws the graph.
663 663

	
664 664
  ///Like other functions using
665 665
  ///\ref named-templ-func-param "named template parameters",
666 666
  ///this function calls the algorithm itself, i.e. in this case
667 667
  ///it draws the graph.
668 668
  void run() {
669 669
    //\todo better 'epsilon' would be nice here.
670 670
    const double EPSILON=1e-9;
671 671
    if(dontPrint) return;
672 672

	
673 673
    _graph_to_eps_bits::_NegY<typename T::CoordsMapType>
674 674
      mycoords(_coords,_negY);
675 675

	
676 676
    os << "%!PS-Adobe-2.0 EPSF-2.0\n";
677 677
    if(_title.size()>0) os << "%%Title: " << _title << '\n';
678 678
     if(_copyright.size()>0) os << "%%Copyright: " << _copyright << '\n';
679 679
    os << "%%Creator: LEMON, graphToEps()\n";
680 680

	
681 681
    {
682 682
#ifndef WIN32
683 683
      timeval tv;
684 684
      gettimeofday(&tv, 0);
685 685

	
686 686
      char cbuf[26];
687 687
      ctime_r(&tv.tv_sec,cbuf);
688 688
      os << "%%CreationDate: " << cbuf;
689 689
#else
690 690
      SYSTEMTIME time;
691 691
      char buf1[11], buf2[9], buf3[5];
692 692

	
693 693
      GetSystemTime(&time);
694 694
      if (GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
695 695
                        "ddd MMM dd", buf1, 11) &&
696 696
          GetTimeFormat(LOCALE_USER_DEFAULT, 0, &time,
697 697
                        "HH':'mm':'ss", buf2, 9) &&
698 698
          GetDateFormat(LOCALE_USER_DEFAULT, 0, &time,
699 699
                                "yyyy", buf3, 5)) {
700 700
        os << "%%CreationDate: " << buf1 << ' '
701 701
           << buf2 << ' ' << buf3 << std::endl;
702 702
      }
703 703
#endif
704 704
    }
705 705

	
706 706
    if (_autoArcWidthScale) {
707 707
      double max_w=0;
708 708
      for(ArcIt e(g);e!=INVALID;++e)
709 709
        max_w=std::max(double(_arcWidths[e]),max_w);
710 710
      //\todo better 'epsilon' would be nice here.
711 711
      if(max_w>EPSILON) {
712 712
        _arcWidthScale/=max_w;
713 713
      }
714 714
    }
715 715

	
716 716
    if (_autoNodeScale) {
717 717
      double max_s=0;
718 718
      for(NodeIt n(g);n!=INVALID;++n)
719 719
        max_s=std::max(double(_nodeSizes[n]),max_s);
720 720
      //\todo better 'epsilon' would be nice here.
721 721
      if(max_s>EPSILON) {
722 722
        _nodeScale/=max_s;
723 723
      }
724 724
    }
725 725

	
726 726
    double diag_len = 1;
727 727
    if(!(_absoluteNodeSizes&&_absoluteArcWidths)) {
728
      dim2::BoundingBox<double> bb;
728
      dim2::Box<double> bb;
729 729
      for(NodeIt n(g);n!=INVALID;++n) bb.add(mycoords[n]);
730 730
      if (bb.empty()) {
731
        bb = dim2::BoundingBox<double>(dim2::Point<double>(0,0));
731
        bb = dim2::Box<double>(dim2::Point<double>(0,0));
732 732
      }
733 733
      diag_len = std::sqrt((bb.bottomLeft()-bb.topRight()).normSquare());
734 734
      if(diag_len<EPSILON) diag_len = 1;
735 735
      if(!_absoluteNodeSizes) _nodeScale*=diag_len;
736 736
      if(!_absoluteArcWidths) _arcWidthScale*=diag_len;
737 737
    }
738 738

	
739
    dim2::BoundingBox<double> bb;
739
    dim2::Box<double> bb;
740 740
    for(NodeIt n(g);n!=INVALID;++n) {
741 741
      double ns=_nodeSizes[n]*_nodeScale;
742 742
      dim2::Point<double> p(ns,ns);
743 743
      switch(_nodeShapes[n]) {
744 744
      case CIRCLE:
745 745
      case SQUARE:
746 746
      case DIAMOND:
747 747
        bb.add(p+mycoords[n]);
748 748
        bb.add(-p+mycoords[n]);
749 749
        break;
750 750
      case MALE:
751 751
        bb.add(-p+mycoords[n]);
752 752
        bb.add(dim2::Point<double>(1.5*ns,1.5*std::sqrt(3.0)*ns)+mycoords[n]);
753 753
        break;
754 754
      case FEMALE:
755 755
        bb.add(p+mycoords[n]);
756 756
        bb.add(dim2::Point<double>(-ns,-3.01*ns)+mycoords[n]);
757 757
        break;
758 758
      }
759 759
    }
760 760
    if (bb.empty()) {
761
      bb = dim2::BoundingBox<double>(dim2::Point<double>(0,0));
761
      bb = dim2::Box<double>(dim2::Point<double>(0,0));
762 762
    }
763 763

	
764 764
    if(_scaleToA4)
765 765
      os <<"%%BoundingBox: 0 0 596 842\n%%DocumentPaperSizes: a4\n";
766 766
    else {
767 767
      if(_preScale) {
768 768
        //Rescale so that BoundingBox won't be neither to big nor too small.
769 769
        while(bb.height()*_scale>1000||bb.width()*_scale>1000) _scale/=10;
770 770
        while(bb.height()*_scale<100||bb.width()*_scale<100) _scale*=10;
771 771
      }
772 772

	
773 773
      os << "%%BoundingBox: "
774 774
         << int(floor(bb.left()   * _scale - _xBorder)) << ' '
775 775
         << int(floor(bb.bottom() * _scale - _yBorder)) << ' '
776 776
         << int(ceil(bb.right()  * _scale + _xBorder)) << ' '
777 777
         << int(ceil(bb.top()    * _scale + _yBorder)) << '\n';
778 778
    }
779 779

	
780 780
    os << "%%EndComments\n";
781 781

	
782 782
    //x1 y1 x2 y2 x3 y3 cr cg cb w
783 783
    os << "/lb { setlinewidth setrgbcolor newpath moveto\n"
784 784
       << "      4 2 roll 1 index 1 index curveto stroke } bind def\n";
785 785
    os << "/l { setlinewidth setrgbcolor newpath moveto lineto stroke }"
786 786
       << " bind def\n";
787 787
    //x y r
788 788
    os << "/c { newpath dup 3 index add 2 index moveto 0 360 arc closepath }"
789 789
       << " bind def\n";
790 790
    //x y r
791 791
    os << "/sq { newpath 2 index 1 index add 2 index 2 index add moveto\n"
792 792
       << "      2 index 1 index sub 2 index 2 index add lineto\n"
793 793
       << "      2 index 1 index sub 2 index 2 index sub lineto\n"
794 794
       << "      2 index 1 index add 2 index 2 index sub lineto\n"
795 795
       << "      closepath pop pop pop} bind def\n";
796 796
    //x y r
797 797
    os << "/di { newpath 2 index 1 index add 2 index moveto\n"
798 798
       << "      2 index             2 index 2 index add lineto\n"
799 799
       << "      2 index 1 index sub 2 index             lineto\n"
800 800
       << "      2 index             2 index 2 index sub lineto\n"
801 801
       << "      closepath pop pop pop} bind def\n";
802 802
    // x y r cr cg cb
803 803
    os << "/nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill\n"
804 804
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
805 805
       << "   } bind def\n";
806 806
    os << "/nsq { 0 0 0 setrgbcolor 5 index 5 index 5 index sq fill\n"
807 807
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div sq fill\n"
808 808
       << "   } bind def\n";
809 809
    os << "/ndi { 0 0 0 setrgbcolor 5 index 5 index 5 index di fill\n"
810 810
       << "     setrgbcolor " << 1+_nodeBorderQuotient << " div di fill\n"
811 811
       << "   } bind def\n";
812 812
    os << "/nfemale { 0 0 0 setrgbcolor 3 index "
813 813
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
814 814
       << " 1.5 mul mul setlinewidth\n"
815 815
       << "  newpath 5 index 5 index moveto "
816 816
       << "5 index 5 index 5 index 3.01 mul sub\n"
817 817
       << "  lineto 5 index 4 index .7 mul sub 5 index 5 index 2.2 mul sub"
818 818
       << " moveto\n"
819 819
       << "  5 index 4 index .7 mul add 5 index 5 index 2.2 mul sub lineto "
820 820
       << "stroke\n"
821 821
       << "  5 index 5 index 5 index c fill\n"
822 822
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
823 823
       << "  } bind def\n";
824 824
    os << "/nmale {\n"
825 825
       << "  0 0 0 setrgbcolor 3 index "
826 826
       << _nodeBorderQuotient/(1+_nodeBorderQuotient)
827 827
       <<" 1.5 mul mul setlinewidth\n"
828 828
       << "  newpath 5 index 5 index moveto\n"
829 829
       << "  5 index 4 index 1 mul 1.5 mul add\n"
830 830
       << "  5 index 5 index 3 sqrt 1.5 mul mul add\n"
831 831
       << "  1 index 1 index lineto\n"
832 832
       << "  1 index 1 index 7 index sub moveto\n"
833 833
       << "  1 index 1 index lineto\n"
834 834
       << "  exch 5 index 3 sqrt .5 mul mul sub exch 5 index .5 mul sub"
835 835
       << " lineto\n"
836 836
       << "  stroke\n"
837 837
       << "  5 index 5 index 5 index c fill\n"
838 838
       << "  setrgbcolor " << 1+_nodeBorderQuotient << " div c fill\n"
839 839
       << "  } bind def\n";
840 840

	
841 841

	
842 842
    os << "/arrl " << _arrowLength << " def\n";
843 843
    os << "/arrw " << _arrowWidth << " def\n";
844 844
    // l dx_norm dy_norm
845 845
    os << "/lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def\n";
846 846
    //len w dx_norm dy_norm x1 y1 cr cg cb
847 847
    os << "/arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx "
848 848
       << "exch def\n"
849 849
       << "       /w exch def /len exch def\n"
850 850
      //<< "0.1 setlinewidth x1 y1 moveto dx len mul dy len mul rlineto stroke"
851 851
       << "       newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto\n"
852 852
       << "       len w sub arrl sub dx dy lrl\n"
853 853
       << "       arrw dy dx neg lrl\n"
854 854
       << "       dx arrl w add mul dy w 2 div arrw add mul sub\n"
855 855
       << "       dy arrl w add mul dx w 2 div arrw add mul add rlineto\n"
856 856
       << "       dx arrl w add mul neg dy w 2 div arrw add mul sub\n"
857 857
       << "       dy arrl w add mul neg dx w 2 div arrw add mul add rlineto\n"
858 858
       << "       arrw dy dx neg lrl\n"
859 859
       << "       len w sub arrl sub neg dx dy lrl\n"
860 860
       << "       closepath fill } bind def\n";
861 861
    os << "/cshow { 2 index 2 index moveto dup stringwidth pop\n"
862 862
       << "         neg 2 div fosi .35 mul neg rmoveto show pop pop} def\n";
863 863

	
864 864
    os << "\ngsave\n";
865 865
    if(_scaleToA4)
866 866
      if(bb.height()>bb.width()) {
867 867
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.height(),
868 868
                  (A4WIDTH-2*A4BORDER)/bb.width());
869 869
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.width())/2 + A4BORDER << ' '
870 870
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.height())/2 + A4BORDER
871 871
           << " translate\n"
872 872
           << sc << " dup scale\n"
873 873
           << -bb.left() << ' ' << -bb.bottom() << " translate\n";
874 874
      }
875 875
      else {
876 876
        //\todo Verify centering
877 877
        double sc= std::min((A4HEIGHT-2*A4BORDER)/bb.width(),
878 878
                  (A4WIDTH-2*A4BORDER)/bb.height());
879 879
        os << ((A4WIDTH -2*A4BORDER)-sc*bb.height())/2 + A4BORDER << ' '
880 880
           << ((A4HEIGHT-2*A4BORDER)-sc*bb.width())/2 + A4BORDER
881 881
           << " translate\n"
882 882
           << sc << " dup scale\n90 rotate\n"
883 883
           << -bb.left() << ' ' << -bb.top() << " translate\n";
884 884
        }
885 885
    else if(_scale!=1.0) os << _scale << " dup scale\n";
886 886

	
887 887
    if(_showArcs) {
888 888
      os << "%Arcs:\ngsave\n";
889 889
      if(_enableParallel) {
890 890
        std::vector<Arc> el;
891 891
        for(ArcIt e(g);e!=INVALID;++e)
892 892
          if((!_undirected||g.source(e)<g.target(e))&&_arcWidths[e]>0
893 893
             &&g.source(e)!=g.target(e))
894 894
            el.push_back(e);
895 895
        std::sort(el.begin(),el.end(),arcLess(g));
896 896

	
897 897
        typename std::vector<Arc>::iterator j;
898 898
        for(typename std::vector<Arc>::iterator i=el.begin();i!=el.end();i=j) {
899 899
          for(j=i+1;j!=el.end()&&isParallel(*i,*j);++j) ;
900 900

	
901 901
          double sw=0;
902 902
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e)
903 903
            sw+=_arcWidths[*e]*_arcWidthScale+_parArcDist;
904 904
          sw-=_parArcDist;
905 905
          sw/=-2.0;
906 906
          dim2::Point<double>
907 907
            dvec(mycoords[g.target(*i)]-mycoords[g.source(*i)]);
908 908
          double l=std::sqrt(dvec.normSquare());
909 909
          //\todo better 'epsilon' would be nice here.
910 910
          dim2::Point<double> d(dvec/std::max(l,EPSILON));
911 911
          dim2::Point<double> m;
912 912
//           m=dim2::Point<double>(mycoords[g.target(*i)]+
913 913
//                                 mycoords[g.source(*i)])/2.0;
914 914

	
915 915
//            m=dim2::Point<double>(mycoords[g.source(*i)])+
916 916
//             dvec*(double(_nodeSizes[g.source(*i)])/
917 917
//                (_nodeSizes[g.source(*i)]+_nodeSizes[g.target(*i)]));
918 918

	
919 919
          m=dim2::Point<double>(mycoords[g.source(*i)])+
920 920
            d*(l+_nodeSizes[g.source(*i)]-_nodeSizes[g.target(*i)])/2.0;
921 921

	
922 922
          for(typename std::vector<Arc>::iterator e=i;e!=j;++e) {
923 923
            sw+=_arcWidths[*e]*_arcWidthScale/2.0;
924 924
            dim2::Point<double> mm=m+rot90(d)*sw/.75;
925 925
            if(_drawArrows) {
926 926
              int node_shape;
927 927
              dim2::Point<double> s=mycoords[g.source(*e)];
928 928
              dim2::Point<double> t=mycoords[g.target(*e)];
929 929
              double rn=_nodeSizes[g.target(*e)]*_nodeScale;
930 930
              node_shape=_nodeShapes[g.target(*e)];
931 931
              dim2::Bezier3 bez(s,mm,mm,t);
932 932
              double t1=0,t2=1;
933 933
              for(int ii=0;ii<INTERPOL_PREC;++ii)
934 934
                if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape)) t2=(t1+t2)/2;
935 935
                else t1=(t1+t2)/2;
936 936
              dim2::Point<double> apoint=bez((t1+t2)/2);
937 937
              rn = _arrowLength+_arcWidths[*e]*_arcWidthScale;
938 938
              rn*=rn;
939 939
              t2=(t1+t2)/2;t1=0;
940 940
              for(int ii=0;ii<INTERPOL_PREC;++ii)
941 941
                if((bez((t1+t2)/2)-apoint).normSquare()>rn) t1=(t1+t2)/2;
942 942
                else t2=(t1+t2)/2;
943 943
              dim2::Point<double> linend=bez((t1+t2)/2);
944 944
              bez=bez.before((t1+t2)/2);
945 945
//               rn=_nodeSizes[g.source(*e)]*_nodeScale;
946 946
//               node_shape=_nodeShapes[g.source(*e)];
947 947
//               t1=0;t2=1;
948 948
//               for(int i=0;i<INTERPOL_PREC;++i)
949 949
//                 if(isInsideNode(bez((t1+t2)/2)-t,rn,node_shape))
950 950
//                   t1=(t1+t2)/2;
951 951
//                 else t2=(t1+t2)/2;
952 952
//               bez=bez.after((t1+t2)/2);
953 953
              os << _arcWidths[*e]*_arcWidthScale << " setlinewidth "
954 954
                 << _arcColors[*e].red() << ' '
955 955
                 << _arcColors[*e].green() << ' '
956 956
                 << _arcColors[*e].blue() << " setrgbcolor newpath\n"
957 957
                 << bez.p1.x << ' ' <<  bez.p1.y << " moveto\n"
958 958
                 << bez.p2.x << ' ' << bez.p2.y << ' '
959 959
                 << bez.p3.x << ' ' << bez.p3.y << ' '
960 960
                 << bez.p4.x << ' ' << bez.p4.y << " curveto stroke\n";
961 961
              dim2::Point<double> dd(rot90(linend-apoint));
962 962
              dd*=(.5*_arcWidths[*e]*_arcWidthScale+_arrowWidth)/
963 963
                std::sqrt(dd.normSquare());
964 964
              os << "newpath " << psOut(apoint) << " moveto "
965 965
                 << psOut(linend+dd) << " lineto "
966 966
                 << psOut(linend-dd) << " lineto closepath fill\n";
967 967
            }
968 968
            else {
969 969
              os << mycoords[g.source(*e)].x << ' '
970 970
                 << mycoords[g.source(*e)].y << ' '
971 971
                 << mm.x << ' ' << mm.y << ' '
972 972
                 << mycoords[g.target(*e)].x << ' '
973 973
                 << mycoords[g.target(*e)].y << ' '
974 974
                 << _arcColors[*e].red() << ' '
975 975
                 << _arcColors[*e].green() << ' '
976 976
                 << _arcColors[*e].blue() << ' '
977 977
                 << _arcWidths[*e]*_arcWidthScale << " lb\n";
978 978
            }
979 979
            sw+=_arcWidths[*e]*_arcWidthScale/2.0+_parArcDist;
980 980
          }
981 981
        }
982 982
      }
983 983
      else for(ArcIt e(g);e!=INVALID;++e)
984 984
        if((!_undirected||g.source(e)<g.target(e))&&_arcWidths[e]>0
985 985
           &&g.source(e)!=g.target(e)) {
986 986
          if(_drawArrows) {
987 987
            dim2::Point<double> d(mycoords[g.target(e)]-mycoords[g.source(e)]);
988 988
            double rn=_nodeSizes[g.target(e)]*_nodeScale;
989 989
            int node_shape=_nodeShapes[g.target(e)];
990 990
            double t1=0,t2=1;
991 991
            for(int i=0;i<INTERPOL_PREC;++i)
992 992
              if(isInsideNode((-(t1+t2)/2)*d,rn,node_shape)) t1=(t1+t2)/2;
993 993
              else t2=(t1+t2)/2;
994 994
            double l=std::sqrt(d.normSquare());
995 995
            d/=l;
996 996

	
997 997
            os << l*(1-(t1+t2)/2) << ' '
998 998
               << _arcWidths[e]*_arcWidthScale << ' '
999 999
               << d.x << ' ' << d.y << ' '
1000 1000
               << mycoords[g.source(e)].x << ' '
1001 1001
               << mycoords[g.source(e)].y << ' '
1002 1002
               << _arcColors[e].red() << ' '
1003 1003
               << _arcColors[e].green() << ' '
1004 1004
               << _arcColors[e].blue() << " arr\n";
1005 1005
          }
1006 1006
          else os << mycoords[g.source(e)].x << ' '
1007 1007
                  << mycoords[g.source(e)].y << ' '
1008 1008
                  << mycoords[g.target(e)].x << ' '
1009 1009
                  << mycoords[g.target(e)].y << ' '
1010 1010
                  << _arcColors[e].red() << ' '
1011 1011
                  << _arcColors[e].green() << ' '
1012 1012
                  << _arcColors[e].blue() << ' '
1013 1013
                  << _arcWidths[e]*_arcWidthScale << " l\n";
1014 1014
        }
1015 1015
      os << "grestore\n";
1016 1016
    }
1017 1017
    if(_showNodes) {
1018 1018
      os << "%Nodes:\ngsave\n";
1019 1019
      for(NodeIt n(g);n!=INVALID;++n) {
1020 1020
        os << mycoords[n].x << ' ' << mycoords[n].y << ' '
1021 1021
           << _nodeSizes[n]*_nodeScale << ' '
1022 1022
           << _nodeColors[n].red() << ' '
1023 1023
           << _nodeColors[n].green() << ' '
1024 1024
           << _nodeColors[n].blue() << ' ';
1025 1025
        switch(_nodeShapes[n]) {
1026 1026
        case CIRCLE:
1027 1027
          os<< "nc";break;
1028 1028
        case SQUARE:
1029 1029
          os<< "nsq";break;
1030 1030
        case DIAMOND:
1031 1031
          os<< "ndi";break;
1032 1032
        case MALE:
1033 1033
          os<< "nmale";break;
1034 1034
        case FEMALE:
1035 1035
          os<< "nfemale";break;
1036 1036
        }
1037 1037
        os<<'\n';
1038 1038
      }
1039 1039
      os << "grestore\n";
1040 1040
    }
1041 1041
    if(_showNodeText) {
1042 1042
      os << "%Node texts:\ngsave\n";
1043 1043
      os << "/fosi " << _nodeTextSize << " def\n";
1044 1044
      os << "(Helvetica) findfont fosi scalefont setfont\n";
1045 1045
      for(NodeIt n(g);n!=INVALID;++n) {
1046 1046
        switch(_nodeTextColorType) {
1047 1047
        case DIST_COL:
1048 1048
          os << psOut(distantColor(_nodeColors[n])) << " setrgbcolor\n";
1049 1049
          break;
1050 1050
        case DIST_BW:
1051 1051
          os << psOut(distantBW(_nodeColors[n])) << " setrgbcolor\n";
1052 1052
          break;
1053 1053
        case CUST_COL:
1054 1054
          os << psOut(distantColor(_nodeTextColors[n])) << " setrgbcolor\n";
1055 1055
          break;
1056 1056
        default:
1057 1057
          os << "0 0 0 setrgbcolor\n";
1058 1058
        }
1059 1059
        os << mycoords[n].x << ' ' << mycoords[n].y
1060 1060
           << " (" << _nodeTexts[n] << ") cshow\n";
1061 1061
      }
1062 1062
      os << "grestore\n";
1063 1063
    }
1064 1064
    if(_showNodePsText) {
1065 1065
      os << "%Node PS blocks:\ngsave\n";
1066 1066
      for(NodeIt n(g);n!=INVALID;++n)
1067 1067
        os << mycoords[n].x << ' ' << mycoords[n].y
1068 1068
           << " moveto\n" << _nodePsTexts[n] << "\n";
1069 1069
      os << "grestore\n";
1070 1070
    }
1071 1071

	
1072 1072
    os << "grestore\nshowpage\n";
1073 1073

	
1074 1074
    //CleanUp:
1075 1075
    if(_pleaseRemoveOsStream) {delete &os;}
1076 1076
  }
1077 1077

	
1078 1078
  ///\name Aliases
1079 1079
  ///These are just some aliases to other parameter setting functions.
1080 1080

	
1081 1081
  ///@{
1082 1082

	
1083 1083
  ///An alias for arcWidths()
1084 1084
  template<class X> GraphToEps<ArcWidthsTraits<X> > edgeWidths(const X &x)
1085 1085
  {
1086 1086
    return arcWidths(x);
1087 1087
  }
1088 1088

	
1089 1089
  ///An alias for arcColors()
1090 1090
  template<class X> GraphToEps<ArcColorsTraits<X> >
1091 1091
  edgeColors(const X &x)
1092 1092
  {
1093 1093
    return arcColors(x);
1094 1094
  }
1095 1095

	
1096 1096
  ///An alias for arcWidthScale()
1097 1097
  GraphToEps<T> &edgeWidthScale(double d) {return arcWidthScale(d);}
1098 1098

	
1099 1099
  ///An alias for autoArcWidthScale()
1100 1100
  GraphToEps<T> &autoEdgeWidthScale(bool b=true)
1101 1101
  {
1102 1102
    return autoArcWidthScale(b);
1103 1103
  }
1104 1104

	
1105 1105
  ///An alias for absoluteArcWidths()
1106 1106
  GraphToEps<T> &absoluteEdgeWidths(bool b=true)
1107 1107
  {
1108 1108
    return absoluteArcWidths(b);
1109 1109
  }
1110 1110

	
1111 1111
  ///An alias for parArcDist()
1112 1112
  GraphToEps<T> &parEdgeDist(double d) {return parArcDist(d);}
1113 1113

	
1114 1114
  ///An alias for hideArcs()
1115 1115
  GraphToEps<T> &hideEdges(bool b=true) {return hideArcs(b);}
1116 1116

	
1117 1117
  ///@}
1118 1118
};
1119 1119

	
1120 1120
template<class T>
1121 1121
const int GraphToEps<T>::INTERPOL_PREC = 20;
1122 1122
template<class T>
1123 1123
const double GraphToEps<T>::A4HEIGHT = 841.8897637795276;
1124 1124
template<class T>
1125 1125
const double GraphToEps<T>::A4WIDTH  = 595.275590551181;
1126 1126
template<class T>
1127 1127
const double GraphToEps<T>::A4BORDER = 15;
1128 1128

	
1129 1129

	
1130 1130
///Generates an EPS file from a graph
1131 1131

	
1132 1132
///\ingroup eps_io
1133 1133
///Generates an EPS file from a graph.
1134 1134
///\param g Reference to the graph to be printed.
1135 1135
///\param os Reference to the output stream.
1136 1136
///By default it is <tt>std::cout</tt>.
1137 1137
///
1138 1138
///This function also has a lot of
1139 1139
///\ref named-templ-func-param "named parameters",
1140 1140
///they are declared as the members of class \ref GraphToEps. The following
1141 1141
///example shows how to use these parameters.
1142 1142
///\code
1143 1143
/// graphToEps(g,os).scale(10).coords(coords)
1144 1144
///              .nodeScale(2).nodeSizes(sizes)
1145 1145
///              .arcWidthScale(.4).run();
Ignore white space 768 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <lemon/dim2.h>
20 20
#include <iostream>
21 21
#include "test_tools.h"
22 22

	
23 23
using namespace std;
24 24
using namespace lemon;
25 25

	
26 26
int main()
27 27
{
28 28
  typedef dim2::Point<int> Point;
29 29

	
30 30
  Point p;
31 31
  check(p.size()==2, "Wrong dim2::Point initialization.");
32 32

	
33 33
  Point a(1,2);
34 34
  Point b(3,4);
35 35
  check(a[0]==1 && a[1]==2, "Wrong dim2::Point initialization.");
36 36

	
37 37
  p = a+b;
38 38
  check(p.x==4 && p.y==6, "Wrong dim2::Point addition.");
39 39

	
40 40
  p = a-b;
41 41
  check(p.x==-2 && p.y==-2, "Wrong dim2::Point subtraction.");
42 42

	
43 43
  check(a.normSquare()==5,"Wrong dim2::Point norm calculation.");
44 44
  check(a*b==11, "Wrong dim2::Point scalar product.");
45 45

	
46 46
  int l=2;
47 47
  p = a*l;
48 48
  check(p.x==2 && p.y==4, "Wrong dim2::Point multiplication by a scalar.");
49 49

	
50 50
  p = b/l;
51 51
  check(p.x==1 && p.y==2, "Wrong dim2::Point division by a scalar.");
52 52

	
53
  typedef dim2::BoundingBox<int> BB;
54
  BB box1;
55
  check(box1.empty(), "Wrong empty() in dim2::BoundingBox.");
53
  typedef dim2::Box<int> Box;
54
  Box box1;
55
  check(box1.empty(), "Wrong empty() in dim2::Box.");
56 56

	
57 57
  box1.add(a);
58
  check(!box1.empty(), "Wrong empty() in dim2::BoundingBox.");
58
  check(!box1.empty(), "Wrong empty() in dim2::Box.");
59 59
  box1.add(b);
60 60

	
61 61
  check(box1.left()==1 && box1.bottom()==2 &&
62 62
        box1.right()==3 && box1.top()==4,
63
        "Wrong addition of points to dim2::BoundingBox.");
63
        "Wrong addition of points to dim2::Box.");
64 64

	
65
  check(box1.inside(Point(2,3)), "Wrong inside() in dim2::BoundingBox.");
66
  check(box1.inside(Point(1,3)), "Wrong inside() in dim2::BoundingBox.");
67
  check(!box1.inside(Point(0,3)), "Wrong inside() in dim2::BoundingBox.");
65
  check(box1.inside(Point(2,3)), "Wrong inside() in dim2::Box.");
66
  check(box1.inside(Point(1,3)), "Wrong inside() in dim2::Box.");
67
  check(!box1.inside(Point(0,3)), "Wrong inside() in dim2::Box.");
68 68

	
69
  BB box2(Point(2,2));
70
  check(!box2.empty(), "Wrong empty() in dim2::BoundingBox.");
71
  
69
  Box box2(Point(2,2));
70
  check(!box2.empty(), "Wrong empty() in dim2::Box.");
71

	
72 72
  box2.bottomLeft(Point(2,0));
73 73
  box2.topRight(Point(5,3));
74
  BB box3 = box1 & box2;
74
  Box box3 = box1 & box2;
75 75
  check(!box3.empty() &&
76
        box3.left()==2 && box3.bottom()==2 && 
76
        box3.left()==2 && box3.bottom()==2 &&
77 77
        box3.right()==3 && box3.top()==3,
78
        "Wrong intersection of two dim2::BoundingBox objects.");
79
  
78
        "Wrong intersection of two dim2::Box objects.");
79

	
80 80
  box1.add(box2);
81 81
  check(!box1.empty() &&
82 82
        box1.left()==1 && box1.bottom()==0 &&
83 83
        box1.right()==5 && box1.top()==4,
84
        "Wrong addition of two dim2::BoundingBox objects.");
84
        "Wrong addition of two dim2::Box objects.");
85 85

	
86 86
  return 0;
87 87
}
0 comments (0 inline)