// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include #include #include namespace rocRoller { template concept CIsAnyOf = (std::same_as || ...); static_assert(CIsAnyOf); static_assert(CIsAnyOf); static_assert(!CIsAnyOf); // clang-format off template concept CHasToStringMember = requires(T const& x) { !std::convertible_to; { x.toString() } -> std::convertible_to; }; template concept CHasToString = requires(T const& x) { !std::convertible_to; { toString(x) } -> std::convertible_to; }; /** * Matches enumerations that are scoped, that have a Count member, and that * can be converted to string with toString(). */ template concept CCountedEnum = requires() { requires std::regular; requires CHasToString; { T::Count } -> std::convertible_to; { static_cast>(T::Count) } -> std::convertible_to>; }; template concept CForwardRangeOf = requires() { requires std::ranges::forward_range; requires std::convertible_to, Of>; }; template concept CInputRangeOf = requires() { requires std::ranges::input_range>; requires std::convertible_to>, Of>; }; template concept CHasName = requires(T const& obj) { { name(obj) } -> std::convertible_to; }; // clang-format on static_assert(CForwardRangeOf, int>); static_assert(CForwardRangeOf, int>); static_assert(CForwardRangeOf, int>); static_assert(CForwardRangeOf, int>); static_assert(CForwardRangeOf, int>); static_assert(!CForwardRangeOf, int>); static_assert(!CForwardRangeOf); template concept CPointer = requires() { requires std::is_pointer_v; }; static_assert(!CPointer); static_assert(CPointer); static_assert(CPointer); static_assert(CPointer); static_assert(CPointer); template concept CHashable = requires(T a) { { std::hash{}(a) } -> std::convertible_to; }; }