From f0a94256e25c844ca2ff99377bc8b2fb94f69e84 Mon Sep 17 00:00:00 2001
From: Steven Le Rouzic <steven.lerouzic@gmail.com>
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(-)

(limited to 'asl')

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
 
-- 
cgit