1
0
Fork 0
mirror of https://github.com/bolero-MURAKAMI/Sprout synced 2025-08-03 12:49:50 +00:00

workaroud for clang3.2 (inversive_congruential)

This commit is contained in:
bolero-MURAKAMI 2012-11-14 11:22:05 +09:00
parent d39f4abe0f
commit b9121b8850
4 changed files with 94 additions and 12 deletions

View file

@ -85,7 +85,8 @@ namespace sprout {
: member_type{rng, v, y}
{}
template<typename Random, typename BaseUnsigned>
SPROUT_CONSTEXPR sprout::random::random_result<shuffle_order_engine> generate_1(Random const& rnd, BaseUnsigned j) const {
SPROUT_CONSTEXPR sprout::random::random_result<shuffle_order_engine>
generate_1(Random const& rnd, BaseUnsigned j) const {
return sprout::random::random_result<shuffle_order_engine>(
v_[j],
shuffle_order_engine(
@ -97,12 +98,14 @@ namespace sprout {
);
}
template<typename BaseUnsigned>
SPROUT_CONSTEXPR sprout::random::random_result<shuffle_order_engine> generate(BaseUnsigned brange, BaseUnsigned off) const {
SPROUT_CONSTEXPR sprout::random::random_result<shuffle_order_engine>
generate(BaseUnsigned brange, BaseUnsigned off) const {
return generate_1(
rng_(),
k == 1 ? BaseUnsigned(0)
: brange < std::numeric_limits<BaseUnsigned>::max() / k ? BaseUnsigned(k * off / (brange + 1))
: brange < std::numeric_limits<std::uintmax_t>::max() / k ? static_cast<BaseUnsigned>(static_cast<std::uintmax_t>(off) * k / (static_cast<std::uintmax_t>(brange) + 1))
: brange < std::numeric_limits<std::uintmax_t>::max() / k
? static_cast<BaseUnsigned>(static_cast<std::uintmax_t>(off) * k / (static_cast<std::uintmax_t>(brange) + 1))
//: static_cast<BaseUnsigned>(sprout::random::detail::muldiv(off, k, static_cast<std::uintmax_t>(brange) + 1)) // ???
: throw std::domain_error("shuffle_order_engine<>: Sorry, not implemented.")
);