From f0a94256e25c844ca2ff99377bc8b2fb94f69e84 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Fri, 30 Aug 2024 07:35:12 +0200 Subject: Fuse function and reference pointers --- asl/meta.hpp | 2 -- asl/meta_tests.cpp | 3 +++ 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 struct types {}; - struct empty {}; template 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>); static_assert(asl::is_same>); static_assert(asl::is_same>); +using F = void(int) const &; +using Fr = asl::tame_t&; + 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 struct span { - static constexpr bool kDynamic = kLen < 0; + static constexpr bool kIsDynamic = kLen < 0; - using size_type = select_t; + using size_type = select_t; - 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 -struct func_metadata +template +struct ptr_like_metadata { using metadata = empty; - using pointee = tame_t* const; + using pointee = un_ref_t>* const; constexpr auto deref(pointee* ptr) { return *ptr; } }; -template -struct ref_metadata +template +constexpr auto select_ptr_metadata() { - using metadata = empty; - using pointee = un_ref_t* const; - - constexpr auto deref(pointee* ptr) { return *ptr; } -}; - -template void_metadata select_ptr_metadata(types); -template array_metadata select_ptr_metadata(types); -template object_metadata select_ptr_metadata(types) requires (!is_array); -template func_metadata select_ptr_metadata(types); -template ref_metadata select_ptr_metadata(types); + if constexpr (is_void) return id>{}; + else if constexpr (is_array) return id>{}; + else if constexpr (is_object) return id>{}; + else return id>{}; +} template -using metadata = decltype(select_ptr_metadata(types{})); +using metadata = decltype(select_ptr_metadata())::type; } // namespace ptr_internal -- cgit