Cleanup ugly code into concepts
This commit is contained in:
@ -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>);
|
||||||
|
Reference in New Issue
Block a user