randomgen: compile fixes for OSX (clang 11)

This commit is contained in:
Roland Conybeare 2023-10-17 00:20:00 -04:00
commit f0208ec71a
2 changed files with 39 additions and 2 deletions

View file

@ -5,6 +5,37 @@
#include <concepts> #include <concepts>
#include <random> #include <random>
namespace std {
#ifdef __clang__
template < class T >
concept integral = std::is_integral_v<T>;
template < class T >
concept signed_integral = std::integral<T> && std::is_signed_v<T>;
template < class T >
concept unsigned_integral
= std::integral<T> && !std::signed_integral<T>;
template< class F, class... Args >
concept invocable
= requires(F&& f, Args&&... args) {
std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
/* not required to be equality-preserving */
};
template< typename G >
concept uniform_random_bit_generator
= std::invocable<G&>
&& std::unsigned_integral<std::invoke_result_t<G&>>
&& requires { { G::min() } -> std::same_as<std::invoke_result_t<G&>>;
{ G::max() } -> std::same_as<std::invoke_result_t<G&>>;
requires std::bool_constant<(G::min() < G::max())>::value; };
#else
/* uniform_random_bit_generator provided by gcc 12.3.2 */
#endif
} /*namespace std*/
namespace xo { namespace xo {
namespace rng { namespace rng {
/* an engine generates psuedo-random bits. /* an engine generates psuedo-random bits.
@ -29,7 +60,13 @@ namespace xo {
{ engine.seed(r) }; { engine.seed(r) };
{ engine == engine }; { engine == engine };
{ engine != engine }; { engine != engine };
} && std::copyable<RngEngine> && std::uniform_random_bit_generator<RngEngine>; }
#ifdef __clang__
// std::copyable apparently not available in clang11 ?
#else
&& std::copyable<RngEngine>
#endif
&& std::uniform_random_bit_generator<RngEngine>;
} /*namespace rng*/ } /*namespace rng*/
} /*namespace xo*/ } /*namespace xo*/

View file

@ -24,7 +24,7 @@ namespace xo {
*/ */
template<typename T> template<typename T>
void random_seed(T * p_seed) { void random_seed(T * p_seed) {
# ifdef _BSD_SOURCE # ifdef __clang__
/* NOTE: arc4random_buf() works on darwin/nix; /* NOTE: arc4random_buf() works on darwin/nix;
* probably need to do something else on intel linux * probably need to do something else on intel linux
*/ */