Cleanup ugly code into concepts

This commit is contained in:
2024-11-15 00:16:58 +01:00
parent 678ed0ed00
commit 58200ce939

View File

@ -95,14 +95,7 @@ ASL_TEST(conversion)
} }
template<typename Span, isize_t kOffset, isize_t kSize = asl::dynamic_size> template<typename Span, isize_t kOffset, isize_t kSize = asl::dynamic_size>
[[maybe_unused]] static auto try_static_subspan(int) concept IsValidSubspan = requires (Span s) { s.template subspan<kOffset, kSize>(); };
-> decltype(asl::declval<Span>().template subspan<kOffset, kSize>());
template<typename, isize_t, isize_t>
[[maybe_unused]] static auto try_static_subspan(...) -> asl::empty;
template<typename Span, isize_t kOffset, isize_t kSize = asl::dynamic_size>
concept invalid_subspan = asl::same_as<decltype(try_static_subspan<Span, kOffset, kSize>(0)), asl::empty>;
static_assert(asl::same_as<asl::span<int, 4>, static_assert(asl::same_as<asl::span<int, 4>,
decltype(asl::declval<asl::span<int, 4>>().subspan<0>())>); decltype(asl::declval<asl::span<int, 4>>().subspan<0>())>);
@ -119,7 +112,7 @@ static_assert(asl::same_as<asl::span<int, 1>,
static_assert(asl::same_as<asl::span<int, 0>, static_assert(asl::same_as<asl::span<int, 0>,
decltype(asl::declval<asl::span<int, 4>>().subspan<4>())>); decltype(asl::declval<asl::span<int, 4>>().subspan<4>())>);
static_assert(invalid_subspan<asl::span<int, 4>, 5>); static_assert(!IsValidSubspan<asl::span<int, 4>, 5>);
static_assert(asl::same_as<asl::span<int>, static_assert(asl::same_as<asl::span<int>,
decltype(asl::declval<asl::span<int>>().subspan<0>())>); decltype(asl::declval<asl::span<int>>().subspan<0>())>);
@ -136,7 +129,7 @@ static_assert(asl::same_as<asl::span<int, 2>,
static_assert(asl::same_as<asl::span<int, 2>, static_assert(asl::same_as<asl::span<int, 2>,
decltype(asl::declval<asl::span<int, 4>>().subspan<2, 2>())>); decltype(asl::declval<asl::span<int, 4>>().subspan<2, 2>())>);
static_assert(invalid_subspan<asl::span<int, 4>, 2, 3>); static_assert(!IsValidSubspan<asl::span<int, 4>, 2, 3>);
ASL_TEST(subspan_static_from_static) ASL_TEST(subspan_static_from_static)
{ {
@ -217,14 +210,7 @@ ASL_TEST(subspan_dynamic)
} }
template<typename Span, isize_t kSize> template<typename Span, isize_t kSize>
[[maybe_unused]] static auto try_static_first(int) concept IsValidFirst = requires (Span s) { s.template first<kSize>(); };
-> decltype(asl::declval<Span>().template first<kSize>());
template<typename, isize_t>
[[maybe_unused]] static auto try_static_first(...) -> asl::empty;
template<typename Span, isize_t kSize>
concept invalid_first = asl::same_as<decltype(try_static_first<Span, kSize>(0)), asl::empty>;
static_assert(asl::same_as<asl::span<int, 0>, static_assert(asl::same_as<asl::span<int, 0>,
decltype(asl::declval<asl::span<int>>().first<0>())>); decltype(asl::declval<asl::span<int>>().first<0>())>);
@ -253,9 +239,8 @@ static_assert(asl::same_as<asl::span<int, 3>,
static_assert(asl::same_as<asl::span<int, 4>, static_assert(asl::same_as<asl::span<int, 4>,
decltype(asl::declval<asl::span<int, 4>>().first<4>())>); decltype(asl::declval<asl::span<int, 4>>().first<4>())>);
static_assert(invalid_first<asl::span<int, 4>, 5>); static_assert(!IsValidFirst<asl::span<int, 4>, 5>);
static_assert(!IsValidFirst<asl::span<int, 4>, asl::dynamic_size>);
static_assert(invalid_first<asl::span<int, 4>, asl::dynamic_size>);
ASL_TEST(first_static_from_static) ASL_TEST(first_static_from_static)
{ {
@ -321,14 +306,7 @@ ASL_TEST(first_dynamic)
} }
template<typename Span, isize_t kSize> template<typename Span, isize_t kSize>
[[maybe_unused]] static auto try_static_last(int) concept IsValidLast = requires (Span s) { s.template last<kSize>(); };
-> decltype(asl::declval<Span>().template last<kSize>());
template<typename, isize_t>
[[maybe_unused]] static auto try_static_last(...) -> asl::empty;
template<typename Span, isize_t kSize>
concept invalid_last = asl::same_as<decltype(try_static_last<Span, kSize>(0)), asl::empty>;
static_assert(asl::same_as<asl::span<int, 0>, static_assert(asl::same_as<asl::span<int, 0>,
decltype(asl::declval<asl::span<int>>().last<0>())>); decltype(asl::declval<asl::span<int>>().last<0>())>);
@ -357,9 +335,8 @@ static_assert(asl::same_as<asl::span<int, 3>,
static_assert(asl::same_as<asl::span<int, 4>, static_assert(asl::same_as<asl::span<int, 4>,
decltype(asl::declval<asl::span<int, 4>>().last<4>())>); decltype(asl::declval<asl::span<int, 4>>().last<4>())>);
static_assert(invalid_last<asl::span<int, 4>, 5>); static_assert(!IsValidLast<asl::span<int, 4>, 5>);
static_assert(!IsValidLast<asl::span<int, 4>, asl::dynamic_size>);
static_assert(invalid_last<asl::span<int, 4>, asl::dynamic_size>);
ASL_TEST(last_static_from_static) ASL_TEST(last_static_from_static)
{ {
@ -425,10 +402,7 @@ ASL_TEST(last_dynamic)
} }
template<typename T> template<typename T>
concept HasAsMutableBytes = requires(asl::span<T> s) concept HasAsMutableBytes = requires(asl::span<T> s) { asl::as_mutable_bytes(s); };
{
asl::as_mutable_bytes(s);
};
static_assert(HasAsMutableBytes<int>); static_assert(HasAsMutableBytes<int>);
static_assert(!HasAsMutableBytes<const int>); static_assert(!HasAsMutableBytes<const int>);