From c23d8a2c67eaaa85705bbf1f09687bedda556d03 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 13 Sep 2025 00:12:18 +0300 Subject: [PATCH 1/4] Initial commit with task details for issue #54 Adding CLAUDE.md with task information for AI processing. This file will be removed when the task is complete. Issue: https://github.com/linksplatform/Random/issues/54 --- CLAUDE.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..74b179a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,5 @@ +Issue to solve: https://github.com/linksplatform/Random/issues/54 +Your prepared branch: issue-54-cf080c17 +Your prepared working directory: /tmp/gh-issue-solver-1757711534351 + +Proceed. \ No newline at end of file From e50bbc088984718c8e0dbcc1467c1794b2a0661a Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 13 Sep 2025 00:16:10 +0300 Subject: [PATCH 2/4] Add templated NextUInt function for generic unsigned integer types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added template function NextUInt that works with uint8_t, uint16_t, uint32_t, and uint64_t - Added overload for NextUInt with range parameter - Maintained backward compatibility with existing NextUInt64 functions - Added comprehensive tests for the new templated functions - Added type_traits include for template constraints 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../RandomExtensionsTests.cpp | 25 +++++++++++++++++++ cpp/Platform.Random/Platform.Random.h | 1 + cpp/Platform.Random/RandomExtensions.h | 22 ++++++++++++++-- 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/cpp/Platform.Random.Tests/RandomExtensionsTests.cpp b/cpp/Platform.Random.Tests/RandomExtensionsTests.cpp index a0d4a94..78b7199 100644 --- a/cpp/Platform.Random.Tests/RandomExtensionsTests.cpp +++ b/cpp/Platform.Random.Tests/RandomExtensionsTests.cpp @@ -24,6 +24,31 @@ ASSERT_LT(theSameCount, 8); } + TEST(RandomExtensionsTests, NextUIntTemplateTest) + { + // Test NextUInt with different unsigned integer types + auto value8 = NextUInt(RandomHelpers::Default); + auto value16 = NextUInt(RandomHelpers::Default); + auto value32 = NextUInt(RandomHelpers::Default); + auto value64 = NextUInt(RandomHelpers::Default); + + // Test with ranges + auto rangedValue8 = NextUInt(RandomHelpers::Default, {0, 10}); + auto rangedValue16 = NextUInt(RandomHelpers::Default, {0, 100}); + auto rangedValue32 = NextUInt(RandomHelpers::Default, {0, 1000}); + auto rangedValue64 = NextUInt(RandomHelpers::Default, {0UL, 10000UL}); + + // Verify ranges + ASSERT_LE(rangedValue8, 10); + ASSERT_GE(rangedValue8, 0); + ASSERT_LE(rangedValue16, 100); + ASSERT_GE(rangedValue16, 0); + ASSERT_LE(rangedValue32, 1000); + ASSERT_GE(rangedValue32, 0); + ASSERT_LE(rangedValue64, 10000UL); + ASSERT_GE(rangedValue64, 0UL); + } + TEST(RandomExtensionsTests, NextBooleanTest) { auto trueCount = 0; diff --git a/cpp/Platform.Random/Platform.Random.h b/cpp/Platform.Random/Platform.Random.h index f66173d..da5c349 100644 --- a/cpp/Platform.Random/Platform.Random.h +++ b/cpp/Platform.Random/Platform.Random.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include diff --git a/cpp/Platform.Random/RandomExtensions.h b/cpp/Platform.Random/RandomExtensions.h index b25a3b3..0d03c66 100644 --- a/cpp/Platform.Random/RandomExtensions.h +++ b/cpp/Platform.Random/RandomExtensions.h @@ -1,8 +1,26 @@ namespace Platform::Random { - std::uint64_t NextUInt64(std::mt19937_64& random, const Ranges::Range& range) { return std::uniform_int_distribution{range.Minimum, range.Maximum}(random); } + template + T NextUInt(std::mt19937_64& random, const Ranges::Range& range) + { + static_assert(std::is_unsigned_v, "T must be an unsigned integer type"); + return std::uniform_int_distribution{range.Minimum, range.Maximum}(random); + } - std::uint64_t NextUInt64(std::mt19937_64& random) { return NextUInt64(random, Ranges::UInt64); } + template + T NextUInt(std::mt19937_64& random) + { + static_assert(std::is_unsigned_v, "T must be an unsigned integer type"); + if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt8); + else if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt16); + else if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt32); + else if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt64); + else static_assert(std::false_type::value, "Unsupported unsigned integer type"); + } + + std::uint64_t NextUInt64(std::mt19937_64& random, const Ranges::Range& range) { return NextUInt(random, range); } + + std::uint64_t NextUInt64(std::mt19937_64& random) { return NextUInt(random); } bool NextBoolean(std::mt19937_64& random) { return std::uniform_int_distribution{}(random) % 2 == 0; } } From 6e9ae7add6a868f6c4a96de4b43c66c1510c8478 Mon Sep 17 00:00:00 2001 From: konard Date: Sat, 13 Sep 2025 00:16:52 +0300 Subject: [PATCH 3/4] 'Auto-commit changes made by Claude MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude ' --- examples/syntax_test.cpp | 64 +++++++++++++++++++++++++++++++++++++++ examples/syntax_test.o | Bin 0 -> 45376 bytes 2 files changed, 64 insertions(+) create mode 100644 examples/syntax_test.cpp create mode 100644 examples/syntax_test.o diff --git a/examples/syntax_test.cpp b/examples/syntax_test.cpp new file mode 100644 index 0000000..ec9e216 --- /dev/null +++ b/examples/syntax_test.cpp @@ -0,0 +1,64 @@ +#include +#include + +// Mock the Range structure for syntax check +namespace Ranges { + template + struct Range { + T Minimum; + T Maximum; + }; + + inline Range UInt8{0, 255}; + inline Range UInt16{0, 65535}; + inline Range UInt32{0, 4294967295U}; + inline Range UInt64{0UL, 18446744073709551615UL}; +} + +// Copy of our implementation +namespace Platform::Random +{ + template + T NextUInt(std::mt19937_64& random, const Ranges::Range& range) + { + static_assert(std::is_unsigned_v, "T must be an unsigned integer type"); + return std::uniform_int_distribution{range.Minimum, range.Maximum}(random); + } + + template + T NextUInt(std::mt19937_64& random) + { + static_assert(std::is_unsigned_v, "T must be an unsigned integer type"); + if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt8); + else if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt16); + else if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt32); + else if constexpr (std::is_same_v) return NextUInt(random, Ranges::UInt64); + else static_assert(std::false_type::value, "Unsupported unsigned integer type"); + } + + std::uint64_t NextUInt64(std::mt19937_64& random, const Ranges::Range& range) { return NextUInt(random, range); } + + std::uint64_t NextUInt64(std::mt19937_64& random) { return NextUInt(random); } + + bool NextBoolean(std::mt19937_64& random) { return std::uniform_int_distribution{}(random) % 2 == 0; } +} + +int main() { + std::mt19937_64 rng; + + // Test the template functions + auto val8 = Platform::Random::NextUInt(rng); + auto val16 = Platform::Random::NextUInt(rng); + auto val32 = Platform::Random::NextUInt(rng); + auto val64 = Platform::Random::NextUInt(rng); + + // Test with ranges + auto ranged8 = Platform::Random::NextUInt(rng, {0, 10}); + auto ranged64 = Platform::Random::NextUInt(rng, {0UL, 100UL}); + + // Test existing functions still work + auto oldVal = Platform::Random::NextUInt64(rng); + auto oldRanged = Platform::Random::NextUInt64(rng, {0UL, 50UL}); + + return 0; +} \ No newline at end of file diff --git a/examples/syntax_test.o b/examples/syntax_test.o new file mode 100644 index 0000000000000000000000000000000000000000..6bc3c897d3adfa80a178c4ea2b73b17e2ea55fb4 GIT binary patch literal 45376 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 Date: Sat, 13 Sep 2025 00:16:54 +0300 Subject: [PATCH 4/4] Remove CLAUDE.md - Claude command completed --- CLAUDE.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 74b179a..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,5 +0,0 @@ -Issue to solve: https://github.com/linksplatform/Random/issues/54 -Your prepared branch: issue-54-cf080c17 -Your prepared working directory: /tmp/gh-issue-solver-1757711534351 - -Proceed. \ No newline at end of file