| 89 | */ |
| 90 | template <typename T> |
| 91 | inline auto random_vector(uint64_t size, std::pair<T, T> range) |
| 92 | { |
| 93 | auto& mersenne_engine = random_engine(); |
| 94 | if constexpr (base::is_floating_point_v<T>) { |
| 95 | std::vector<T> ret; |
| 96 | ret.resize(size); |
| 97 | using actual_type = std::conditional_t<std::floating_point<T>, T, float>; |
| 98 | std::uniform_real_distribution<actual_type> value_dist{static_cast<actual_type>(range.first), static_cast<actual_type>(range.second)}; |
| 99 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 100 | return value_dist(mersenne_engine); |
| 101 | }; |
| 102 | std::generate(ret.begin(), ret.end(), value_gen); |
| 103 | return ret; |
| 104 | } else if constexpr (std::is_same_v<bool, T>) { |
| 105 | boost::container::vector<T> ret; |
| 106 | ret.resize(size); |
| 107 | std::bernoulli_distribution value_dist(0.5); |
| 108 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 109 | return value_dist(mersenne_engine); |
| 110 | }; |
| 111 | std::generate(ret.begin(), ret.end(), value_gen); |
| 112 | return ret; |
| 113 | } else if constexpr (sizeof(T) == 1) { |
| 114 | std::vector<T> ret; |
| 115 | ret.resize(size); |
| 116 | // Handle 8-bit types separately |
| 117 | using dist_type = std::conditional_t<std::is_signed_v<T>, int, unsigned int>; |
| 118 | std::uniform_int_distribution<dist_type> value_dist{range.first, range.second}; |
| 119 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 120 | return static_cast<T>(value_dist(mersenne_engine)); |
| 121 | }; |
| 122 | std::generate(ret.begin(), ret.end(), value_gen); |
| 123 | return ret; |
| 124 | } else { |
| 125 | std::vector<T> ret; |
| 126 | ret.resize(size); |
| 127 | std::uniform_int_distribution<T> value_dist{range.first, range.second}; |
| 128 | |
| 129 | auto value_gen = [&value_dist, &mersenne_engine]() { |
| 130 | return value_dist(mersenne_engine); |
| 131 | }; |
| 132 | std::generate(ret.begin(), ret.end(), value_gen); |
| 133 | return ret; |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | /** |
| 138 | * @brief Generates a random vector of a given type and size. |