From 298ee421d9dcb6af3d29833f4cf636bb088356fb Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 15 Aug 2024 00:58:37 +0200 Subject: Some work on pointers --- asl/BUILD.bazel | 5 ++- asl/integers.hpp | 2 + asl/meta.hpp | 51 ++++++++++++++++++++++++- asl/meta_tests.cpp | 41 ++++++++++++++++---- asl/object.hpp | 10 +++++ asl/object_tests.cpp | 1 + asl/ptr.hpp | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ asl/ptr_tests.cpp | 12 ++++++ asl/utility.hpp | 4 ++ 9 files changed, 222 insertions(+), 10 deletions(-) create mode 100644 asl/object.hpp create mode 100644 asl/object_tests.cpp create mode 100644 asl/ptr.hpp create mode 100644 asl/ptr_tests.cpp create mode 100644 asl/utility.hpp (limited to 'asl') diff --git a/asl/BUILD.bazel b/asl/BUILD.bazel index dc0aef8..710eaa8 100644 --- a/asl/BUILD.bazel +++ b/asl/BUILD.bazel @@ -3,6 +3,9 @@ cc_library( hdrs = [ "integers.hpp", "meta.hpp", + "object.hpp", + "ptr.hpp", + "utility.hpp", ], visibility = ["//visibility:public"], ) @@ -15,4 +18,4 @@ cc_library( deps = [ ":asl", ], -) for name in ["integers", "meta"]] +) for name in ["integers", "meta", "object", "ptr"]] diff --git a/asl/integers.hpp b/asl/integers.hpp index 07fa11e..b5d3e99 100644 --- a/asl/integers.hpp +++ b/asl/integers.hpp @@ -10,3 +10,5 @@ using uint16_t = unsigned short; using uint32_t = unsigned int; using uint64_t = unsigned long long; +using isize_t = int64_t; + diff --git a/asl/meta.hpp b/asl/meta.hpp index 15f7790..c55500a 100644 --- a/asl/meta.hpp +++ b/asl/meta.hpp @@ -8,6 +8,11 @@ template using bool_constant = integral_constant; using true_type = bool_constant; using false_type = bool_constant; +template struct _select_helper { using type = V; }; +template struct _select_helper { using type = U; }; + +template using select_t = _select_helper::type; + using nullptr_t = decltype(nullptr); template struct un_ref { using type = T; }; @@ -84,6 +89,50 @@ template concept is_member_object_ptr = is_member_ptr && !is_memb template concept is_fundamental = is_arithmetic || is_void || is_nullptr; template concept is_compound = !is_fundamental; template concept is_scalar = (is_fundamental && !is_void) || is_enum || is_ptr || is_member_ptr; -template concept is_object = is_scalar || is_array || is_class || is_union; +template concept is_object = is_scalar || is_class || is_union; + +template concept is_empty = is_void || __is_empty(T); + +struct empty {}; + +template using devoid_t = select_t, empty, T>; + +template struct _tame_helper { using type = F; }; + +#define ASL_TAME_IMPL(SUFFIX) \ + template \ + struct _tame_helper { using type = Ret(Args...); } + +ASL_TAME_IMPL(); +ASL_TAME_IMPL(const); +ASL_TAME_IMPL(volatile); +ASL_TAME_IMPL(volatile const); +ASL_TAME_IMPL(&&); +ASL_TAME_IMPL(const &&); +ASL_TAME_IMPL(volatile &&); +ASL_TAME_IMPL(volatile const &&); +ASL_TAME_IMPL(&); +ASL_TAME_IMPL(const &); +ASL_TAME_IMPL(volatile &); +ASL_TAME_IMPL(volatile const &); +ASL_TAME_IMPL(noexcept); +ASL_TAME_IMPL(const noexcept); +ASL_TAME_IMPL(volatile noexcept); +ASL_TAME_IMPL(volatile const noexcept); +ASL_TAME_IMPL(&& noexcept); +ASL_TAME_IMPL(const && noexcept); +ASL_TAME_IMPL(volatile && noexcept); +ASL_TAME_IMPL(volatile const && noexcept); +ASL_TAME_IMPL(& noexcept); +ASL_TAME_IMPL(const & noexcept); +ASL_TAME_IMPL(volatile & noexcept); +ASL_TAME_IMPL(volatile const & noexcept); + +#undef ASL_TAME_IMPL + +template using tame_t = _tame_helper::type; + +template using as_raw_ptr_t = un_ref_t>*; + } // namespace asl diff --git a/asl/meta_tests.cpp b/asl/meta_tests.cpp index f3d31f4..34603e6 100644 --- a/asl/meta_tests.cpp +++ b/asl/meta_tests.cpp @@ -1,5 +1,6 @@ #include "asl/meta.hpp" +struct EmptyStruct {}; struct Struct { int b: 4; }; union Union {}; @@ -550,15 +551,15 @@ static_assert(asl::is_object); static_assert(asl::is_object); static_assert(!asl::is_object); static_assert(!asl::is_object); -static_assert(asl::is_object); -static_assert(asl::is_object); -static_assert(asl::is_object); +static_assert(!asl::is_object); +static_assert(!asl::is_object); +static_assert(!asl::is_object); static_assert(!asl::is_object); static_assert(asl::is_object); -static_assert(asl::is_object); -static_assert(asl::is_object); -static_assert(asl::is_object); -static_assert(asl::is_object); +static_assert(!asl::is_object); +static_assert(!asl::is_object); +static_assert(!asl::is_object); +static_assert(!asl::is_object); static_assert(!asl::is_object); static_assert(asl::is_object); static_assert(asl::is_object); @@ -568,5 +569,29 @@ static_assert(asl::is_object); static_assert(asl::is_object); static_assert(asl::is_object); -int main() { return 0; } +static_assert(asl::is_empty); +static_assert(!asl::is_empty); +static_assert(asl::is_empty); +static_assert(!asl::is_empty); +static_assert(asl::is_empty); + +static_assert(asl::is_same, float>); +static_assert(asl::is_same, int>); + +static_assert(asl::is_same, int>); +static_assert(asl::is_same, asl::empty>); +static_assert(asl::is_same, asl::empty>); +static_assert(asl::is_same, int(float)>); +static_assert(asl::is_same, int(float)>); +static_assert(asl::is_same, int(float)>); +static_assert(asl::is_same, int(float)>); +static_assert(asl::is_same, int(float)>); +static_assert(asl::is_same, int(float)>); + +static_assert(asl::is_same, int*>); +static_assert(asl::is_same, const int*>); +static_assert(asl::is_same, int(*)(float)>); +static_assert(asl::is_same, int*>); + +int main() { return 0; } diff --git a/asl/object.hpp b/asl/object.hpp new file mode 100644 index 0000000..17e9ce4 --- /dev/null +++ b/asl/object.hpp @@ -0,0 +1,10 @@ +#pragma once + +namespace asl { + +template +class object final +{ +}; + +} // namespace asl diff --git a/asl/object_tests.cpp b/asl/object_tests.cpp new file mode 100644 index 0000000..2f38372 --- /dev/null +++ b/asl/object_tests.cpp @@ -0,0 +1 @@ +int main() { return 0; } diff --git a/asl/ptr.hpp b/asl/ptr.hpp new file mode 100644 index 0000000..70dfa7b --- /dev/null +++ b/asl/ptr.hpp @@ -0,0 +1,106 @@ +#pragma once + +#include "asl/integers.hpp" +#include "asl/meta.hpp" +#include "asl/utility.hpp" + +namespace asl { + +namespace ptr_internal { + +template +class object_meta +{ +public: + using pointee = T; + using metadata = empty; +}; + +template +class void_meta +{ +public: + using pointee = T; + using metadata = empty; +}; + +template +class array_meta; + +template +class array_meta +{ +public: + using pointee = T[N]; + using metadata = empty; +}; + +template +class array_meta +{ +public: + using pointee = T; + using metadata = isize_t; +}; + +template +class ptr_like_meta +{ + static_assert(is_func || is_ref); + +public: + using pointee = as_raw_ptr_t; + using metadata = empty; +}; + +template +constexpr auto get_meta() +{ + if constexpr (is_object) + { + return object_meta{}; + } + else if constexpr (is_void) + { + return void_meta{}; + } + else if constexpr (is_array) + { + return array_meta{}; + } + else if constexpr (is_ref || is_func) + { + return ptr_like_meta{}; + } +} + +template +using meta = decltype(get_meta()); + +} // namespace ptr_internal + +template +concept is_ptr_metadata = requires +{ + requires is_object || is_void || is_array; + requires is_object; +}; + +template +class ptr final +{ + using meta = ptr_internal::meta; + static_assert(is_ptr_metadata); + +public: + using pointee = meta::pointee; + using metadata = meta::metadata; + +private: + pointee* m_ptr = nullptr; + ASL_NO_UNIQUE_ADDRESS metadata m_metadata; + +public: +}; + +} // namespace asl diff --git a/asl/ptr_tests.cpp b/asl/ptr_tests.cpp new file mode 100644 index 0000000..316ae1d --- /dev/null +++ b/asl/ptr_tests.cpp @@ -0,0 +1,12 @@ +#include "asl/ptr.hpp" + +static_assert(sizeof(asl::ptr) == sizeof(int*)); +static_assert(sizeof(asl::ptr) == sizeof(void*)); +static_assert(sizeof(asl::ptr) == 2 * sizeof(int*)); +static_assert(sizeof(asl::ptr) == sizeof(int*)); +static_assert(sizeof(asl::ptr) == sizeof(int**)); +static_assert(sizeof(asl::ptr) == sizeof(void*)); +static_assert(sizeof(asl::ptr) == sizeof(void*)); +static_assert(sizeof(asl::ptr) == sizeof(int*)); + +int main() { return 0; } diff --git a/asl/utility.hpp b/asl/utility.hpp new file mode 100644 index 0000000..e8b9d86 --- /dev/null +++ b/asl/utility.hpp @@ -0,0 +1,4 @@ +#pragma once + +#define ASL_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]] + -- cgit