From e368ce143e9963c4835f112b9e1e09d8afcb6937 Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 10 Sep 2025 18:35:51 +0300 Subject: [PATCH 1/3] Initial commit with task details for issue #78 Adding CLAUDE.md with task information for AI processing. This file will be removed when the task is complete. Issue: https://github.com/linksplatform/Interfaces/issues/78 --- 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..36f6a9a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,5 @@ +Issue to solve: https://github.com/linksplatform/Interfaces/issues/78 +Your prepared branch: issue-78-e53f0780 +Your prepared working directory: /tmp/gh-issue-solver-1757518548776 + +Proceed. \ No newline at end of file From fd1791c1234dfd280d0854b14dd0fb3d45d99c7a Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 10 Sep 2025 18:36:08 +0300 Subject: [PATCH 2/3] Remove CLAUDE.md - PR created successfully --- 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 36f6a9a..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,5 +0,0 @@ -Issue to solve: https://github.com/linksplatform/Interfaces/issues/78 -Your prepared branch: issue-78-e53f0780 -Your prepared working directory: /tmp/gh-issue-solver-1757518548776 - -Proceed. \ No newline at end of file From 263d1d4ecfc7921a7144699f173da791416466ed Mon Sep 17 00:00:00 2001 From: konard Date: Wed, 10 Sep 2025 18:39:35 +0300 Subject: [PATCH 3/3] Add readonly/const models for collection concepts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces CReadonlyDictionary, CReadonlyList, and CReadonlySet concepts that preserve const qualifiers instead of stripping them with std::remove_const_t. This enables proper readonly collections that only expose const methods. - Add CReadonlyDictionaryHelpFunction that uses const Self instead of removing const qualifier - Add CReadonlyListHelpFunction with const-only operations (size, empty, indexing) - Add CReadonlySetHelpFunction with const-only operations (find, contains, size, empty) - Add corresponding ReadonlyDictionary, ReadonlyList, and ReadonlySet structs - Include test example demonstrating const qualification preservation Fixes #78 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- cpp/Platform.Interfaces/CDictionary.h | 55 +++++++++++++++++++++++++- cpp/Platform.Interfaces/CList.h | 34 +++++++++++++++- cpp/Platform.Interfaces/CSet.h | 36 ++++++++++++++++- examples/test_readonly_concepts | Bin 0 -> 75744 bytes examples/test_readonly_concepts.cpp | 53 +++++++++++++++++++++++++ 5 files changed, 175 insertions(+), 3 deletions(-) create mode 100755 examples/test_readonly_concepts create mode 100644 examples/test_readonly_concepts.cpp diff --git a/cpp/Platform.Interfaces/CDictionary.h b/cpp/Platform.Interfaces/CDictionary.h index ba2857b..8faa1e9 100644 --- a/cpp/Platform.Interfaces/CDictionary.h +++ b/cpp/Platform.Interfaces/CDictionary.h @@ -64,15 +64,68 @@ namespace Platform::Interfaces { return false; } + + template + consteval bool CReadonlyDictionaryHelpFunction() { + using Self = TRawSelf; + + using GenericKey = std::remove_reference_t(std::declval::Item>()))>; + using GenericValue = std::remove_reference_t(std::declval::Item>()))>; + + if constexpr (sizeof...(TArgs) == 0) { + return requires(const Self self, GenericKey generic_key) { + { self.find(generic_key) } -> std::forward_iterator; + { self.contains(generic_key) } -> std::same_as; + { self.empty() } -> std::same_as; + { self.size() } -> std::integral; + + requires std::ranges::forward_range; + }; + } + if constexpr (sizeof...(TArgs) == 1) { + return requires(const Self self, std::tuple args, + decltype(std::get<0>(args)) key) { + { self.find(key) } -> std::forward_iterator; + { self.contains(key) } -> std::same_as; + { self.empty() } -> std::same_as; + { self.size() } -> std::integral; + + requires std::ranges::forward_range; + }; + } + if constexpr (sizeof...(TArgs) == 2) { + return requires(const Self self, std::tuple args, + decltype(std::get<0>(args)) key) { + { self.find(key) } -> std::forward_iterator; + { self.contains(key) } -> std::same_as; + { self.empty() } -> std::same_as; + { self.size() } -> std::integral; + + requires std::ranges::forward_range; + }; + } + + return false; + } } // namespace Internal template concept CDictionary = CEnumerable && Internal::CDictionaryHelpFunction(); + template + concept CReadonlyDictionary = CEnumerable && Internal::CReadonlyDictionaryHelpFunction(); + template struct Dictionary : Enumerable { using base = Enumerable; using Key = decltype(std::get<0>(std::declval())); using Value = decltype(std::get<1>(std::declval())); }; -} // namespace Platform::Interfaces + + template + struct ReadonlyDictionary : Enumerable { + using base = Enumerable; + using Key = decltype(std::get<0>(std::declval())); + using Value = decltype(std::get<1>(std::declval())); + }; +} // namespace Platform::Interfaces \ No newline at end of file diff --git a/cpp/Platform.Interfaces/CList.h b/cpp/Platform.Interfaces/CList.h index a4ab17a..2fb9201 100644 --- a/cpp/Platform.Interfaces/CList.h +++ b/cpp/Platform.Interfaces/CList.h @@ -36,11 +36,43 @@ namespace Platform::Interfaces { return false; } + + template + consteval bool CReadonlyListHelpFunction() { + using Self = TRawSelf; + + if constexpr (sizeof...(TItems) == 1) { + return requires(const Self self, std::size_t index, std::tuple items, decltype(std::get<0>(items)) item, std::ranges::iterator_t const_iterator) { + { self.size() } -> std::integral; + { self.empty() } -> std::same_as; + { self[index] } -> std::convertible_to; + + requires std::ranges::forward_range; + }; + } + if constexpr (sizeof...(TItems) == 0) { + return requires(const Self self, std::size_t index, typename Enumerable::Item generic_item, typename Enumerable::Iter const_iterator) { + { self.size() } -> std::integral; + { self.empty() } -> std::same_as; + { self[index] } -> std::convertible_to; + + requires std::ranges::forward_range; + }; + } + + return false; + } } // namespace Internal template concept CList = CArray && Internal::CListHelpFunction(); + template + concept CReadonlyList = CArray && Internal::CReadonlyListHelpFunction(); + template struct List : Enumerable {}; -} // namespace Platform::Interfaces + + template + struct ReadonlyList : Enumerable {}; +} // namespace Platform::Interfaces \ No newline at end of file diff --git a/cpp/Platform.Interfaces/CSet.h b/cpp/Platform.Interfaces/CSet.h index 7f9bceb..781d6f5 100644 --- a/cpp/Platform.Interfaces/CSet.h +++ b/cpp/Platform.Interfaces/CSet.h @@ -43,11 +43,45 @@ namespace Platform::Interfaces { return false; } + template + consteval bool CReadonlySetHelpFunction() { + using Self = TRawSelf; + + if constexpr (sizeof...(TItems) == 1) { + return requires(const Self self, std::tuple items, decltype(std::get<0>(items)) item) { + { self.find(item) } -> std::same_as>; + { self.contains(item) } -> std::same_as; + { self.empty() } -> std::same_as; + { self.size() } -> std::integral; + + requires std::ranges::forward_range; + }; + } + if constexpr (sizeof...(TItems) == 0) { + return requires(const Self self, typename Enumerable::Item generic_item) { + { self.find(generic_item) } -> std::same_as>; + { self.contains(generic_item) } -> std::same_as; + { self.empty() } -> std::same_as; + { self.size() } -> std::integral; + + requires std::ranges::forward_range; + }; + } + + return false; + } + } // namespace Internal template concept CSet = CEnumerable && Internal::CSetHelpFunction(); + template + concept CReadonlySet = CEnumerable && Internal::CReadonlySetHelpFunction(); + template struct Set : Enumerable {}; -} // namespace Platform::Interfaces + + template + struct ReadonlySet : Enumerable {}; +} // namespace Platform::Interfaces \ No newline at end of file diff --git a/examples/test_readonly_concepts b/examples/test_readonly_concepts new file mode 100755 index 0000000000000000000000000000000000000000..b5bd049c6b6211987ac3f3baec22fcb451a3bd88 GIT binary patch literal 75744 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 C^t4|9 literal 0 HcmV?d00001 diff --git a/examples/test_readonly_concepts.cpp b/examples/test_readonly_concepts.cpp new file mode 100644 index 0000000..3b8339d --- /dev/null +++ b/examples/test_readonly_concepts.cpp @@ -0,0 +1,53 @@ +#include "../cpp/Platform.Interfaces/CDictionary.h" +#include "../cpp/Platform.Interfaces/CList.h" +#include "../cpp/Platform.Interfaces/CSet.h" +#include +#include +#include +#include + +using namespace Platform::Interfaces; + +// Test that const qualified types work with readonly concepts +void test_readonly_concepts() { + // Test with const std::map + const std::map const_map = {{1, "one"}, {2, "two"}}; + + // This should work with CReadonlyDictionary + static_assert(CReadonlyDictionary>); + + // Test with const std::vector + const std::vector const_vec = {1, 2, 3}; + + // This should work with CReadonlyList + static_assert(CReadonlyList>); + + // Test with const std::set + const std::set const_set = {1, 2, 3}; + + // This should work with CReadonlySet + static_assert(CReadonlySet>); + + std::cout << "All readonly concept tests passed!" << std::endl; +} + +// Test that regular concepts still work with non-const types +void test_mutable_concepts() { + std::map mutable_map; + std::vector mutable_vec; + std::set mutable_set; + + // These should work with regular concepts + static_assert(CDictionary>); + static_assert(CList>); + static_assert(CSet>); + + std::cout << "All mutable concept tests passed!" << std::endl; +} + +int main() { + test_readonly_concepts(); + test_mutable_concepts(); + std::cout << "All tests completed successfully!" << std::endl; + return 0; +} \ No newline at end of file