// // distribution.cpp // shared_random_generator // // Created by Sam Jaffe on 3/25/23. // Copyright © 2023 Sam Jaffe. All rights reserved. // #include "random/distribution.h" #include #include #include #include "random/device.h" #define INSTANTIATE_DISTRIBUTION_TEMPLATES(T) \ template std::string to_string(Distribution const &); \ template class Uniform; namespace engine::random { template std::string to_string(Distribution const & dist) { std::stringstream ss; ss << dist; return ss.str(); } template Uniform::Uniform(Rand min) : Uniform(min, std::numeric_limits::max()) {} template Uniform::Uniform(Rand min, Rand max) : min_(min), max_(max) {} template auto Uniform::operator()(Device & device) const -> result_type { if constexpr (std::is_floating_point_v) { return std::uniform_real_distribution(min_, max_)(device); } else { return std::uniform_int_distribution(min_, max_)(device); } } template void Uniform::describe(std::ostream & os) const { constexpr char close = std::is_floating_point_v ? ')' : ']'; os << typeid(Rand).name() << "Uniform[" << min_ << ',' << max_ << close; } IMPLEMENT_DEVICE(INSTANTIATE_DISTRIBUTION_TEMPLATES) }