# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1235151635 -3600
# Node ID 794458e325590c011cda01b4b98f9bf6eba7b4b4
# Parent 879c55700cd4bf2903772de56606fc0aa6e99710
Various fixes for compiling on AIX (#211, #212)
diff --git a/lemon/lgf_reader.h b/lemon/lgf_reader.h
a
|
b
|
|
390 | 390 | template <typename Digraph> |
391 | 391 | class DigraphReader; |
392 | 392 | |
393 | | /// \brief Return a \ref DigraphReader class |
394 | | /// |
395 | | /// This function just returns a \ref DigraphReader class. |
396 | | /// \relates DigraphReader |
397 | 393 | template <typename Digraph> |
398 | | DigraphReader<Digraph> digraphReader(Digraph& digraph, |
399 | | std::istream& is = std::cin) { |
400 | | DigraphReader<Digraph> tmp(digraph, is); |
401 | | return tmp; |
402 | | } |
403 | | |
404 | | /// \brief Return a \ref DigraphReader class |
405 | | /// |
406 | | /// This function just returns a \ref DigraphReader class. |
407 | | /// \relates DigraphReader |
| 394 | DigraphReader<Digraph> digraphReader(Digraph& digraph, |
| 395 | std::istream& is = std::cin); |
408 | 396 | template <typename Digraph> |
409 | | DigraphReader<Digraph> digraphReader(Digraph& digraph, |
410 | | const std::string& fn) { |
411 | | DigraphReader<Digraph> tmp(digraph, fn); |
412 | | return tmp; |
413 | | } |
414 | | |
415 | | /// \brief Return a \ref DigraphReader class |
416 | | /// |
417 | | /// This function just returns a \ref DigraphReader class. |
418 | | /// \relates DigraphReader |
| 397 | DigraphReader<Digraph> digraphReader(Digraph& digraph, const std::string& fn); |
419 | 398 | template <typename Digraph> |
420 | | DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) { |
421 | | DigraphReader<Digraph> tmp(digraph, fn); |
422 | | return tmp; |
423 | | } |
| 399 | DigraphReader<Digraph> digraphReader(Digraph& digraph, const char *fn); |
424 | 400 | |
425 | 401 | /// \ingroup lemon_io |
426 | 402 | /// |
… |
… |
|
584 | 560 | |
585 | 561 | private: |
586 | 562 | |
587 | | friend DigraphReader<Digraph> digraphReader<>(Digraph& digraph, |
588 | | std::istream& is); |
589 | | friend DigraphReader<Digraph> digraphReader<>(Digraph& digraph, |
590 | | const std::string& fn); |
591 | | friend DigraphReader<Digraph> digraphReader<>(Digraph& digraph, |
592 | | const char *fn); |
| 563 | template <typename DGR> |
| 564 | friend DigraphReader<DGR> digraphReader(DGR& digraph, std::istream& is); |
| 565 | template <typename DGR> |
| 566 | friend DigraphReader<DGR> digraphReader(DGR& digraph, |
| 567 | const std::string& fn); |
| 568 | template <typename DGR> |
| 569 | friend DigraphReader<DGR> digraphReader(DGR& digraph, const char *fn); |
593 | 570 | |
594 | 571 | DigraphReader(DigraphReader& other) |
595 | 572 | : _is(other._is), local_is(other.local_is), _digraph(other._digraph), |
… |
… |
|
870 | 847 | while (readSuccess() && line >> c && c != '@') { |
871 | 848 | readLine(); |
872 | 849 | } |
873 | | line.putback(c); |
| 850 | if (readSuccess()) { |
| 851 | line.putback(c); |
| 852 | } |
874 | 853 | } |
875 | 854 | |
876 | 855 | void readNodes() { |
… |
… |
|
1210 | 1189 | |
1211 | 1190 | }; |
1212 | 1191 | |
1213 | | template <typename Graph> |
1214 | | class GraphReader; |
1215 | | |
1216 | | /// \brief Return a \ref GraphReader class |
| 1192 | /// \brief Return a \ref DigraphReader class |
1217 | 1193 | /// |
1218 | | /// This function just returns a \ref GraphReader class. |
1219 | | /// \relates GraphReader |
1220 | | template <typename Graph> |
1221 | | GraphReader<Graph> graphReader(Graph& graph, std::istream& is = std::cin) { |
1222 | | GraphReader<Graph> tmp(graph, is); |
| 1194 | /// This function just returns a \ref DigraphReader class. |
| 1195 | /// \relates DigraphReader |
| 1196 | template <typename Digraph> |
| 1197 | DigraphReader<Digraph> digraphReader(Digraph& digraph, std::istream& is) { |
| 1198 | DigraphReader<Digraph> tmp(digraph, is); |
1223 | 1199 | return tmp; |
1224 | 1200 | } |
1225 | 1201 | |
1226 | | /// \brief Return a \ref GraphReader class |
| 1202 | /// \brief Return a \ref DigraphReader class |
1227 | 1203 | /// |
1228 | | /// This function just returns a \ref GraphReader class. |
1229 | | /// \relates GraphReader |
1230 | | template <typename Graph> |
1231 | | GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) { |
1232 | | GraphReader<Graph> tmp(graph, fn); |
| 1204 | /// This function just returns a \ref DigraphReader class. |
| 1205 | /// \relates DigraphReader |
| 1206 | template <typename Digraph> |
| 1207 | DigraphReader<Digraph> digraphReader(Digraph& digraph, |
| 1208 | const std::string& fn) { |
| 1209 | DigraphReader<Digraph> tmp(digraph, fn); |
1233 | 1210 | return tmp; |
1234 | 1211 | } |
1235 | 1212 | |
1236 | | /// \brief Return a \ref GraphReader class |
| 1213 | /// \brief Return a \ref DigraphReader class |
1237 | 1214 | /// |
1238 | | /// This function just returns a \ref GraphReader class. |
1239 | | /// \relates GraphReader |
1240 | | template <typename Graph> |
1241 | | GraphReader<Graph> graphReader(Graph& graph, const char* fn) { |
1242 | | GraphReader<Graph> tmp(graph, fn); |
| 1215 | /// This function just returns a \ref DigraphReader class. |
| 1216 | /// \relates DigraphReader |
| 1217 | template <typename Digraph> |
| 1218 | DigraphReader<Digraph> digraphReader(Digraph& digraph, const char* fn) { |
| 1219 | DigraphReader<Digraph> tmp(digraph, fn); |
1243 | 1220 | return tmp; |
1244 | 1221 | } |
1245 | 1222 | |
| 1223 | template <typename Graph> |
| 1224 | class GraphReader; |
| 1225 | |
| 1226 | template <typename Graph> |
| 1227 | GraphReader<Graph> graphReader(Graph& graph, |
| 1228 | std::istream& is = std::cin); |
| 1229 | template <typename Graph> |
| 1230 | GraphReader<Graph> graphReader(Graph& graph, const std::string& fn); |
| 1231 | template <typename Graph> |
| 1232 | GraphReader<Graph> graphReader(Graph& graph, const char *fn); |
| 1233 | |
1246 | 1234 | /// \ingroup lemon_io |
1247 | 1235 | /// |
1248 | 1236 | /// \brief \ref lgf-format "LGF" reader for undirected graphs |
… |
… |
|
1368 | 1356 | } |
1369 | 1357 | |
1370 | 1358 | private: |
1371 | | friend GraphReader<Graph> graphReader<>(Graph& graph, std::istream& is); |
1372 | | friend GraphReader<Graph> graphReader<>(Graph& graph, |
1373 | | const std::string& fn); |
1374 | | friend GraphReader<Graph> graphReader<>(Graph& graph, const char *fn); |
| 1359 | template <typename GR> |
| 1360 | friend GraphReader<GR> graphReader(GR& graph, std::istream& is); |
| 1361 | template <typename GR> |
| 1362 | friend GraphReader<GR> graphReader(GR& graph, const std::string& fn); |
| 1363 | template <typename GR> |
| 1364 | friend GraphReader<GR> graphReader(GR& graph, const char *fn); |
1375 | 1365 | |
1376 | 1366 | GraphReader(GraphReader& other) |
1377 | 1367 | : _is(other._is), local_is(other.local_is), _graph(other._graph), |
… |
… |
|
1699 | 1689 | while (readSuccess() && line >> c && c != '@') { |
1700 | 1690 | readLine(); |
1701 | 1691 | } |
1702 | | line.putback(c); |
| 1692 | if (readSuccess()) { |
| 1693 | line.putback(c); |
| 1694 | } |
1703 | 1695 | } |
1704 | 1696 | |
1705 | 1697 | void readNodes() { |
… |
… |
|
2040 | 2032 | |
2041 | 2033 | }; |
2042 | 2034 | |
| 2035 | /// \brief Return a \ref GraphReader class |
| 2036 | /// |
| 2037 | /// This function just returns a \ref GraphReader class. |
| 2038 | /// \relates GraphReader |
| 2039 | template <typename Graph> |
| 2040 | GraphReader<Graph> graphReader(Graph& graph, std::istream& is) { |
| 2041 | GraphReader<Graph> tmp(graph, is); |
| 2042 | return tmp; |
| 2043 | } |
| 2044 | |
| 2045 | /// \brief Return a \ref GraphReader class |
| 2046 | /// |
| 2047 | /// This function just returns a \ref GraphReader class. |
| 2048 | /// \relates GraphReader |
| 2049 | template <typename Graph> |
| 2050 | GraphReader<Graph> graphReader(Graph& graph, const std::string& fn) { |
| 2051 | GraphReader<Graph> tmp(graph, fn); |
| 2052 | return tmp; |
| 2053 | } |
| 2054 | |
| 2055 | /// \brief Return a \ref GraphReader class |
| 2056 | /// |
| 2057 | /// This function just returns a \ref GraphReader class. |
| 2058 | /// \relates GraphReader |
| 2059 | template <typename Graph> |
| 2060 | GraphReader<Graph> graphReader(Graph& graph, const char* fn) { |
| 2061 | GraphReader<Graph> tmp(graph, fn); |
| 2062 | return tmp; |
| 2063 | } |
| 2064 | |
2043 | 2065 | class SectionReader; |
2044 | 2066 | |
2045 | 2067 | SectionReader sectionReader(std::istream& is); |
… |
… |
|
2226 | 2248 | while (readSuccess() && line >> c && c != '@') { |
2227 | 2249 | readLine(); |
2228 | 2250 | } |
2229 | | line.putback(c); |
| 2251 | if (readSuccess()) { |
| 2252 | line.putback(c); |
| 2253 | } |
2230 | 2254 | } |
2231 | 2255 | |
2232 | 2256 | public: |
… |
… |
|
2567 | 2591 | while (readSuccess() && line >> c && c != '@') { |
2568 | 2592 | readLine(); |
2569 | 2593 | } |
2570 | | line.putback(c); |
| 2594 | if (readSuccess()) { |
| 2595 | line.putback(c); |
| 2596 | } |
2571 | 2597 | } |
2572 | 2598 | |
2573 | 2599 | void readMaps(std::vector<std::string>& maps) { |
diff --git a/lemon/lgf_writer.h b/lemon/lgf_writer.h
a
|
b
|
|
350 | 350 | template <typename Digraph> |
351 | 351 | class DigraphWriter; |
352 | 352 | |
353 | | /// \brief Return a \ref DigraphWriter class |
354 | | /// |
355 | | /// This function just returns a \ref DigraphWriter class. |
356 | | /// \relates DigraphWriter |
357 | 353 | template <typename Digraph> |
358 | 354 | DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, |
359 | | std::ostream& os = std::cout) { |
360 | | DigraphWriter<Digraph> tmp(digraph, os); |
361 | | return tmp; |
362 | | } |
363 | | |
364 | | /// \brief Return a \ref DigraphWriter class |
365 | | /// |
366 | | /// This function just returns a \ref DigraphWriter class. |
367 | | /// \relates DigraphWriter |
| 355 | std::ostream& os = std::cout); |
368 | 356 | template <typename Digraph> |
369 | 357 | DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, |
370 | | const std::string& fn) { |
371 | | DigraphWriter<Digraph> tmp(digraph, fn); |
372 | | return tmp; |
373 | | } |
| 358 | const std::string& fn); |
374 | 359 | |
375 | | /// \brief Return a \ref DigraphWriter class |
376 | | /// |
377 | | /// This function just returns a \ref DigraphWriter class. |
378 | | /// \relates DigraphWriter |
379 | 360 | template <typename Digraph> |
380 | 361 | DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, |
381 | | const char* fn) { |
382 | | DigraphWriter<Digraph> tmp(digraph, fn); |
383 | | return tmp; |
384 | | } |
| 362 | const char* fn); |
| 363 | |
385 | 364 | |
386 | 365 | /// \ingroup lemon_io |
387 | 366 | /// |
… |
… |
|
526 | 505 | |
527 | 506 | private: |
528 | 507 | |
529 | | friend DigraphWriter<Digraph> digraphWriter<>(const Digraph& digraph, |
530 | | std::ostream& os); |
531 | | friend DigraphWriter<Digraph> digraphWriter<>(const Digraph& digraph, |
532 | | const std::string& fn); |
533 | | friend DigraphWriter<Digraph> digraphWriter<>(const Digraph& digraph, |
534 | | const char *fn); |
| 508 | template <typename DGR> |
| 509 | friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, |
| 510 | std::ostream& os); |
| 511 | template <typename DGR> |
| 512 | friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, |
| 513 | const std::string& fn); |
| 514 | template <typename DGR> |
| 515 | friend DigraphWriter<DGR> digraphWriter(const DGR& digraph, |
| 516 | const char *fn); |
535 | 517 | |
536 | 518 | DigraphWriter(DigraphWriter& other) |
537 | 519 | : _os(other._os), local_os(other.local_os), _digraph(other._digraph), |
… |
… |
|
933 | 915 | /// @} |
934 | 916 | }; |
935 | 917 | |
| 918 | /// \brief Return a \ref DigraphWriter class |
| 919 | /// |
| 920 | /// This function just returns a \ref DigraphWriter class. |
| 921 | /// \relates DigraphWriter |
| 922 | template <typename Digraph> |
| 923 | DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, |
| 924 | std::ostream& os) { |
| 925 | DigraphWriter<Digraph> tmp(digraph, os); |
| 926 | return tmp; |
| 927 | } |
| 928 | |
| 929 | /// \brief Return a \ref DigraphWriter class |
| 930 | /// |
| 931 | /// This function just returns a \ref DigraphWriter class. |
| 932 | /// \relates DigraphWriter |
| 933 | template <typename Digraph> |
| 934 | DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, |
| 935 | const std::string& fn) { |
| 936 | DigraphWriter<Digraph> tmp(digraph, fn); |
| 937 | return tmp; |
| 938 | } |
| 939 | |
| 940 | /// \brief Return a \ref DigraphWriter class |
| 941 | /// |
| 942 | /// This function just returns a \ref DigraphWriter class. |
| 943 | /// \relates DigraphWriter |
| 944 | template <typename Digraph> |
| 945 | DigraphWriter<Digraph> digraphWriter(const Digraph& digraph, |
| 946 | const char* fn) { |
| 947 | DigraphWriter<Digraph> tmp(digraph, fn); |
| 948 | return tmp; |
| 949 | } |
| 950 | |
936 | 951 | template <typename Graph> |
937 | 952 | class GraphWriter; |
938 | 953 | |
939 | | /// \brief Return a \ref GraphWriter class |
940 | | /// |
941 | | /// This function just returns a \ref GraphWriter class. |
942 | | /// \relates GraphWriter |
943 | 954 | template <typename Graph> |
944 | 955 | GraphWriter<Graph> graphWriter(const Graph& graph, |
945 | | std::ostream& os = std::cout) { |
946 | | GraphWriter<Graph> tmp(graph, os); |
947 | | return tmp; |
948 | | } |
949 | | |
950 | | /// \brief Return a \ref GraphWriter class |
951 | | /// |
952 | | /// This function just returns a \ref GraphWriter class. |
953 | | /// \relates GraphWriter |
| 956 | std::ostream& os = std::cout); |
954 | 957 | template <typename Graph> |
955 | | GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn) { |
956 | | GraphWriter<Graph> tmp(graph, fn); |
957 | | return tmp; |
958 | | } |
959 | | |
960 | | /// \brief Return a \ref GraphWriter class |
961 | | /// |
962 | | /// This function just returns a \ref GraphWriter class. |
963 | | /// \relates GraphWriter |
| 958 | GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn); |
964 | 959 | template <typename Graph> |
965 | | GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn) { |
966 | | GraphWriter<Graph> tmp(graph, fn); |
967 | | return tmp; |
968 | | } |
| 960 | GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn); |
969 | 961 | |
970 | 962 | /// \ingroup lemon_io |
971 | 963 | /// |
… |
… |
|
1081 | 1073 | |
1082 | 1074 | private: |
1083 | 1075 | |
1084 | | friend GraphWriter<Graph> graphWriter<>(const Graph& graph, |
1085 | | std::ostream& os); |
1086 | | friend GraphWriter<Graph> graphWriter<>(const Graph& graph, |
1087 | | const std::string& fn); |
1088 | | friend GraphWriter<Graph> graphWriter<>(const Graph& graph, |
1089 | | const char *fn); |
1090 | | |
| 1076 | template <typename GR> |
| 1077 | friend GraphWriter<GR> graphWriter(const GR& graph, |
| 1078 | std::ostream& os); |
| 1079 | template <typename GR> |
| 1080 | friend GraphWriter<GR> graphWriter(const GR& graph, |
| 1081 | const std::string& fn); |
| 1082 | template <typename GR> |
| 1083 | friend GraphWriter<GR> graphWriter(const GR& graph, |
| 1084 | const char *fn); |
| 1085 | |
1091 | 1086 | GraphWriter(GraphWriter& other) |
1092 | 1087 | : _os(other._os), local_os(other.local_os), _graph(other._graph), |
1093 | 1088 | _skip_nodes(other._skip_nodes), _skip_edges(other._skip_edges) { |
… |
… |
|
1534 | 1529 | /// @} |
1535 | 1530 | }; |
1536 | 1531 | |
| 1532 | /// \brief Return a \ref GraphWriter class |
| 1533 | /// |
| 1534 | /// This function just returns a \ref GraphWriter class. |
| 1535 | /// \relates GraphWriter |
| 1536 | template <typename Graph> |
| 1537 | GraphWriter<Graph> graphWriter(const Graph& graph, |
| 1538 | std::ostream& os) { |
| 1539 | GraphWriter<Graph> tmp(graph, os); |
| 1540 | return tmp; |
| 1541 | } |
| 1542 | |
| 1543 | /// \brief Return a \ref GraphWriter class |
| 1544 | /// |
| 1545 | /// This function just returns a \ref GraphWriter class. |
| 1546 | /// \relates GraphWriter |
| 1547 | template <typename Graph> |
| 1548 | GraphWriter<Graph> graphWriter(const Graph& graph, const std::string& fn) { |
| 1549 | GraphWriter<Graph> tmp(graph, fn); |
| 1550 | return tmp; |
| 1551 | } |
| 1552 | |
| 1553 | /// \brief Return a \ref GraphWriter class |
| 1554 | /// |
| 1555 | /// This function just returns a \ref GraphWriter class. |
| 1556 | /// \relates GraphWriter |
| 1557 | template <typename Graph> |
| 1558 | GraphWriter<Graph> graphWriter(const Graph& graph, const char* fn) { |
| 1559 | GraphWriter<Graph> tmp(graph, fn); |
| 1560 | return tmp; |
| 1561 | } |
| 1562 | |
1537 | 1563 | class SectionWriter; |
1538 | 1564 | |
1539 | 1565 | SectionWriter sectionWriter(std::istream& is); |
diff --git a/lemon/path.h b/lemon/path.h
a
|
b
|
|
929 | 929 | }; |
930 | 930 | |
931 | 931 | template <typename Target, typename Source, |
932 | | bool buildEnable = BuildTagIndicator<Target>::value, |
933 | | bool revEnable = RevPathTagIndicator<Source>::value> |
934 | | struct PathCopySelector { |
| 932 | bool buildEnable = BuildTagIndicator<Target>::value> |
| 933 | struct PathCopySelectorForward { |
935 | 934 | static void copy(Target& target, const Source& source) { |
936 | 935 | target.clear(); |
937 | 936 | for (typename Source::ArcIt it(source); it != INVALID; ++it) { |
… |
… |
|
941 | 940 | }; |
942 | 941 | |
943 | 942 | template <typename Target, typename Source> |
944 | | struct PathCopySelector<Target, Source, false, true> { |
| 943 | struct PathCopySelectorForward<Target, Source, true> { |
| 944 | static void copy(Target& target, const Source& source) { |
| 945 | target.clear(); |
| 946 | target.build(source); |
| 947 | } |
| 948 | }; |
| 949 | |
| 950 | template <typename Target, typename Source, |
| 951 | bool buildEnable = BuildTagIndicator<Target>::value> |
| 952 | struct PathCopySelectorBackward { |
945 | 953 | static void copy(Target& target, const Source& source) { |
946 | 954 | target.clear(); |
947 | 955 | for (typename Source::RevArcIt it(source); it != INVALID; ++it) { |
… |
… |
|
951 | 959 | }; |
952 | 960 | |
953 | 961 | template <typename Target, typename Source> |
954 | | struct PathCopySelector<Target, Source, true, false> { |
955 | | static void copy(Target& target, const Source& source) { |
956 | | target.clear(); |
957 | | target.build(source); |
958 | | } |
959 | | }; |
960 | | |
961 | | template <typename Target, typename Source> |
962 | | struct PathCopySelector<Target, Source, true, true> { |
| 962 | struct PathCopySelectorBackward<Target, Source, true> { |
963 | 963 | static void copy(Target& target, const Source& source) { |
964 | 964 | target.clear(); |
965 | 965 | target.buildRev(source); |
966 | 966 | } |
967 | 967 | }; |
968 | 968 | |
| 969 | |
| 970 | template <typename Target, typename Source, |
| 971 | bool revEnable = RevPathTagIndicator<Source>::value> |
| 972 | struct PathCopySelector { |
| 973 | static void copy(Target& target, const Source& source) { |
| 974 | PathCopySelectorForward<Target, Source>::copy(target, source); |
| 975 | } |
| 976 | }; |
| 977 | |
| 978 | template <typename Target, typename Source> |
| 979 | struct PathCopySelector<Target, Source, true> { |
| 980 | static void copy(Target& target, const Source& source) { |
| 981 | PathCopySelectorBackward<Target, Source>::copy(target, source); |
| 982 | } |
| 983 | }; |
| 984 | |
969 | 985 | } |
970 | 986 | |
971 | 987 | |
diff --git a/lemon/random.h b/lemon/random.h
a
|
b
|
|
344 | 344 | } |
345 | 345 | }; |
346 | 346 | |
347 | | template <typename Result, int exp, bool pos = (exp >= 0)> |
| 347 | template <typename Result, int exp> |
348 | 348 | struct ShiftMultiplier { |
349 | 349 | static const Result multiplier() { |
350 | 350 | Result res = ShiftMultiplier<Result, exp / 2>::multiplier(); |
351 | 351 | res *= res; |
352 | | if ((exp & 1) == 1) res *= static_cast<Result>(2.0); |
353 | | return res; |
354 | | } |
355 | | }; |
356 | | |
357 | | template <typename Result, int exp> |
358 | | struct ShiftMultiplier<Result, exp, false> { |
359 | | static const Result multiplier() { |
360 | | Result res = ShiftMultiplier<Result, exp / 2>::multiplier(); |
361 | | res *= res; |
362 | 352 | if ((exp & 1) == 1) res *= static_cast<Result>(0.5); |
363 | 353 | return res; |
364 | 354 | } |
365 | 355 | }; |
366 | 356 | |
367 | 357 | template <typename Result> |
368 | | struct ShiftMultiplier<Result, 0, true> { |
| 358 | struct ShiftMultiplier<Result, 0> { |
369 | 359 | static const Result multiplier() { |
370 | 360 | return static_cast<Result>(1.0); |
371 | 361 | } |
372 | 362 | }; |
373 | 363 | |
374 | 364 | template <typename Result> |
375 | | struct ShiftMultiplier<Result, -20, true> { |
| 365 | struct ShiftMultiplier<Result, 20> { |
376 | 366 | static const Result multiplier() { |
377 | 367 | return static_cast<Result>(1.0/1048576.0); |
378 | 368 | } |
379 | 369 | }; |
380 | 370 | |
381 | 371 | template <typename Result> |
382 | | struct ShiftMultiplier<Result, -32, true> { |
| 372 | struct ShiftMultiplier<Result, 32> { |
383 | 373 | static const Result multiplier() { |
384 | | return static_cast<Result>(1.0/424967296.0); |
| 374 | return static_cast<Result>(1.0/4294967296.0); |
385 | 375 | } |
386 | 376 | }; |
387 | 377 | |
388 | 378 | template <typename Result> |
389 | | struct ShiftMultiplier<Result, -53, true> { |
| 379 | struct ShiftMultiplier<Result, 53> { |
390 | 380 | static const Result multiplier() { |
391 | 381 | return static_cast<Result>(1.0/9007199254740992.0); |
392 | 382 | } |
393 | 383 | }; |
394 | 384 | |
395 | 385 | template <typename Result> |
396 | | struct ShiftMultiplier<Result, -64, true> { |
| 386 | struct ShiftMultiplier<Result, 64> { |
397 | 387 | static const Result multiplier() { |
398 | 388 | return static_cast<Result>(1.0/18446744073709551616.0); |
399 | 389 | } |
… |
… |
|
413 | 403 | static const int bits = std::numeric_limits<Word>::digits; |
414 | 404 | |
415 | 405 | static Result convert(RandomCore<Word>& rnd) { |
416 | | return Shifting<Result, - shift - rest>:: |
| 406 | return Shifting<Result, shift + rest>:: |
417 | 407 | shift(static_cast<Result>(rnd() >> (bits - rest))); |
418 | 408 | } |
419 | 409 | }; |
… |
… |
|
423 | 413 | static const int bits = std::numeric_limits<Word>::digits; |
424 | 414 | |
425 | 415 | static Result convert(RandomCore<Word>& rnd) { |
426 | | return Shifting<Result, - shift - bits>:: |
| 416 | return Shifting<Result, shift + bits>:: |
427 | 417 | shift(static_cast<Result>(rnd())) + |
428 | 418 | RealConversion<Result, Word, rest-bits, shift + bits>:: |
429 | 419 | convert(rnd); |