diff --git a/experimental/builder/include/ck_tile/builder/builder_utils.hpp b/experimental/builder/include/ck_tile/builder/builder_utils.hpp new file mode 100644 index 0000000000..2b60489791 --- /dev/null +++ b/experimental/builder/include/ck_tile/builder/builder_utils.hpp @@ -0,0 +1,58 @@ +#pragma once +#include + +namespace ck_tile::builder { + +// Convert a static array to a sequence +// Usage example: +// static constexpr std::vector arr {1, 2, 3}; +// using seq = to_sequence_v; // seq is ck::Sequence<1, 2, 3> +template +struct to_sequence_t +{ + private: + template + static auto get_sequence_type(std::index_sequence) -> ck::Sequence; + + // Helper to handler the .Size() method name in ck::Array. + static constexpr auto get_size(const auto& arr) + { + if constexpr(requires { arr.size(); }) + { + return arr.size(); + } + else + { + return arr.Size(); + } + } + + public: + using value = decltype(get_sequence_type(std::make_index_sequence{})); +}; + +template +using to_sequence_v = typename to_sequence_t, Arr>::value; + +// Wrapper function to make constexpr strings a structural type for NTTP. +template +struct StringLiteral { + char data[N]; + constexpr StringLiteral(const char (&str)[N]) { + for (size_t i = 0; i < N; ++i) data[i] = str[i]; + } + + constexpr bool operator==(const StringLiteral& other) const { + for (size_t i = 0; i < N; ++i) { + if (data[i] != other.data[i]) { + return false; + } + } + return true; + } +}; + +template +StringLiteral(const char (&)[N]) -> StringLiteral; + +} // namespace ck_tile::builder diff --git a/experimental/builder/test/test_builder_utils.cpp b/experimental/builder/test/test_builder_utils.cpp new file mode 100644 index 0000000000..b2af9e0cbc --- /dev/null +++ b/experimental/builder/test/test_builder_utils.cpp @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +#include + +namespace ck_tile::builder { +namespace { + +TEST(BuilderUtils, ToSequence) +{ + static constexpr std::array test_arr{1, 2, 8, 16}; + using result_seq = to_sequence_v; + using expected_seq = ck::Sequence<1, 2, 8, 16>; + EXPECT_TRUE((std::is_same_v)); +} + +TEST(BuilderUtils, ToSequenceEmpty) +{ + static constexpr std::array test_arr{}; + using result_seq = to_sequence_v; + using expected_seq = ck::Sequence<>; + EXPECT_TRUE((std::is_same_v)); +} + +Test(BuilderUtils, ConstexprString) +{ + static constexpr ConstexprString str1{"hello"}; + static constexpr ConstexprString str2{"hello"}; + static constexpr ConstexprString str3{"world"}; + EXPECT_TRUE(str1 == str2); + EXPECT_FALSE(str1 == str3); +}; + +} // namespace +} // namespace ck_tile::builder