diff options
Diffstat (limited to 'asl/base')
-rw-r--r-- | asl/base/meta.hpp | 7 | ||||
-rw-r--r-- | asl/base/meta_tests.cpp | 26 |
2 files changed, 15 insertions, 18 deletions
diff --git a/asl/base/meta.hpp b/asl/base/meta.hpp index 8376d5c..8bebf2f 100644 --- a/asl/base/meta.hpp +++ b/asl/base/meta.hpp @@ -87,14 +87,11 @@ template<typename T> concept trivially_destructible = __is_trivially_destructibl template<typename T> concept copyable = copy_constructible<T> && copy_assignable<T>; template<typename T> concept moveable = move_constructible<T> && move_assignable<T>; -template<typename To, typename From> -concept convertible_from = __is_convertible(From, To); - template<typename From, typename To> concept convertible_to = __is_convertible(From, To); template<typename Derived, class Base> -concept derived_from = __is_class(Derived) && __is_class(Base) && convertible_from<const volatile Base*, const volatile Derived*>; +concept derived_from = __is_class(Derived) && __is_class(Base) && convertible_to<const volatile Derived*, const volatile Base*>; using nullptr_t = decltype(nullptr); @@ -258,7 +255,7 @@ concept derefs_as = is_object<To> && (convertible_to<un_ref_t<From>&, To&> || _dereferenceable_as_convertible<un_ref_t<From>, To>); template<typename To, derefs_as<To> From> -constexpr auto&& deref(From&& from) // NOLINT(*forward*) +constexpr auto&& deref(From&& from) // NOLINT(*-missing-std-forward) { if constexpr (_dereferenceable_as_convertible<From, To>) { diff --git a/asl/base/meta_tests.cpp b/asl/base/meta_tests.cpp index 6c8efab..490b453 100644 --- a/asl/base/meta_tests.cpp +++ b/asl/base/meta_tests.cpp @@ -205,19 +205,19 @@ class C {}; class D { public: operator C() { return c; } C c; }; // NOLINT class E { public: template<class T> E(T&&) {} }; // NOLINT -static_assert(asl::convertible_from<Base*, Derived*>); -static_assert(!asl::convertible_from<Derived*, Base*>); -static_assert(asl::convertible_from<C, D>); -static_assert(!asl::convertible_from<C*, Derived*>); -static_assert(asl::convertible_from<E, Base>); - -static_assert(!asl::convertible_from<int16_t(&)[], int32_t(&)[]>); -static_assert(asl::convertible_from<const int16_t(&)[], int16_t(&)[]>); -static_assert(asl::convertible_from<const int16_t(&)[], const int16_t(&)[]>); -static_assert(asl::convertible_from<int16_t(&)[], int16_t(&)[]>); -static_assert(!asl::convertible_from<int32_t(&)[], int16_t(&)[]>); -static_assert(!asl::convertible_from<int16_t(&)[], const int16_t(&)[]>); -static_assert(!asl::convertible_from<C(&)[], D(&)[]>); +static_assert(asl::convertible_to<Derived*, Base*>); +static_assert(!asl::convertible_to<Base*, Derived*>); +static_assert(asl::convertible_to<D, C>); +static_assert(!asl::convertible_to<Derived*, C*>); +static_assert(asl::convertible_to<Base, E>); + +static_assert(!asl::convertible_to<int32_t(&)[], int16_t(&)[]>); +static_assert(asl::convertible_to<int16_t(&)[], const int16_t(&)[]>); +static_assert(asl::convertible_to<const int16_t(&)[], const int16_t(&)[]>); +static_assert(asl::convertible_to<int16_t(&)[], int16_t(&)[]>); +static_assert(!asl::convertible_to<int16_t(&)[], int32_t(&)[]>); +static_assert(!asl::convertible_to<const int16_t(&)[], int16_t(&)[]>); +static_assert(!asl::convertible_to<D(&)[], C(&)[]>); static_assert(asl::derived_from<Derived, Base>); static_assert(!asl::derived_from<Base, Derived>); |