diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-03-26 18:54:53 +0100 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-03-26 18:54:53 +0100 |
commit | e034efe8bd911ae86447dbae7e10e57c7247d3c7 (patch) | |
tree | b67a5ec6e01d6bf7fce09d5bf9ff7066dfe5deff | |
parent | 2c457c42758f1aeb5e2ec15f89b9702586328220 (diff) |
Add member pointer stuff to meta lib
-rw-r--r-- | asl/base/meta.hpp | 11 | ||||
-rw-r--r-- | asl/base/meta_tests.cpp | 26 |
2 files changed, 37 insertions, 0 deletions
diff --git a/asl/base/meta.hpp b/asl/base/meta.hpp index 93e5603..b17f05c 100644 --- a/asl/base/meta.hpp +++ b/asl/base/meta.hpp @@ -194,6 +194,17 @@ template<typename R, typename... Args> struct _is_func_helper<R(Args...)> : true template<typename T> concept is_func = _is_func_helper<tame_t<T>>::value; +template<typename T> struct _is_member_ptr_helper : false_type {}; +template<typename C, typename T> struct _is_member_ptr_helper<T C::*> : true_type +{ + static constexpr bool kIsFunc = is_func<T>; +}; + +template<typename T> concept is_member_ptr = _is_member_ptr_helper<un_cv_t<T>>::value; + +template<typename T> concept is_member_func_ptr = is_member_ptr<T> && _is_member_ptr_helper<un_cv_t<T>>::kIsFunc; +template<typename T> concept is_member_data_ptr = is_member_ptr<T> && !_is_member_ptr_helper<un_cv_t<T>>::kIsFunc; + template<typename T> concept is_object = !is_void<T> && !is_ref<T> && !is_func<T>; template<typename T> struct _array_helper : false_type { using type = T; }; diff --git a/asl/base/meta_tests.cpp b/asl/base/meta_tests.cpp index bcd9775..65f367a 100644 --- a/asl/base/meta_tests.cpp +++ b/asl/base/meta_tests.cpp @@ -135,6 +135,12 @@ static_assert(!asl::is_ref<void>); static_assert(!asl::is_ref<void()>); static_assert(!asl::is_ref<void() const &&>); +struct MyClass +{ + int data; + int fn(int x) { return x; } // NOLINT +}; + static_assert(asl::is_ptr<int*>); static_assert(asl::is_ptr<const int* const>); static_assert(asl::is_ptr<const volatile int*>); @@ -142,6 +148,26 @@ static_assert(!asl::is_ptr<int>); static_assert(!asl::is_ptr<void>); static_assert(!asl::is_ptr<void()>); static_assert(!asl::is_ptr<void() const &&>); +static_assert(!asl::is_ptr<int MyClass::*>); +static_assert(!asl::is_ptr<int (MyClass::*)(int)>); + +static_assert(!asl::is_member_ptr<int*>); +static_assert(!asl::is_member_ptr<void()>); +static_assert(!asl::is_member_ptr<void() const &&>); +static_assert(asl::is_member_ptr<int MyClass::*>); +static_assert(asl::is_member_ptr<int (MyClass::*)(int)>); + +static_assert(!asl::is_member_data_ptr<int*>); +static_assert(!asl::is_member_data_ptr<void()>); +static_assert(!asl::is_member_data_ptr<void() const &&>); +static_assert(asl::is_member_data_ptr<int MyClass::*>); +static_assert(!asl::is_member_data_ptr<int (MyClass::*)(int)>); + +static_assert(!asl::is_member_func_ptr<int*>); +static_assert(!asl::is_member_func_ptr<void()>); +static_assert(!asl::is_member_func_ptr<void() const &&>); +static_assert(!asl::is_member_func_ptr<int MyClass::*>); +static_assert(asl::is_member_func_ptr<int (MyClass::*)(int)>); static_assert(asl::same_as<int, asl::tame_t<int>>); static_assert(asl::same_as<int(), asl::tame_t<int()>>); |