summaryrefslogtreecommitdiff
path: root/asl
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-08-30 07:35:12 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-08-30 07:35:12 +0200
commitf0a94256e25c844ca2ff99377bc8b2fb94f69e84 (patch)
tree91f5973c567762a975ae5084b7b27217a17a64f5 /asl
parent2cd972bb3eed7886a6b1d0d1b3ead24c8cf3fe4f (diff)
Fuse function and reference pointers
Diffstat (limited to 'asl')
-rw-r--r--asl/meta.hpp2
-rw-r--r--asl/meta_tests.cpp3
-rw-r--r--asl/ptr.hpp36
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