diff --git a/include/xo/randomgen/engine_concept.hpp b/include/xo/randomgen/engine_concept.hpp index 42557b0..38b65cd 100644 --- a/include/xo/randomgen/engine_concept.hpp +++ b/include/xo/randomgen/engine_concept.hpp @@ -5,6 +5,37 @@ #include #include +namespace std { +#ifdef __clang__ + template < class T > + concept integral = std::is_integral_v; + + template < class T > + concept signed_integral = std::integral && std::is_signed_v; + + template < class T > + concept unsigned_integral + = std::integral && !std::signed_integral; + + template< class F, class... Args > + concept invocable + = requires(F&& f, Args&&... args) { + std::invoke(std::forward(f), std::forward(args)...); + /* not required to be equality-preserving */ + }; + + template< typename G > + concept uniform_random_bit_generator + = std::invocable + && std::unsigned_integral> + && requires { { G::min() } -> std::same_as>; + { G::max() } -> std::same_as>; + 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 rng { /* an engine generates psuedo-random bits. @@ -29,7 +60,13 @@ namespace xo { { engine.seed(r) }; { engine == engine }; { engine != engine }; - } && std::copyable && std::uniform_random_bit_generator; + } +#ifdef __clang__ + // std::copyable apparently not available in clang11 ? +#else + && std::copyable +#endif + && std::uniform_random_bit_generator; } /*namespace rng*/ } /*namespace xo*/ diff --git a/include/xo/randomgen/random_seed.hpp b/include/xo/randomgen/random_seed.hpp index 67246c0..92447b3 100644 --- a/include/xo/randomgen/random_seed.hpp +++ b/include/xo/randomgen/random_seed.hpp @@ -24,7 +24,7 @@ namespace xo { */ template void random_seed(T * p_seed) { -# ifdef _BSD_SOURCE +# ifdef __clang__ /* NOTE: arc4random_buf() works on darwin/nix; * probably need to do something else on intel linux */