Merge branch 'catch' into v1.x
[awesomized/libmemcached] / test / lib / random.hpp
1 #pragma once
2
3 #include <cstddef>
4 #include <chrono>
5 #include <iostream>
6 #include <random>
7 #include <string>
8 #include <type_traits>
9 #include <utility>
10
11 using namespace std;
12
13 using kv_pair = pair<string, string>;
14
15 template<typename T>
16 enable_if_t<is_integral_v<T>, T> random_num(T min, T max) {
17 using namespace chrono;
18 using rnd = mt19937;
19 using dst = uniform_int_distribution<T>;
20
21 static auto time = duration_cast<nanoseconds>(system_clock::now().time_since_epoch());
22 static auto seed = static_cast<rnd::result_type>(time.count() % numeric_limits<T>::max());
23 static auto rgen = rnd{seed};
24
25 return dst(min, max)(rgen);
26 }
27
28 unsigned random_port();
29 string random_port_string(const string &);
30
31 char random_binary();
32 string random_binary_string(size_t len);
33 char random_ascii(char min = '!', char max = '~');
34 string random_ascii_string(size_t len, char min = '!', char max = '~');
35 kv_pair random_ascii_pair(size_t minlen = 1<<2, size_t maxlen = 1<<10);
36
37 template<template <typename> class Container>
38 auto random_ascii_pairs(size_t count, size_t minlen = 1<<2, size_t maxlen = 1<<10) {
39 Container<kv_pair> v;
40
41 v.reserve(count);
42 for (size_t i = 0; i < count; ++i) {
43 v.emplace_back(random_ascii_pair(minlen, maxlen));
44 }
45
46 return v;
47 }
48
49 string random_socket(const string &prefix = "/tmp/libmc.");
50 string random_socket_or_port_string(const string &what);
51 string random_socket_or_port_flag(const string &binary);
52
53 inline auto random_socket_or_port_arg() {
54 return make_pair(&random_socket_or_port_flag, &random_socket_or_port_string);
55 }