#include "absl/container/internal/hash_generator_testing.h"
#include <deque>
#include "absl/base/no_destructor.h"
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace container_internal {
namespace hash_internal {
namespace {
class RandomDeviceSeedSeq {
public:
using result_type = typename std::random_device::result_type;
template <class Iterator>
void generate(Iterator start, Iterator end) {
while (start != end) {
*start = gen_();
++start;
}
}
private:
std::random_device gen_;
};
}
std::mt19937_64* GetSharedRng() {
static absl::NoDestructor<std::mt19937_64> rng([] {
RandomDeviceSeedSeq seed_seq;
return std::mt19937_64(seed_seq);
}());
return rng.get();
}
std::string Generator<std::string>::operator()() const {
std::uniform_int_distribution<short> chars(0x20, 0x7E);
std::string res;
res.resize(32);
std::generate(res.begin(), res.end(),
[&]() { return chars(*GetSharedRng()); });
return res;
}
absl::string_view Generator<absl::string_view>::operator()() const {
static absl::NoDestructor<std::deque<std::string>> arena;
std::uniform_int_distribution<short> chars(0x20, 0x7E);
arena->emplace_back();
auto& res = arena->back();
res.resize(32);
std::generate(res.begin(), res.end(),
[&]() { return chars(*GetSharedRng()); });
return res;
}
} } ABSL_NAMESPACE_END
}