# HG changeset patch # User Alpar Juttner <alpar@cs.elte.hu> # Date 1235162593 0 # Node ID b1ef32ab39f33df3e5a5da7049a608a41aaab09b # Parent 7d7d9debb29a2e94e0e4056c5e96d54be9d64c3f# Parent afd1341421112fa7bdf3f139cc0d040952611985 Merge diff -r 7d7d9debb29a -r b1ef32ab39f3 lemon/lgf_reader.h --- a/lemon/lgf_reader.h Fri Feb 20 18:06:10 2009 +0000 +++ b/lemon/lgf_reader.h Fri Feb 20 20:43:13 2009 +0000 @@ -390,37 +390,13 @@ template <typename Digraph> class DigraphReader; - /// \brief Return a \ref DigraphReader class - /// - /// This function just returns a \ref DigraphReader class. - /// \relates DigraphReader template <typename Digraph> - DigraphReader<Digraph> digraphReader(Digraph& digraph, - std::istream& is = std::cin) { - DigraphReader<Digraph> tmp(digraph, is); - return tmp; - } - - /// \brief Return a \ref DigraphReader class - /// - /// This function just returns a \ref DigraphReader class. - /// \relates DigraphReader + DigraphReader<Digraph> digraphReader(Digraph& digraph, + std::istream& is = std::cin); template <typename Digraph> - DigraphReader<Digraph> digraphReader(Digraph& digraph, - const std::string& fn) { - DigraphReader<Digraph> tmp(digraph, fn); - return tmp; - } - - /// \brief Return a \ref DigraphReader class - /// - /// This function just returns a \ref DigraphReader class. - /// \relates DigraphReader + DigraphReader<Digraph> digraphReader(Digraph& digraph, const std::string& fn); template <typename Digraph> - DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) { - DigraphReader<Digraph> tmp(digraph, fn); - return tmp; - } + DigraphReader<Digraph> digraphReader(Digraph& digraph, const char *fn); /// \ingroup lemon_io /// @@ -584,12 +560,13 @@ private: - friend DigraphReader<Digraph> digraphReader<>(Digraph& digraph, - std::istream& is); - friend DigraphReader<Digraph> digraphReader<>(Digraph& digraph, - const std::string& fn); - friend DigraphReader<Digraph> digraphReader<>(Digraph& digraph, - const char *fn); + template <typename DGR> + friend DigraphReader<DGR> digraphReader(DGR& digraph, std::istream& is); + template <typename DGR> + friend DigraphReader<DGR> digraphReader(DGR& digraph, + const std::string& fn); + template <typename DGR> + friend DigraphReader<DGR> digraphReader(DGR& digraph, const char *fn); DigraphReader(DigraphReader& other) : _is(other._is), local_is(other.local_is), _digraph(other._digraph), @@ -1210,38 +1187,47 @@ }; + /// \brief Return a \ref DigraphReader class + /// + /// This function just returns a \ref DigraphReader class. + /// \relates DigraphReader + template <typename Digraph> + DigraphReader<Digraph> digraphReader(Digraph& digraph, std::istream& is) { + DigraphReader<Digraph> tmp(digraph, is); + return tmp; + } + + /// \brief Return a \ref DigraphReader class + /// + /// This function just returns a \ref DigraphReader class. + /// \relates DigraphReader + template <typename Digraph> + DigraphReader<Digraph> digraphReader(Digraph& digraph, + const std::string& fn) { + DigraphReader<Digraph> tmp(digraph, fn); + return tmp; + } + + /// \brief Return a \ref DigraphReader class + /// + /// This function just returns a \ref DigraphReader class. + /// \relates DigraphReader + template <typename Digraph> + DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) { + DigraphReader<Digraph> tmp(digraph, fn); + return tmp; + } + template <typename Graph> class GraphReader; - - /// \brief Return a \ref GraphReader class - /// - /// This function just returns a \ref GraphReader class. - /// \relates GraphReader + template <typename Graph> - GraphReader<Graph> graphReader(Graph& graph, std::istream& is = std::cin) { - GraphReader<Graph> tmp(graph, is); - return tmp; - } - - /// \brief Return a \ref GraphReader class - /// - /// This function just returns a \ref GraphReader class. - /// \relates GraphReader + GraphReader<Graph> graphReader(Graph& graph, + std::istream& is = std::cin); template <typename Graph> - GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) { - GraphReader<Graph> tmp(graph, fn); - return tmp; - } - - /// \brief Return a \ref GraphReader class - /// - /// This function just returns a \ref GraphReader class. - /// \relates GraphReader + GraphReader<Graph> graphReader(Graph& graph, const std::string& fn); template <typename Graph> - GraphReader<Graph> graphReader(Graph& graph, const char* fn) { - GraphReader<Graph> tmp(graph, fn); - return tmp; - } + GraphReader<Graph> graphReader(Graph& graph, const char *fn); /// \ingroup lemon_io /// @@ -1368,10 +1354,12 @@ } private: - friend GraphReader<Graph> graphReader<>(Graph& graph, std::istream& is); - friend GraphReader<Graph> graphReader<>(Graph& graph, - const std::string& fn); - friend GraphReader<Graph> graphReader<>(Graph& graph, const char *fn); + template <typename GR> + friend GraphReader<GR> graphReader(GR& graph, std::istream& is); + template <typename GR> + friend GraphReader<GR> graphReader(GR& graph, const std::string& fn); + template <typename GR> + friend GraphReader<GR> graphReader(GR& graph, const char *fn); GraphReader(GraphReader& other) : _is(other._is), local_is(other.local_is), _graph(other._graph), @@ -2040,6 +2028,36 @@ }; + /// \brief Return a \ref GraphReader class + /// + /// This function just returns a \ref GraphReader class. + /// \relates GraphReader + template <typename Graph> + GraphReader<Graph> graphReader(Graph& graph, std::istream& is) { + GraphReader<Graph> tmp(graph, is); + return tmp; + } + + /// \brief Return a \ref GraphReader class + /// + /// This function just returns a \ref GraphReader class. + /// \relates GraphReader + template <typename Graph> + GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) { + GraphReader<Graph> tmp(graph, fn); + return tmp; + } + + /// \brief Return a \ref GraphReader class + /// + /// This function just returns a \ref GraphReader class. + /// \relates GraphReader + template <typename Graph> + GraphReader<Graph> graphReader(Graph& graph, const char* fn) { + GraphReader<Graph> tmp(graph, fn); + return tmp; + } + class SectionReader; SectionReader sectionReader(std::istream& is); diff -r 7d7d9debb29a -r b1ef32ab39f3 lemon/lgf_writer.h --- a/lemon/lgf_writer.h Fri Feb 20 18:06:10 2009 +0000 +++ b/lemon/lgf_writer.h Fri Feb 20 20:43:13 2009 +0000 @@ -350,38 +350,17 @@ template <typename Digraph> class DigraphWriter; - /// \brief Return a \ref DigraphWriter class - /// - /// This function just returns a \ref DigraphWriter class. - /// \relates DigraphWriter template <typename Digraph> DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, - std::ostream& os = std::cout) { - DigraphWriter<Digraph> tmp(digraph, os); - return tmp; - } - - /// \brief Return a \ref DigraphWriter class - /// - /// This function just returns a \ref DigraphWriter class. - /// \relates DigraphWriter + std::ostream& os = std::cout); template <typename Digraph> DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, - const std::string& fn) { - DigraphWriter<Digraph> tmp(digraph, fn); - return tmp; - } + const std::string& fn); - /// \brief Return a \ref DigraphWriter class - /// - /// This function just returns a \ref DigraphWriter class. - /// \relates DigraphWriter template <typename Digraph> DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, - const char* fn) { - DigraphWriter<Digraph> tmp(digraph, fn); - return tmp; - } + const char* fn); + /// \ingroup lemon_io /// @@ -526,12 +505,15 @@ private: - friend DigraphWriter<Digraph> digraphWriter<>(const Digraph& digraph, - std::ostream& os); - friend DigraphWriter<Digraph> digraphWriter<>(const Digraph& digraph, - const std::string& fn); - friend DigraphWriter<Digraph> digraphWriter<>(const Digraph& digraph, - const char *fn); + template <typename DGR> + friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, + std::ostream& os); + template <typename DGR> + friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, + const std::string& fn); + template <typename DGR> + friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, + const char *fn); DigraphWriter(DigraphWriter& other) : _os(other._os), local_os(other.local_os), _digraph(other._digraph), @@ -933,39 +915,49 @@ /// @} }; + /// \brief Return a \ref DigraphWriter class + /// + /// This function just returns a \ref DigraphWriter class. + /// \relates DigraphWriter + template <typename Digraph> + DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, + std::ostream& os) { + DigraphWriter<Digraph> tmp(digraph, os); + return tmp; + } + + /// \brief Return a \ref DigraphWriter class + /// + /// This function just returns a \ref DigraphWriter class. + /// \relates DigraphWriter + template <typename Digraph> + DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, + const std::string& fn) { + DigraphWriter<Digraph> tmp(digraph, fn); + return tmp; + } + + /// \brief Return a \ref DigraphWriter class + /// + /// This function just returns a \ref DigraphWriter class. + /// \relates DigraphWriter + template <typename Digraph> + DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, + const char* fn) { + DigraphWriter<Digraph> tmp(digraph, fn); + return tmp; + } + template <typename Graph> class GraphWriter; - /// \brief Return a \ref GraphWriter class - /// - /// This function just returns a \ref GraphWriter class. - /// \relates GraphWriter template <typename Graph> GraphWriter<Graph> graphWriter(const Graph& graph, - std::ostream& os = std::cout) { - GraphWriter<Graph> tmp(graph, os); - return tmp; - } - - /// \brief Return a \ref GraphWriter class - /// - /// This function just returns a \ref GraphWriter class. - /// \relates GraphWriter + std::ostream& os = std::cout); template <typename Graph> - GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn) { - GraphWriter<Graph> tmp(graph, fn); - return tmp; - } - - /// \brief Return a \ref GraphWriter class - /// - /// This function just returns a \ref GraphWriter class. - /// \relates GraphWriter + GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn); template <typename Graph> - GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn) { - GraphWriter<Graph> tmp(graph, fn); - return tmp; - } + GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn); /// \ingroup lemon_io /// @@ -1081,13 +1073,16 @@ private: - friend GraphWriter<Graph> graphWriter<>(const Graph& graph, - std::ostream& os); - friend GraphWriter<Graph> graphWriter<>(const Graph& graph, - const std::string& fn); - friend GraphWriter<Graph> graphWriter<>(const Graph& graph, - const char *fn); - + template <typename GR> + friend GraphWriter<GR> graphWriter(const GR& graph, + std::ostream& os); + template <typename GR> + friend GraphWriter<GR> graphWriter(const GR& graph, + const std::string& fn); + template <typename GR> + friend GraphWriter<GR> graphWriter(const GR& graph, + const char *fn); + GraphWriter(GraphWriter& other) : _os(other._os), local_os(other.local_os), _graph(other._graph), _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) { @@ -1534,6 +1529,37 @@ /// @} }; + /// \brief Return a \ref GraphWriter class + /// + /// This function just returns a \ref GraphWriter class. + /// \relates GraphWriter + template <typename Graph> + GraphWriter<Graph> graphWriter(const Graph& graph, + std::ostream& os) { + GraphWriter<Graph> tmp(graph, os); + return tmp; + } + + /// \brief Return a \ref GraphWriter class + /// + /// This function just returns a \ref GraphWriter class. + /// \relates GraphWriter + template <typename Graph> + GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn) { + GraphWriter<Graph> tmp(graph, fn); + return tmp; + } + + /// \brief Return a \ref GraphWriter class + /// + /// This function just returns a \ref GraphWriter class. + /// \relates GraphWriter + template <typename Graph> + GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn) { + GraphWriter<Graph> tmp(graph, fn); + return tmp; + } + class SectionWriter; SectionWriter sectionWriter(std::istream& is); diff -r 7d7d9debb29a -r b1ef32ab39f3 lemon/path.h --- a/lemon/path.h Fri Feb 20 18:06:10 2009 +0000 +++ b/lemon/path.h Fri Feb 20 20:43:13 2009 +0000 @@ -929,9 +929,8 @@ }; template <typename Target, typename Source, - bool buildEnable = BuildTagIndicator<Target>::value, - bool revEnable = RevPathTagIndicator<Source>::value> - struct PathCopySelector { + bool buildEnable = BuildTagIndicator<Target>::value> + struct PathCopySelectorForward { static void copy(Target& target, const Source& source) { target.clear(); for (typename Source::ArcIt it(source); it != INVALID; ++it) { @@ -941,7 +940,16 @@ }; template <typename Target, typename Source> - struct PathCopySelector<Target, Source, false, true> { + struct PathCopySelectorForward<Target, Source, true> { + static void copy(Target& target, const Source& source) { + target.clear(); + target.build(source); + } + }; + + template <typename Target, typename Source, + bool buildEnable = BuildTagIndicator<Target>::value> + struct PathCopySelectorBackward { static void copy(Target& target, const Source& source) { target.clear(); for (typename Source::RevArcIt it(source); it != INVALID; ++it) { @@ -951,21 +959,29 @@ }; template <typename Target, typename Source> - struct PathCopySelector<Target, Source, true, false> { - static void copy(Target& target, const Source& source) { - target.clear(); - target.build(source); - } - }; - - template <typename Target, typename Source> - struct PathCopySelector<Target, Source, true, true> { + struct PathCopySelectorBackward<Target, Source, true> { static void copy(Target& target, const Source& source) { target.clear(); target.buildRev(source); } }; + + template <typename Target, typename Source, + bool revEnable = RevPathTagIndicator<Source>::value> + struct PathCopySelector { + static void copy(Target& target, const Source& source) { + PathCopySelectorForward<Target, Source>::copy(target, source); + } + }; + + template <typename Target, typename Source> + struct PathCopySelector<Target, Source, true> { + static void copy(Target& target, const Source& source) { + PathCopySelectorBackward<Target, Source>::copy(target, source); + } + }; + } diff -r 7d7d9debb29a -r b1ef32ab39f3 lemon/random.h --- a/lemon/random.h Fri Feb 20 18:06:10 2009 +0000 +++ b/lemon/random.h Fri Feb 20 20:43:13 2009 +0000 @@ -344,56 +344,46 @@ } }; - template <typename Result, int exp, bool pos = (exp >= 0)> + template <typename Result, int exp> struct ShiftMultiplier { static const Result multiplier() { Result res = ShiftMultiplier<Result, exp / 2>::multiplier(); res *= res; - if ((exp & 1) == 1) res *= static_cast<Result>(2.0); - return res; - } - }; - - template <typename Result, int exp> - struct ShiftMultiplier<Result, exp, false> { - static const Result multiplier() { - Result res = ShiftMultiplier<Result, exp / 2>::multiplier(); - res *= res; if ((exp & 1) == 1) res *= static_cast<Result>(0.5); return res; } }; template <typename Result> - struct ShiftMultiplier<Result, 0, true> { + struct ShiftMultiplier<Result, 0> { static const Result multiplier() { return static_cast<Result>(1.0); } }; template <typename Result> - struct ShiftMultiplier<Result, -20, true> { + struct ShiftMultiplier<Result, 20> { static const Result multiplier() { return static_cast<Result>(1.0/1048576.0); } }; template <typename Result> - struct ShiftMultiplier<Result, -32, true> { + struct ShiftMultiplier<Result, 32> { static const Result multiplier() { - return static_cast<Result>(1.0/424967296.0); + return static_cast<Result>(1.0/4294967296.0); } }; template <typename Result> - struct ShiftMultiplier<Result, -53, true> { + struct ShiftMultiplier<Result, 53> { static const Result multiplier() { return static_cast<Result>(1.0/9007199254740992.0); } }; template <typename Result> - struct ShiftMultiplier<Result, -64, true> { + struct ShiftMultiplier<Result, 64> { static const Result multiplier() { return static_cast<Result>(1.0/18446744073709551616.0); } @@ -413,7 +403,7 @@ static const int bits = std::numeric_limits<Word>::digits; static Result convert(RandomCore<Word>& rnd) { - return Shifting<Result, - shift - rest>:: + return Shifting<Result, shift + rest>:: shift(static_cast<Result>(rnd() >> (bits - rest))); } }; @@ -423,7 +413,7 @@ static const int bits = std::numeric_limits<Word>::digits; static Result convert(RandomCore<Word>& rnd) { - return Shifting<Result, - shift - bits>:: + return Shifting<Result, shift + bits>:: shift(static_cast<Result>(rnd())) + RealConversion<Result, Word, rest-bits, shift + bits>:: convert(rnd);