// Copyright 2025 Steven Le Rouzic // // SPDX-License-Identifier: BSD-3-Clause #include "asl/base/meta.hpp" #include "asl/tests/types.hpp" #include "asl/testing/testing.hpp" #include "asl/types/box.hpp" struct Struct {}; union Union {}; enum Enum : uint8_t { EnumVariant = 0, }; enum class EnumClass : uint8_t { Variant = 0, }; static_assert(!asl::same_as); static_assert(asl::same_as); static_assert(asl::same_as, float>); static_assert(asl::same_as, int>); 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::copy_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::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::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::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::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::trivially_copy_assignable); static_assert(!asl::trivially_copy_assignable); static_assert(!asl::trivially_copy_assignable); static_assert(asl::copyable); static_assert(asl::copyable); static_assert(asl::copyable); static_assert(!asl::copyable); static_assert(!asl::copyable); static_assert(asl::moveable); static_assert(asl::moveable); static_assert(asl::moveable); static_assert(asl::moveable); static_assert(!asl::moveable); static_assert(asl::move_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_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::trivially_destructible); static_assert(asl::trivially_destructible); static_assert(asl::trivially_destructible); static_assert(asl::trivially_destructible); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::is_void); static_assert(asl::is_void); static_assert(asl::is_void); static_assert(asl::is_void); static_assert(!asl::is_void); static_assert(!asl::is_void); static_assert(!asl::is_void); static_assert(!asl::is_void); static_assert(!asl::is_void); static_assert(!asl::is_void); static_assert(asl::is_ref); static_assert(asl::is_ref); static_assert(asl::is_ref); static_assert(asl::is_ref); static_assert(!asl::is_ref); static_assert(!asl::is_ref); static_assert(!asl::is_ref); static_assert(!asl::is_ref); struct MyClass { int data; int fn(int x) { return x; } // NOLINT }; static_assert(asl::is_ptr); static_assert(asl::is_ptr); static_assert(asl::is_ptr); static_assert(!asl::is_ptr); static_assert(!asl::is_ptr); static_assert(!asl::is_ptr); static_assert(!asl::is_ptr); static_assert(!asl::is_ptr); static_assert(!asl::is_ptr); static_assert(!asl::is_member_ptr); static_assert(!asl::is_member_ptr); static_assert(!asl::is_member_ptr); static_assert(asl::is_member_ptr); static_assert(asl::is_member_ptr); static_assert(!asl::is_member_data_ptr); static_assert(!asl::is_member_data_ptr); static_assert(!asl::is_member_data_ptr); static_assert(asl::is_member_data_ptr); static_assert(!asl::is_member_data_ptr); static_assert(!asl::is_member_func_ptr); static_assert(!asl::is_member_func_ptr); static_assert(!asl::is_member_func_ptr); static_assert(!asl::is_member_func_ptr); static_assert(asl::is_member_func_ptr); static_assert(asl::is_member_func_ptr); static_assert(asl::is_member_func_ptr); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::is_func); static_assert(asl::is_func); static_assert(asl::is_func); static_assert(asl::is_func); static_assert(asl::is_func); static_assert(asl::is_func); static_assert(!asl::is_func); static_assert(!asl::is_func); static_assert(!asl::is_func); static_assert(!asl::is_func); 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_array); static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(asl::is_array); static_assert(asl::is_array); static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(!asl::is_array); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::same_as>); static_assert(asl::types_count == 2); static_assert(asl::types_count == 2); static_assert(asl::types_count == 1); static_assert(asl::types_count<> == 0); class Base {}; class Derived : public Base {}; class C {}; class D { public: operator C() { return c; } C c; }; // NOLINT class E { public: template E(T&&) {} }; // NOLINT static_assert(asl::convertible_to); static_assert(!asl::convertible_to); static_assert(asl::convertible_to); static_assert(!asl::convertible_to); static_assert(asl::convertible_to); static_assert(!asl::convertible_to); static_assert(asl::convertible_to); static_assert(asl::convertible_to); static_assert(asl::convertible_to); static_assert(!asl::convertible_to); static_assert(!asl::convertible_to); static_assert(!asl::convertible_to); static_assert(asl::derived_from); static_assert(asl::derived_from); static_assert(asl::derived_from); static_assert(!asl::derived_from); static_assert(!asl::derived_from); static_assert(!asl::derived_from); static_assert(!asl::derived_from); static_assert(!asl::derived_from); static_assert(!asl::derived_from); static_assert(asl::same_or_derived_from); static_assert(asl::same_or_derived_from); static_assert(asl::same_or_derived_from); static_assert(!asl::same_or_derived_from); static_assert(!asl::same_or_derived_from); static_assert(!asl::same_or_derived_from); static_assert(!asl::same_or_derived_from); static_assert(!asl::same_or_derived_from); static_assert(asl::same_or_derived_from); static_assert(!asl::is_const); static_assert(asl::is_const); static_assert(!asl::is_const); static_assert(!asl::is_const); static_assert(asl::is_const); static_assert(asl::is_floating_point); static_assert(asl::is_floating_point); static_assert(asl::is_floating_point); static_assert(!asl::is_floating_point); static_assert(!asl::is_floating_point); static_assert(!asl::is_floating_point); static_assert(asl::uniquely_represented); static_assert(asl::uniquely_represented); static_assert(!asl::uniquely_represented); enum Enum1 {}; enum class Enum2 {}; static_assert(asl::uniquely_represented); static_assert(asl::uniquely_represented); static_assert(!asl::is_enum); static_assert(asl::is_enum); static_assert(asl::is_enum); static_assert(asl::derefs_as); static_assert(asl::derefs_as); static_assert(!asl::derefs_as); static_assert(asl::derefs_as); static_assert(!asl::derefs_as); static_assert(asl::derefs_as, int>); static_assert(asl::derefs_as); static_assert(!asl::derefs_as); static_assert(asl::derefs_as); static_assert(asl::derefs_as); static_assert(!asl::derefs_as); static_assert(asl::derefs_as, Base>); static_assert(asl::derefs_as, Derived>); static_assert(asl::derefs_as, Base>); static void wants_int(int) {} static void wants_base(const Base&) {} static void wants_base_ptr(Base*) {} ASL_TEST(deref) { int a = 4; auto b = asl::make_box(5); wants_int(asl::deref(5)); wants_int(asl::deref(a)); wants_int(asl::deref(&a)); wants_int(asl::deref(b)); Derived c{}; auto d = asl::make_box(); wants_base(asl::deref(Derived{})); wants_base(asl::deref(c)); wants_base(asl::deref(&c)); wants_base(asl::deref(d)); wants_base_ptr(&asl::deref(c)); wants_base_ptr(&asl::deref(&c)); wants_base_ptr(&asl::deref(d)); wants_base(asl::deref(std::move(d))); } static_assert(asl::same_as, float>); static_assert(asl::same_as, float>); static_assert(asl::same_as, float>); static_assert(asl::same_as, float>); static_assert(asl::same_as, float&&>); static_assert(asl::same_as, float&&>); static_assert(asl::same_as, float&&>); static_assert(asl::same_as, float&&>); static_assert(asl::same_as, const float>); static_assert(asl::same_as, const float>); static_assert(asl::same_as, const float>); static_assert(asl::same_as, const float>); static_assert(asl::same_as, const float&>); static_assert(asl::same_as, const float&>); static_assert(asl::same_as, const float&>); static_assert(asl::same_as, const float&>); static_assert(asl::same_as, float>); static_assert(asl::same_as, float>); static_assert(asl::same_as, const float>); static_assert(asl::same_as, const float>); static_assert(asl::same_as, float>); static_assert(asl::same_as, const float>); static_assert(asl::same_as, int>); static_assert(!asl::same_as, float>); static_assert(asl::same_as, int>); static_assert(asl::same_as, int>); static_assert(asl::same_as, int>); static_assert(asl::same_as, int*>); static_assert(!asl::same_as, int*>); static_assert(!asl::same_as, int**>); static_assert(asl::same_as, int(*)[2]>); static_assert(asl::same_as, int(*)(int)>); enum EnumU8 : uint8_t {}; enum EnumI64 : int64_t {}; static_assert(asl::same_as, uint8_t>); static_assert(asl::same_as, int64_t>); static_assert(!asl::is_integer); static_assert(!asl::is_integer); static_assert(asl::same_as, uint8_t>); static_assert(asl::same_as, uint16_t>); static_assert(asl::same_as, uint32_t>); static_assert(asl::same_as, uint64_t>); static_assert(asl::same_as, uint8_t>); static_assert(asl::same_as, uint16_t>); static_assert(asl::same_as, uint32_t>); static_assert(asl::same_as, uint64_t>); static_assert(asl::same_as, int8_t>); static_assert(asl::same_as, int16_t>); static_assert(asl::same_as, int32_t>); static_assert(asl::same_as, int64_t>); static_assert(asl::same_as, int8_t>); static_assert(asl::same_as, int16_t>); static_assert(asl::same_as, int32_t>); static_assert(asl::same_as, int64_t>); static_assert(asl::same_as, uint8_t>); static_assert(asl::same_as, uint8_t>); static_assert(asl::same_as, uint8_t>); static_assert(asl::same_as, uint8_t>); static_assert(asl::same_as, uint16_t>); static_assert(asl::same_as, uint16_t>); static_assert(asl::same_as, uint32_t>); static_assert(asl::same_as, uint32_t>); static_assert(asl::same_as, uint32_t>); static_assert(asl::same_as, uint32_t>); static_assert(asl::same_as, uint64_t>); static_assert(asl::same_as, uint64_t>); static_assert(asl::same_as, uint64_t>);