/* @file engine_concept.hpp */ #pragma once #include #include namespace xo { namespace rng { /* an engine generates psuedo-random bits. * given * RngEngine eng = ...; * * RngEngine::result_type x = eng(); * * puts random bits into x. */ template concept engine_concept = requires(RngEngine engine, typename RngEngine::result_type r) { /* note: the first 4 requirements characterize UniformRandomBitGenerator */ typename RngEngine::result_type; { RngEngine(r) }; { engine.min() } -> std::same_as; { engine.max() } -> std::same_as; /* must return value in closed interval [.min(), .max()] */ { engine() } -> std::same_as; { engine.seed() }; { engine.seed(r) }; { engine == engine }; { engine != engine }; } && std::copyable && std::uniform_random_bit_generator; } /*namespace rng*/ } /*namespace xo*/ /* end engine_concept.hpp */