diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-08-30 07:35:12 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2024-08-30 07:35:12 +0200 |
commit | f0a94256e25c844ca2ff99377bc8b2fb94f69e84 (patch) | |
tree | 91f5973c567762a975ae5084b7b27217a17a64f5 /asl | |
parent | 2cd972bb3eed7886a6b1d0d1b3ead24c8cf3fe4f (diff) |
Fuse function and reference pointers
Diffstat (limited to 'asl')
-rw-r--r-- | asl/meta.hpp | 2 | ||||
-rw-r--r-- | asl/meta_tests.cpp | 3 | ||||
-rw-r--r-- | asl/ptr.hpp | 36 |
3 files changed, 18 insertions, 23 deletions
diff --git a/asl/meta.hpp b/asl/meta.hpp index 93bd1dd..6c650ac 100644 --- a/asl/meta.hpp +++ b/asl/meta.hpp @@ -2,8 +2,6 @@ namespace asl {
-template<typename... Args> struct types {};
-
struct empty {};
template<typename T> struct id { using type = T; };
diff --git a/asl/meta_tests.cpp b/asl/meta_tests.cpp index 210e735..a4f3ad8 100644 --- a/asl/meta_tests.cpp +++ b/asl/meta_tests.cpp @@ -161,4 +161,7 @@ static_assert(asl::is_same<int, asl::un_ref_t<int&>>); static_assert(asl::is_same<int, asl::un_ref_t<int&&>>);
static_assert(asl::is_same<int() &, asl::un_ref_t<int() &>>);
+using F = void(int) const &;
+using Fr = asl::tame_t<F>&;
+
int main() { return 0; }
diff --git a/asl/ptr.hpp b/asl/ptr.hpp index 9065e74..1da632a 100644 --- a/asl/ptr.hpp +++ b/asl/ptr.hpp @@ -11,16 +11,16 @@ namespace asl template<is_object T, isize_t kLen> struct span { - static constexpr bool kDynamic = kLen < 0; + static constexpr bool kIsDynamic = kLen < 0; - using size_type = select_t<kDynamic, isize_t, empty>; + using size_type = select_t<kIsDynamic, isize_t, empty>; - constexpr span(T* begin, isize_t len) requires kDynamic + constexpr span(T* begin, isize_t len) requires kIsDynamic : m_begin{begin} , m_len{len} {} - constexpr span(T* begin) requires (!kDynamic) + constexpr span(T* begin) requires (!kIsDynamic) : m_begin{begin} , m_len{} {} @@ -79,32 +79,26 @@ struct object_metadata constexpr auto deref(pointee* ptr) { return ptr; } }; -template<is_func T> -struct func_metadata +template<typename T> +struct ptr_like_metadata { using metadata = empty; - using pointee = tame_t<T>* const; + using pointee = un_ref_t<tame_t<T>>* const; constexpr auto deref(pointee* ptr) { return *ptr; } }; -template<is_ref T> -struct ref_metadata +template<typename T> +constexpr auto select_ptr_metadata() { - using metadata = empty; - using pointee = un_ref_t<T>* const; - - constexpr auto deref(pointee* ptr) { return *ptr; } -}; - -template<is_void T> void_metadata<T> select_ptr_metadata(types<T>); -template<is_array T> array_metadata<T> select_ptr_metadata(types<T>); -template<is_object T> object_metadata<T> select_ptr_metadata(types<T>) requires (!is_array<T>); -template<is_func T> func_metadata<T> select_ptr_metadata(types<T>); -template<is_ref T> ref_metadata<T> select_ptr_metadata(types<T>); + if constexpr (is_void<T>) return id<void_metadata<T>>{}; + else if constexpr (is_array<T>) return id<array_metadata<T>>{}; + else if constexpr (is_object<T>) return id<object_metadata<T>>{}; + else return id<ptr_like_metadata<T>>{}; +} template<typename T> -using metadata = decltype(select_ptr_metadata(types<T>{})); +using metadata = decltype(select_ptr_metadata<T>())::type; } // namespace ptr_internal |