#include #include namespace clanguml { namespace t00056 { template concept greater_than_simple = sizeof(T) > sizeof(L); template concept greater_than_with_requires = requires(T l, P r) { sizeof(l) > sizeof(r); }; // Constraint expression template concept max_four_bytes = sizeof(T) <= 4; // Simple requirement template concept iterable = requires(T container) { container.begin(); container.end(); }; // Type requirement template concept has_value_type = requires { typename T::value_type; }; template concept convertible_to_string = max_four_bytes && requires(T s) { std::string{s}; { std::to_string(s) } noexcept; { std::to_string(s) } -> std::same_as; }; // Compound requirement // ... // Combined concept template concept iterable_with_value_type = iterable && has_value_type; template concept iterable_or_small_value_type = iterable_with_value_type || max_four_bytes; // Simple type constraint template struct A { T a; }; // Requires constant expression template requires iterable_or_small_value_type struct B { T b; }; // Anonymous concept requirement (TODO) template requires requires(T t) { --t; t--; } struct C { T c; }; template requires max_four_bytes && max_four_bytes struct D { }; template requires greater_than_with_requires struct E { T1 e1; T2 e2; T3 e3; }; template requires greater_than_simple struct F { T1 f1; T2 f2; T3 f3; }; } }