30 void produce_output(config
const& cfg) {
31 auto generator = jb::testing::initialize_mersenne_twister<std::mt19937_64>(
32 cfg.seed(), cfg.token());
34 for (
int i = 0; i != cfg.iterations(); ++i) {
35 std::cout << std::uniform_real_distribution<>(0, 1)(generator) <<
"\n";
41 int main(
int argc,
char* argv[])
try {
43 cfg.process_cmdline(argc, argv);
48 std::cerr <<
"usage: " << ex.what() << std::endl;
50 }
catch (std::exception
const& ex) {
51 std::cerr <<
"standard exception raised: " << ex.what() << std::endl;
54 std::cerr <<
"unknown exception raised" << std::endl;
60 #ifndef JB_ITCH5_DEFAULT_check_random_device_token 61 #define JB_ITCH5_DEFAULT_check_random_device_token \ 62 jb::testing::default_initialization_marker 63 #endif // JB_ITCH5_DEFAULT_check_random_device_token 65 #ifndef JB_ITCH5_DEFAULT_check_random_device_iterations 66 #define JB_ITCH5_DEFAULT_check_random_device_iterations 10000 67 #endif // JB_ITCH5_DEFAULT_check_random_device_iterations 78 "Define how many values to extract from std::random_device."),
82 "Define the parameter to initialize the random device." 83 "The semantics are implementation defined, but on libc++ and " 84 "libstd++ the value is the name of a device to read, such as " 85 "'/dev/random' or '/dev/urandom'"),
89 "If non-zero the generator is initialized using this seed."),
93 void config::validate()
const {
95 std::ostringstream os;
96 os <<
"--iterations (" <<
iterations() <<
") must be >= 0";
Define defaults for program parameters.
Base class for all configuration objects.
virtual void validate() const
Validate the settings.
#define config_object_constructors(NAME)
Helper class to easily define configuration attributes.
A simple class to communicate the result of parsing the options.
#define JB_ITCH5_DEFAULT_check_random_device_iterations
#define JB_ITCH5_DEFAULT_check_random_device_token
int main(int argc, char *argv[])