// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include #include #include "base/bytes.h" namespace base { void RandomFill(bytes::span bytes); inline void RandomFill(void *data, std::size_t length) { RandomFill({ static_cast(data), length }); } template < typename T, typename = std::enable_if_t>> [[nodiscard]] inline T RandomValue() { auto result = T(); RandomFill({ reinterpret_cast(&result), sizeof(T) }); return result; } [[nodiscard]] int RandomIndex(int count); template class BufferedRandom final { public: explicit BufferedRandom(int bufferSize) : _buffer(bufferSize) { Expects(bufferSize > 0); } [[nodiscard]] T next() { if (_index == _buffer.size()) { _index = 0; } if (!_index) { RandomFill(bytes::make_span(_buffer)); } return _buffer[_index++]; } private: std::vector _buffer; int _index = 0; }; [[nodiscard]] int RandomIndex(int count, BufferedRandom buffered); void RandomAddSeed(bytes::const_span bytes); } // namespace base