From 4ad4091b38faa39ddd2deae7455bd3a26531994f Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Thu, 15 Aug 2024 23:35:01 +0200 Subject: Some work on object & init-related traits --- asl/BUILD.bazel | 1 + asl/meta.hpp | 35 ++++++++++++++++++++++++++++ asl/meta_tests.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ asl/object.hpp | 9 ++++++++ asl/object_tests.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++ asl/ptr.hpp | 2 ++ asl/test_types.hpp | 25 ++++++++++++++++++++ 7 files changed, 193 insertions(+) create mode 100644 asl/test_types.hpp (limited to 'asl') diff --git a/asl/BUILD.bazel b/asl/BUILD.bazel index 710eaa8..fbbceed 100644 --- a/asl/BUILD.bazel +++ b/asl/BUILD.bazel @@ -14,6 +14,7 @@ cc_library( name = "%s_tests" % name, srcs = [ "%s_tests.cpp" % name, + "test_types.hpp", ], deps = [ ":asl", diff --git a/asl/meta.hpp b/asl/meta.hpp index c55500a..614fa5d 100644 --- a/asl/meta.hpp +++ b/asl/meta.hpp @@ -2,6 +2,8 @@ namespace asl { +template struct id { using type = T; }; + template struct integral_constant { static constexpr T value = kValue; }; template using bool_constant = integral_constant; @@ -13,6 +15,39 @@ template struct _select_helper template using select_t = _select_helper::type; +template auto _as_lref_helper(int) -> id; +template auto _as_lref_helper(...) -> id; + +template auto _as_rref_helper(int) -> id; +template auto _as_rref_helper(...) -> id; + +template using as_lref_t = decltype(_as_lref_helper(0))::type; +template using as_rref_t = decltype(_as_rref_helper(0))::type; + +template concept constructible = __is_constructible(T, Args...); + +template concept default_constructible = constructible; +template concept copy_constructible = constructible>; +template concept move_constructible = constructible>; + +template concept trivially_constructible = __is_trivially_constructible(T, Args...); + +template concept trivially_default_constructible = trivially_constructible; +template concept trivially_copy_constructible = trivially_constructible>; +template concept trivially_move_constructible = trivially_constructible>; + +template concept assignable = __is_assignable(T, Args...); + +template concept copy_assignable = assignable, as_lref_t>; +template concept move_assignable = assignable, as_rref_t>; + +template concept trivially_assignable = __is_trivially_assignable(T, Args...); + +template concept trivially_copy_assignable = trivially_assignable, as_lref_t>; +template concept trivially_move_assignable = trivially_assignable, as_rref_t>; + +template concept trivially_destructible = __is_trivially_destructible(T); + using nullptr_t = decltype(nullptr); template struct un_ref { using type = T; }; diff --git a/asl/meta_tests.cpp b/asl/meta_tests.cpp index 34603e6..2be5c63 100644 --- a/asl/meta_tests.cpp +++ b/asl/meta_tests.cpp @@ -1,4 +1,5 @@ #include "asl/meta.hpp" +#include "asl/test_types.hpp" struct EmptyStruct {}; struct Struct { int b: 4; }; @@ -594,4 +595,68 @@ static_assert(asl::is_same, const int*>); static_assert(asl::is_same, int(*)(float)>); static_assert(asl::is_same, int*>); +static_assert(asl::default_constructible); +static_assert(asl::default_constructible); +static_assert(asl::default_constructible); +static_assert(!asl::default_constructible); + +static_assert(asl::trivially_default_constructible); +static_assert(asl::trivially_default_constructible); +static_assert(!asl::trivially_default_constructible); +static_assert(!asl::trivially_default_constructible); + +static_assert(asl::copy_constructible); +static_assert(asl::copy_constructible); +static_assert(asl::copy_constructible); +static_assert(!asl::copy_constructible); + +static_assert(asl::trivially_copy_constructible); +static_assert(asl::trivially_copy_constructible); +static_assert(!asl::trivially_copy_constructible); +static_assert(!asl::trivially_copy_constructible); + +static_assert(asl::move_constructible); +static_assert(asl::move_constructible); +static_assert(asl::move_constructible); +static_assert(!asl::move_constructible); + +static_assert(asl::trivially_move_constructible); +static_assert(asl::trivially_move_constructible); +static_assert(!asl::trivially_move_constructible); +static_assert(!asl::trivially_move_constructible); + +static_assert(asl::copy_assignable); +static_assert(asl::copy_assignable); +static_assert(asl::copy_assignable); +static_assert(!asl::copy_assignable); + +static_assert(asl::trivially_copy_assignable); +static_assert(!asl::trivially_copy_assignable); +static_assert(asl::trivially_copy_assignable); +static_assert(!asl::trivially_copy_assignable); + +static_assert(asl::move_assignable); +static_assert(asl::move_assignable); +static_assert(asl::move_assignable); +static_assert(!asl::move_assignable); + +static_assert(asl::trivially_move_assignable); +static_assert(!asl::trivially_move_assignable); +static_assert(asl::trivially_move_assignable); +static_assert(!asl::trivially_move_assignable); + +static_assert(asl::trivially_destructible); +static_assert(asl::trivially_destructible); +static_assert(!asl::trivially_destructible); + +static_assert(asl::is_same, int&>); +static_assert(asl::is_same, int&>); +static_assert(asl::is_same, int&>); +static_assert(asl::is_same, const void>); + +static_assert(asl::is_same, int&&>); +static_assert(asl::is_same, int&>); +static_assert(asl::is_same, int&&>); +static_assert(asl::is_same, const void>); + int main() { return 0; } diff --git a/asl/object.hpp b/asl/object.hpp index 936cd25..e45376d 100644 --- a/asl/object.hpp +++ b/asl/object.hpp @@ -12,6 +12,15 @@ class object final ASL_NO_UNIQUE_ADDRESS wrapped m_value; public: + object() requires default_constructible = default; + + object(const object&) = default; + object(object&&) = default; + + object& operator=(const object&) = default; + object& operator=(object&&) = default; + + ~object() = default; }; } // namespace asl diff --git a/asl/object_tests.cpp b/asl/object_tests.cpp index 794c540..e3d7d8d 100644 --- a/asl/object_tests.cpp +++ b/asl/object_tests.cpp @@ -1,4 +1,5 @@ #include "asl/object.hpp" +#include "asl/test_types.hpp" static_assert(asl::is_object>); static_assert(asl::is_object>); @@ -6,9 +7,64 @@ static_assert(asl::is_object>); static_assert(asl::is_object>); static_assert(asl::is_empty>); +static_assert(asl::is_empty>); static_assert(sizeof(asl::object) == 4); static_assert(sizeof(asl::object) == sizeof(void*)); static_assert(sizeof(asl::object) == sizeof(void*)); static_assert(sizeof(asl::object) == sizeof(void*)); +static_assert(asl::default_constructible>); +static_assert(asl::default_constructible>); +static_assert(asl::default_constructible>); +static_assert(!asl::default_constructible>); + +static_assert(asl::trivially_default_constructible>); +static_assert(asl::trivially_default_constructible>); +static_assert(!asl::trivially_default_constructible>); +static_assert(!asl::trivially_default_constructible>); + +static_assert(asl::copy_constructible>); +static_assert(asl::copy_constructible>); +static_assert(asl::copy_constructible>); +static_assert(!asl::copy_constructible>); + +static_assert(asl::trivially_copy_constructible>); +static_assert(asl::trivially_copy_constructible>); +static_assert(!asl::trivially_copy_constructible>); +static_assert(!asl::trivially_copy_constructible>); + +static_assert(asl::move_constructible>); +static_assert(asl::move_constructible>); +static_assert(asl::move_constructible>); +static_assert(!asl::move_constructible>); + +static_assert(asl::trivially_move_constructible>); +static_assert(asl::trivially_move_constructible>); +static_assert(!asl::trivially_move_constructible>); +static_assert(!asl::trivially_move_constructible>); + +static_assert(asl::copy_assignable>); +static_assert(asl::copy_assignable>); +static_assert(asl::copy_assignable>); +static_assert(!asl::copy_assignable>); + +static_assert(asl::trivially_copy_assignable>); +static_assert(!asl::trivially_copy_assignable>); +static_assert(asl::trivially_copy_assignable>); +static_assert(!asl::trivially_copy_assignable>); + +static_assert(asl::move_assignable>); +static_assert(asl::move_assignable>); +static_assert(asl::move_assignable>); +static_assert(!asl::move_assignable>); + +static_assert(asl::trivially_move_assignable>); +static_assert(!asl::trivially_move_assignable>); +static_assert(asl::trivially_move_assignable>); +static_assert(!asl::trivially_move_assignable>); + +static_assert(asl::trivially_destructible>); +static_assert(asl::trivially_destructible>); +static_assert(!asl::trivially_destructible>); + int main() { return 0; } diff --git a/asl/ptr.hpp b/asl/ptr.hpp index 70dfa7b..1da3f4e 100644 --- a/asl/ptr.hpp +++ b/asl/ptr.hpp @@ -6,6 +6,8 @@ namespace asl { +constexpr auto addr(auto&& ref) { return __builtin_addressof(ref); } + namespace ptr_internal { template diff --git a/asl/test_types.hpp b/asl/test_types.hpp new file mode 100644 index 0000000..a5207c6 --- /dev/null +++ b/asl/test_types.hpp @@ -0,0 +1,25 @@ +#pragma once + +struct DefaultConstructible { DefaultConstructible() {} }; +struct TriviallyDefaultConstructible { TriviallyDefaultConstructible() = default; }; +struct NonDefaultConstructible { NonDefaultConstructible() = delete; }; + +struct CopyConstructible { CopyConstructible(const CopyConstructible&) {} }; +struct TriviallyCopyConstructible { TriviallyCopyConstructible(const TriviallyCopyConstructible&) = default; }; +struct NonCopyConstructible { NonCopyConstructible(const NonCopyConstructible&) = delete; }; + +struct MoveConstructible { MoveConstructible(MoveConstructible&&) {} }; +struct TriviallyMoveConstructible { TriviallyMoveConstructible(TriviallyMoveConstructible&&) = default; }; +struct NonMoveConstructible { NonMoveConstructible(NonMoveConstructible&&) = delete; }; + +struct CopyAssignable { CopyAssignable& operator=(const CopyAssignable&) { return *this; } }; +struct TriviallyCopyAssignable { TriviallyCopyAssignable& operator=(const TriviallyCopyAssignable&) = default; }; +struct NoCopyAssignable { NoCopyAssignable& operator=(const NoCopyAssignable&) = delete; }; + +struct MoveAssignable { MoveAssignable& operator=(MoveAssignable&&) { return *this; } }; +struct TriviallyMoveAssignable { TriviallyMoveAssignable& operator=(TriviallyMoveAssignable&&) = default; }; +struct NoMoveAssignable { NoMoveAssignable& operator=(NoMoveAssignable&&) = delete; }; + +struct TriviallyDestructible { ~TriviallyDestructible() = default; }; +struct HasDestructor { ~HasDestructor() {} }; + -- cgit