From 2894373fc37aca92b33f57b1f15fa7d7504d8161 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Wed, 1 Jul 2026 11:08:16 +0300 Subject: [PATCH] ... --- CMakeLists.txt | 1 + examples/str_exam.cpp | 7 +++ include/snipplib/utils/snplib_string.h | 87 +++++++++++++++++++++++++- 3 files changed, 94 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c3e250f..5aff4ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ set(LIB_HEADERS include/snipplib/utils/snplib_keyvalue_expr.h include/snipplib/utils/snplib_utils.h include/snipplib/containers/snplib_hmap.h + include/snipplib/containers/snplib_hvec.h include/snipplib/serialization/snplib_serialization.h include/snipplib/network/snplib_endpoint.h ) diff --git a/examples/str_exam.cpp b/examples/str_exam.cpp index 0f9be7d..e2cd53f 100644 --- a/examples/str_exam.cpp +++ b/examples/str_exam.cpp @@ -84,6 +84,13 @@ int main() std::println("valueSeq = '{}'", kvl.valueSeq>()); + snplib_randoom_string_generator_t<> rstr_gen; + + std::println("\n\n"); + std::println("RAND STR: {}", rstr_gen.generate()); + std::println("RAND STR: {}", rstr_gen.generate()); + std::println("UUID v4: {}", rstr_gen.UUIDv4String()); + std::println("UUID v4: {}", rstr_gen.UUIDv4String()); return 0; } \ No newline at end of file diff --git a/include/snipplib/utils/snplib_string.h b/include/snipplib/utils/snplib_string.h index 8140a41..e3afae9 100644 --- a/include/snipplib/utils/snplib_string.h +++ b/include/snipplib/utils/snplib_string.h @@ -1,10 +1,11 @@ #pragma once #include +#include +#include #include #include "../concepts/snplib_concepts.h" -#include "../serialization/snplib_serialization.h" namespace snplib { @@ -333,5 +334,89 @@ static std::optional snplib_num_from_range(R&& r) } +/* RANDOM STRING GENERATOR */ + + + +template +class snplib_randoom_string_generator_t +{ +private: + std::random_device _randomDev{}; + + RANDOM_GEN_T _randomGen; + +public: + static constexpr std::string_view DEFAULT_RANDOM_CHAR_RANGE = + "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "$_#~@%-*!"; + + static constexpr std::string_view UUID_STRING_RANGE = "0123456789abcdef"; + + + static constexpr size_t DEFAULT_RANDOM_STR_LEN = 32; + + snplib_randoom_string_generator_t() : _randomGen(_randomDev()) {} + + template + snplib_randoom_string_generator_t(SEED_T seed) : _randomGen(seed) + { + } + + template + OR generate(size_t len = snplib_randoom_string_generator_t::DEFAULT_RANDOM_STR_LEN, + IR char_range = snplib_randoom_string_generator_t::DEFAULT_RANDOM_CHAR_RANGE) + { + OR res; + + size_t max_idx = std::ranges::size(char_range); + if (max_idx < 2) { + char_range = snplib_randoom_string_generator_t::DEFAULT_RANDOM_CHAR_RANGE; + max_idx = snplib_randoom_string_generator_t::DEFAULT_RANDOM_CHAR_RANGE.size(); + } + + std::uniform_int_distribution rdist(0, --max_idx); + + if (!len) { + len = snplib_randoom_string_generator_t::DEFAULT_RANDOM_STR_LEN; + } + + for (size_t i = 0; i < len; ++i) { + std::back_inserter(res) = char_range[rdist(_randomGen)]; + } + + return res; + } + + template + std::string generate(size_t len = snplib_randoom_string_generator_t::DEFAULT_RANDOM_STR_LEN, + IR char_range = snplib_randoom_string_generator_t::DEFAULT_RANDOM_CHAR_RANGE) + { + return generate(len, char_range); + } + + template + OR UUIDv4String() + { + OR res = generate(36, snplib_randoom_string_generator_t::UUID_STRING_RANGE); + auto iter = res.begin(); + size_t i = 0; + for (size_t idx : std::array{8, 13, 18, 23}) { + std::advance(iter, idx - i); + *iter = '-'; + i = idx; + } + + return res; + } + + std::string UUIDv4String() + { + return UUIDv4String(); + } +}; } // namespace snplib \ No newline at end of file