From 6726a96f0cf3c230e9caa2abd40fcfbf03fe73a4 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sun, 3 Nov 2024 19:08:01 +0100 Subject: A bunch of cleanup --- asl/assert.hpp | 4 +++ asl/meta.hpp | 39 +++++++++++----------- asl/option.hpp | 70 ++++++++++++++++++++-------------------- asl/tests/format_tests.cpp | 12 ++++++- asl/tests/functional_tests.cpp | 12 +++---- asl/tests/meta_tests.cpp | 73 +++++++++++++++++++++--------------------- asl/tests/option_tests.cpp | 32 +++++++++--------- 7 files changed, 127 insertions(+), 115 deletions(-) (limited to 'asl') diff --git a/asl/assert.hpp b/asl/assert.hpp index 4bf2eb3..d95159a 100644 --- a/asl/assert.hpp +++ b/asl/assert.hpp @@ -11,3 +11,7 @@ #define ASL_ASSERT(...) \ if (__VA_ARGS__) {} \ else { ASL_DEBUG_BREAK(); } + +#define ASL_ASSERT_RELEASE(...) \ + if (__VA_ARGS__) {} \ + else { ASL_DEBUG_BREAK(); } diff --git a/asl/meta.hpp b/asl/meta.hpp index 2085118..1d82739 100644 --- a/asl/meta.hpp +++ b/asl/meta.hpp @@ -24,7 +24,7 @@ template using select_t = _select_helper struct _is_same_helper : false_type {}; template struct _is_same_helper : true_type {}; -template concept is_same = _is_same_helper::value && _is_same_helper::value; +template concept same_as = _is_same_helper::value && _is_same_helper::value; template auto _as_lref_helper(int) -> id; template auto _as_lref_helper(...) -> id; @@ -43,38 +43,37 @@ template struct _un_ref_t { using type = T; }; template using un_ref_t = _un_ref_t::type; -template concept constructible = __is_constructible(T, Args...); +template concept constructible_from = __is_constructible(T, Args...); -template concept default_constructible = constructible; -template concept copy_constructible = constructible>; -template concept move_constructible = constructible>; +template concept default_constructible = constructible_from; +template concept copy_constructible = constructible_from>; +template concept move_constructible = constructible_from>; -template concept trivially_constructible = __is_trivially_constructible(T, Args...); +template concept trivially_constructible_from = __is_trivially_constructible(T, Args...); -template concept trivially_default_constructible = trivially_constructible; -template concept trivially_copy_constructible = trivially_constructible>; -template concept trivially_move_constructible = trivially_constructible>; +template concept trivially_default_constructible = trivially_constructible_from; +template concept trivially_copy_constructible = trivially_constructible_from>; +template concept trivially_move_constructible = trivially_constructible_from>; -template concept assignable = __is_assignable(T, Args...); +template concept assignable_from = __is_assignable(T, Args...); -template concept copy_assignable = assignable, as_lref_t>; -template concept move_assignable = assignable, as_rref_t>; +template concept copy_assignable = assignable_from, as_lref_t>; +template concept move_assignable = assignable_from, as_rref_t>; -template concept trivially_assignable = __is_trivially_assignable(T, Args...); +template concept trivially_assignable_from = __is_trivially_assignable(T, Args...); -template concept trivially_copy_assignable = trivially_assignable, as_lref_t>; -template concept trivially_move_assignable = trivially_assignable, as_rref_t>; +template concept trivially_copy_assignable = trivially_assignable_from, as_lref_t>; +template concept trivially_move_assignable = trivially_assignable_from, as_rref_t>; template concept trivially_destructible = __is_trivially_destructible(T); template concept trivially_copyable = __is_trivially_copyable(T); -// @Todo Rename concepts (_from) -template -concept convertible = __is_convertible(From, To); +template +concept convertible_from = __is_convertible(From, To); template -concept derived_from = __is_class(Derived) && __is_class(Base) && convertible; +concept derived_from = __is_class(Derived) && __is_class(Base) && convertible_from; using nullptr_t = decltype(nullptr); @@ -92,7 +91,7 @@ template using un_cv_t = un_volatile_t>; template using un_cvref_t = un_ref_t>; -template concept is_void = is_same>; +template concept is_void = same_as>; template struct _is_ref_helper { static constexpr bool l = false; static constexpr bool r = false; }; template struct _is_ref_helper { static constexpr bool l = true; static constexpr bool r = false; }; diff --git a/asl/option.hpp b/asl/option.hpp index 0c816f4..5f53ad8 100644 --- a/asl/option.hpp +++ b/asl/option.hpp @@ -23,24 +23,24 @@ namespace option_internal template concept convertible_from_option = - convertible&, T> && - convertible&, T> && - convertible&&, T> && - convertible&&, T>; + convertible_from&> && + convertible_from&> && + convertible_from&&> && + convertible_from&&>; template concept constructible_from_option = - constructible&> && - constructible&> && - constructible&&> && - constructible&&>; + constructible_from&> && + constructible_from&> && + constructible_from&&> && + constructible_from&&>; template concept assignable_from_option = - assignable&> && - assignable&> && - assignable&&> && - assignable&&>; + assignable_from&> && + assignable_from&> && + assignable_from&&> && + assignable_from&&>; template concept convertible_constructible_from_option = @@ -57,7 +57,7 @@ template concept is_option = requires { typename T::type; - requires is_same, option>; + requires same_as, option>; }; template @@ -112,11 +112,11 @@ public: constexpr option(nullopt_t) {} // NOLINT(*-explicit-conversions) template - constexpr explicit (!convertible) + constexpr explicit (!convertible_from) option(U&& value) requires ( - constructible && - !is_same, option> + constructible_from && + !same_as, option> ) { construct(ASL_FWD(value)); @@ -150,10 +150,10 @@ public: } template - constexpr explicit (!convertible) + constexpr explicit (!convertible_from) option(const option& other) requires ( - constructible && + constructible_from && !option_internal::convertible_constructible_from_option ) { @@ -164,10 +164,10 @@ public: } template - constexpr explicit (!convertible) + constexpr explicit (!convertible_from) option(option&& other) requires ( - constructible && + constructible_from && !option_internal::convertible_constructible_from_option ) { @@ -186,9 +186,9 @@ public: template constexpr option& operator=(U&& value) & requires ( - assignable && - constructible && - !is_same, option> + assignable_from && + constructible_from && + !same_as, option> ) { if (m_has_value) @@ -263,8 +263,8 @@ public: template constexpr option& operator=(const option& other) & requires ( - constructible && - assignable && + constructible_from && + assignable_from && !option_internal::convertible_constructible_assignable_from_option ) { @@ -290,8 +290,8 @@ public: template constexpr option& operator=(option&& other) & requires ( - constructible && - assignable && + constructible_from && + assignable_from && !option_internal::convertible_constructible_assignable_from_option ) { @@ -337,7 +337,7 @@ public: constexpr T&& value() && { - ASL_ASSERT(m_has_value); // @Todo Release assert + ASL_ASSERT_RELEASE(m_has_value); if constexpr (kIsTrivial) { return ASL_MOVE(m_payload); @@ -350,7 +350,7 @@ public: constexpr T& value() & { - ASL_ASSERT(m_has_value); // @Todo Release assert + ASL_ASSERT_RELEASE(m_has_value); if constexpr (kIsTrivial) { return m_payload; @@ -363,7 +363,7 @@ public: constexpr const T& value() const& { - ASL_ASSERT(m_has_value); // @Todo Release assert + ASL_ASSERT_RELEASE(m_has_value); if constexpr (kIsTrivial) { return m_payload; @@ -376,21 +376,21 @@ public: template constexpr T value_or(U&& other_value) const& - requires copy_constructible && convertible + requires copy_constructible && convertible_from { return has_value() ? value() : static_cast(ASL_FWD(other_value)); } template constexpr T value_or(U&& other_value) && - requires move_constructible && convertible + requires move_constructible && convertible_from { return has_value() ? ASL_MOVE(value()) : static_cast(ASL_FWD(other_value)); } template constexpr T& emplace(Args&&... args) & - requires constructible + requires constructible_from { if (m_has_value) { reset(); } construct(ASL_FWD(args)...); @@ -465,14 +465,14 @@ public: template constexpr option or_else(F&& f) const& - requires is_same>, option> + requires same_as>, option> { return has_value() ? *this : invoke(ASL_FWD(f)); } template constexpr option or_else(F&& f) && - requires is_same>, option> + requires same_as>, option> { return has_value() ? ASL_MOVE(*this) : invoke(ASL_FWD(f)); } diff --git a/asl/tests/format_tests.cpp b/asl/tests/format_tests.cpp index f4ca2cf..81395c2 100644 --- a/asl/tests/format_tests.cpp +++ b/asl/tests/format_tests.cpp @@ -34,7 +34,7 @@ public: } }; -ASL_TEST(Format) +ASL_TEST(format_args) { StringSink sink; @@ -79,7 +79,12 @@ ASL_TEST(Format) sink.reset(); asl::format(&sink, "{{{}}} }", "CHEESE"); ASL_TEST_ASSERT(strcmp(sink.cstr(), "{CHEESE} }") == 0); +} +ASL_TEST(format_integers) +{ + StringSink sink; + sink.reset(); asl::format(&sink, "{} {} {}", 0, 1, 2); ASL_TEST_ASSERT(strcmp(sink.cstr(), "0 1 2") == 0); @@ -99,7 +104,12 @@ ASL_TEST(Format) sink.reset(); asl::format(&sink, "{} {} {} {}", -1, -23, -456, -7890); ASL_TEST_ASSERT(strcmp(sink.cstr(), "-1 -23 -456 -7890") == 0); +} +ASL_TEST(format_boolean) +{ + StringSink sink; + sink.reset(); asl::format(&sink, "{} {}", true, false); ASL_TEST_ASSERT(strcmp(sink.cstr(), "true false") == 0); diff --git a/asl/tests/functional_tests.cpp b/asl/tests/functional_tests.cpp index 9aa15c7..f32e1b2 100644 --- a/asl/tests/functional_tests.cpp +++ b/asl/tests/functional_tests.cpp @@ -21,14 +21,14 @@ struct Functor static int some_func0() { return 1; } static int some_func1(int x) { return x + 1; } -static float some_func1(float x) { return x + 1; } +[[maybe_unused]] static float some_func1(float x) { return x + 1; } static int some_func2(int x, int b) { return x + b; } -static_assert(asl::is_same, int64_t>); -static_assert(asl::is_same, int>); -static_assert(asl::is_same(some_func1))(float)>, float>); -static_assert(asl::is_same, void>); -static_assert(asl::is_same, int>); +static_assert(asl::same_as, int64_t>); +static_assert(asl::same_as, int>); +static_assert(asl::same_as(some_func1))(float)>, float>); +static_assert(asl::same_as, void>); +static_assert(asl::same_as, int>); ASL_TEST(invoke_member_function) { diff --git a/asl/tests/meta_tests.cpp b/asl/tests/meta_tests.cpp index 0f5aa63..94edc50 100644 --- a/asl/tests/meta_tests.cpp +++ b/asl/tests/meta_tests.cpp @@ -1,17 +1,16 @@ #include "asl/meta.hpp" #include "asl/tests/test_types.hpp" -#include "asl/testing/testing.hpp" struct Struct {}; union Union {}; -enum Enum { EnumVariant = 0, }; -enum class EnumClass { Variant = 0, }; +enum Enum : uint8_t { EnumVariant = 0, }; +enum class EnumClass : uint8_t { Variant = 0, }; -static_assert(!asl::is_same); -static_assert(asl::is_same); +static_assert(!asl::same_as); +static_assert(asl::same_as); -static_assert(asl::is_same, float>); -static_assert(asl::is_same, int>); +static_assert(asl::same_as, float>); +static_assert(asl::same_as, int>); static_assert(asl::default_constructible); static_assert(asl::default_constructible); @@ -67,18 +66,18 @@ static_assert(asl::trivially_destructible); static_assert(asl::trivially_destructible); static_assert(!asl::trivially_destructible); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); static_assert(asl::is_void); static_assert(asl::is_void); @@ -108,14 +107,14 @@ static_assert(!asl::is_ptr); static_assert(!asl::is_ptr); static_assert(!asl::is_ptr); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); static_assert(asl::is_func); static_assert(asl::is_func); @@ -154,10 +153,10 @@ static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(!asl::is_array); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); -static_assert(asl::is_same>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); +static_assert(asl::same_as>); static_assert(asl::types_count == 2); static_assert(asl::types_count == 2); @@ -173,14 +172,14 @@ static_assert(asl::trivially_copyable); class Base {}; class Derived : public Base {}; class C {}; -class D { public: operator C() { return c; } C c; }; -class E { public: template E(T&&) {} }; - -static_assert(asl::convertible); -static_assert(!asl::convertible); -static_assert(asl::convertible); -static_assert(!asl::convertible); -static_assert(asl::convertible); +class D { public: operator C() { return c; } C c; }; // NOLINT +class E { public: template E(T&&) {} }; // NOLINT + +static_assert(asl::convertible_from); +static_assert(!asl::convertible_from); +static_assert(asl::convertible_from); +static_assert(!asl::convertible_from); +static_assert(asl::convertible_from); static_assert(asl::derived_from); static_assert(!asl::derived_from); diff --git a/asl/tests/option_tests.cpp b/asl/tests/option_tests.cpp index 12b62ae..4c65892 100644 --- a/asl/tests/option_tests.cpp +++ b/asl/tests/option_tests.cpp @@ -32,23 +32,23 @@ static_assert(asl::move_assignable>); static_assert(asl::move_assignable>); static_assert(!asl::move_assignable>); -static_assert(asl::assignable&, asl::option>); -static_assert(!asl::assignable&, asl::option>); +static_assert(asl::assignable_from&, asl::option>); +static_assert(!asl::assignable_from&, asl::option>); -static_assert(!asl::convertible, asl::option>); -static_assert(asl::convertible, asl::option>); +static_assert(asl::convertible_from, asl::option>); +static_assert(!asl::convertible_from, asl::option>); class ExplicitConversion { public: explicit ExplicitConversion(int) {} }; class ImplicitConversion { public: ImplicitConversion(int) {} }; // NOLINT -static_assert(!asl::convertible); -static_assert(asl::convertible); +static_assert(!asl::convertible_from); +static_assert(asl::convertible_from); -static_assert(!asl::convertible>); -static_assert(asl::convertible>); +static_assert(!asl::convertible_from, int>); +static_assert(asl::convertible_from, int>); -static_assert(!asl::convertible, asl::option>); -static_assert(asl::convertible, asl::option>); +static_assert(!asl::convertible_from, asl::option>); +static_assert(asl::convertible_from, asl::option>); static_assert(asl::trivially_copy_constructible>); static_assert(!asl::trivially_copy_constructible>); @@ -233,12 +233,12 @@ ASL_TEST(and_then) auto fn = [](int x) -> asl::option { return static_cast(x) + 0.5F; }; auto a2 = a.and_then(fn); - static_assert(asl::is_same>); + static_assert(asl::same_as>); ASL_TEST_ASSERT(a2.has_value()); ASL_TEST_EXPECT(a2.value() == 5.5F); auto b2 = b.and_then(fn); - static_assert(asl::is_same>); + static_assert(asl::same_as>); ASL_TEST_ASSERT(!b2.has_value()); } @@ -250,12 +250,12 @@ ASL_TEST(transform) auto fn = [](int x) -> float { return static_cast(x) + 0.5F; }; auto a2 = a.transform(fn); - static_assert(asl::is_same>); + static_assert(asl::same_as>); ASL_TEST_ASSERT(a2.has_value()); ASL_TEST_EXPECT(a2.value() == 5.5F); auto b2 = b.transform(fn); - static_assert(asl::is_same>); + static_assert(asl::same_as>); ASL_TEST_ASSERT(!b2.has_value()); } @@ -267,12 +267,12 @@ ASL_TEST(or_else) auto fn = []() -> asl::option { return 12; }; auto a2 = a.or_else(fn); - static_assert(asl::is_same>); + static_assert(asl::same_as>); ASL_TEST_ASSERT(a2.has_value()); ASL_TEST_EXPECT(a2.value() == 5); auto b2 = b.or_else(fn); - static_assert(asl::is_same>); + static_assert(asl::same_as>); ASL_TEST_ASSERT(b2.has_value()); ASL_TEST_EXPECT(b2.value() == 12); } -- cgit