-/// \ref fennec::is_fundamental "is_fundamental::value"
-/// \ref fennec::is_fundamental_v "is_fundamental_v"
-///
-/// \copydetails fennec::is_fundamental
-///
-/// |
/// \ref fennec::is_arithmetic "is_arithmetic::value"
/// \ref fennec::is_arithmetic_v "is_arithmetic_v"
///
/// \copydetails fennec::is_arithmetic
///
/// |
+/// \ref fennec::is_fundamental "is_fundamental::value"
+/// \ref fennec::is_fundamental_v "is_fundamental_v"
+///
+/// \copydetails fennec::is_fundamental
+///
+/// |
/// \ref fennec::is_scalar "is_scalar::value"
/// \ref fennec::is_scalar_v "is_scalar_v"
///
@@ -271,12 +271,6 @@
/// \copydetails fennec::is_aggregate
///
/// |
-/// \ref fennec::is_implicit_lifetime "is_implicit_lifetime::value"
-/// \ref fennec::is_implicit_lifetime_v "is_implicit_lifetime_v"
-///
-/// \copydetails fennec::is_implicit_lifetime
-///
-/// |
/// \ref fennec::is_signed "is_signed::value"
/// \ref fennec::is_signed_v "is_signed_v"
///
@@ -451,7 +445,7 @@ constexpr inline bool is_constant_evaluated() noexcept {
/// \details Stores a boolean value in `is_void::value`, representing whether the provided type is of base type void.
/// \tparam T type to check
template struct is_void
- : detail::_is_void>{};
+ : detail::_is_void>{};
///
/// \brief Shorthand for ```is_void::value```
@@ -468,7 +462,7 @@ template constexpr bool_t is_void_v = is_void::value;
/// \details Stores a boolean value in `is_null_pointer::value`, representing whether the provided type is of base type nullptr_t.
/// \tparam T type to check
template struct is_null_pointer
- : detail::_is_null_pointer>{};
+ : detail::_is_null_pointer>{};
///
/// \brief Shorthand for ```is_null_pointer::value```
@@ -477,6 +471,57 @@ template constexpr bool_t is_null_pointer_v = is_null_pointer::va
+// fennec::is_bool =====================================================================================================
+
+///
+/// \brief Check if \p T is of type bool
+///
+/// \details Stores a boolean value in `is_bool::value`, representing whether the provided type is of base type bool.
+/// \tparam T type to check
+template struct is_bool
+ : detail::_is_bool>{};
+
+///
+/// \brief Shorthand for ```is_bool::value```
+/// \tparam T type to check
+template constexpr bool_t is_bool_v = is_bool::value;
+
+
+
+// fennec::is_integral =================================================================================================
+
+///
+/// \brief Check if \p T is of an integral
+///
+/// \details Stores a boolean value in `is_integral::value`, representing whether the provided type is of a base integer type.
+/// \tparam T type to check
+template struct is_integral
+ : detail::_is_integral> {};
+
+///
+/// \brief Shorthand for ```is_integral::value```
+/// \tparam T type to check
+template constexpr bool_t is_integral_v = is_integral::value;
+
+
+
+// fennec::is_floating_point ===========================================================================================
+
+///
+/// \brief Check if \p T is of a floating point type
+///
+/// \details Stores a boolean value in `is_floating_point::value`, representing whether the provided type is of a base floating point type.
+/// \tparam T type to check
+template struct is_floating_point
+ : detail::_is_floating_point>{};
+
+///
+/// \brief Shorthand for ```is_floating_point::value```
+/// \tparam T type to check
+template constexpr bool_t is_floating_point_v = is_floating_point {};
+
+
+
// fennec::is_array ====================================================================================================
#ifdef FENNEC_BUILTIN_IS_ARRAY
@@ -557,7 +602,7 @@ template constexpr size_t is_class_v = is_class::value;
-// fennec::is_function ====================================================================================================
+// fennec::is_function =================================================================================================
///
/// \brief Check if \p T is a class
@@ -572,41 +617,363 @@ template constexpr size_t is_function_v = is_function::value;
-// Integral Types ======================================================================================================
-
-
-
-// fennec::is_bool =====================================================================================================
+// fennec::is_pointer ==================================================================================================
///
-/// \brief Check if \p T is of type bool
+/// \brief Check if \p T is of a pointer type
///
-/// \details Stores a boolean value in `is_bool::value`, representing whether the provided type is of base type bool.
+/// \details Stores a boolean value in `is_pointer::value`, representing whether the provided type is of a base pointer type.
/// \tparam T type to check
-template struct is_bool
- : detail::_is_bool>{};
+template struct is_pointer
+ : detail::_is_pointer>{};
///
-/// \brief Shorthand for ```is_bool::value```
+/// \brief Shorthand for ```is_pointer::value```
/// \tparam T type to check
-template constexpr bool_t is_bool_v = is_bool::value;
+template constexpr bool_t is_pointer_v = is_pointer {};
-// fennec::is_integral =================================================================================================
+// fennec::is_lvalue_reference =========================================================================================
///
-/// \brief Check if \p T is of an integral
+/// \brief Check if \p T is of a floating point type
///
-/// \details Stores a boolean value in `is_integral::value`, representing whether the provided type is of a base integer type.
+/// \details Checks if type `T` is a floating point type and store it in `is_same::value`.
/// \tparam T type to check
-template struct is_integral
- : detail::_is_integral> {};
+template struct is_lvalue_reference
+ : detail::_is_lvalue_reference{};
///
-/// \brief Shorthand for ```is_integral::value```
+/// \brief Shorthand for ```is_floating_point::value```
/// \tparam T type to check
-template constexpr bool_t is_integral_v = is_integral::value;
+template constexpr bool_t is_lvalue_reference_v = is_lvalue_reference {};
+
+
+
+// fennec::is_rvalue_reference =========================================================================================
+
+///
+/// \brief Check if \p T is of a floating point type
+///
+/// \details Checks if type `T` is a floating point type and store it in `is_same::value`.
+/// \tparam T type to check
+template struct is_rvalue_reference
+ : detail::_is_rvalue_reference{};
+
+///
+/// \brief Shorthand for ```is_floating_point::value```
+/// \tparam T type to check
+template constexpr bool_t is_rvalue_reference_v = is_rvalue_reference {};
+
+
+
+// fennec::is_member_function_pointer ==================================================================================
+
+///
+/// \brief Check if \p T is a pointer to a member function
+///
+/// \details Checks if type `T` is pointer to a member function and store it in `is_member_function_pointer::value`.
+/// \tparam T type to check
+template struct is_member_function_pointer
+ : bool_constant {};
+
+///
+/// \brief Shorthand for ```is_member_function_pointer::value```
+/// \tparam T type to check
+template constexpr bool_t is_member_function_pointer_v = is_member_function_pointer {};
+
+
+
+// fennec::is_member_object_pointer ====================================================================================
+
+///
+/// \brief Check if \p T is a pointer to a member object
+///
+/// \details Checks if type `T` is pointer to a member object and store it in `is_member_object_pointer::value`.
+/// \tparam T type to check
+template struct is_member_object_pointer
+ : bool_constant {};
+
+///
+/// \brief Shorthand for ```is_member_object_pointer::value```
+/// \tparam T type to check
+template constexpr bool_t is_member_object_pointer_v = is_member_object_pointer {};
+
+
+
+// fennec::is_arithmetic ===============================================================================================
+
+///
+/// \brief Check if \p T is an arithmetic type
+///
+/// \details Checks if type `T` is a built-in type with arithmetic operators and store it in `is_same::value`.
+/// \tparam T type to check
+template struct is_arithmetic
+ : bool_constant or is_floating_point_v>{};
+
+///
+/// \brief Shorthand for ```is_arithmetic::value```
+/// \tparam T type to check
+template constexpr bool_t is_arithmetic_v = is_arithmetic::value;
+
+
+// fennec::is_fundamental ==============================================================================================
+
+///
+/// \brief Check if \p T is a fundamental type, i.e. arithmetic, void, or nullptr_t
+/// \tparam T type to check
+template struct is_fundamental
+ : bool_constant or is_void_v or is_null_pointer_v>{};
+
+///
+/// \brief Shorthand for ```is_fundamental::value```
+/// \tparam T type to check
+template constexpr bool_t is_fundamental_v = is_fundamental::value;
+
+
+
+// fennec::is_scalar ===================================================================================================
+
+///
+/// \brief Check if \p T is an arithmetic type
+///
+/// \details Checks if type `T` is a built-in type with arithmetic operators and store it in `is_same::value`.
+/// \tparam T type to check
+template struct is_scalar
+ : bool_constant or is_enum_v or is_pointer_v>{};
+
+///
+/// \brief Shorthand for ```is_scalar::value```
+/// \tparam T type to check
+template constexpr bool_t is_scalar_v = is_scalar::value;
+
+
+
+// fennec::is_object ===================================================================================================
+
+///
+/// \brief Check if \p T is an object
+///
+/// \details Checks if type `T` is an object and store it in `is_same::value`.
+/// \tparam T type to check
+template struct is_object : bool_constant {};
+
+///
+/// \brief Shorthand for ```is_object::value```
+/// \tparam T type to check
+template constexpr bool_t is_object_v = is_object::value;
+
+
+
+// fennec::is_compound =================================================================================================
+
+///
+/// \brief Check if \p T is a object compound type
+///
+/// \details Checks if type `T` is an object and store it in `is_same::value`.
+/// \tparam T type to check
+template struct is_compound : bool_constant> {};
+
+///
+/// \brief Shorthand for ```is_compound::value```
+/// \tparam T type to check
+template constexpr bool_t is_compound_v = is_compound::value;
+
+
+
+// fennec::is_reference ================================================================================================
+
+///
+/// \brief Check if \p T is of a floating point type
+///
+/// \details Checks if type `T` is a floating point type and store it in `is_same::value`.
+/// \tparam T type to check
+template struct is_reference
+ : detail::_is_reference{};
+
+///
+/// \brief Shorthand for ```is_floating_point::value```
+/// \tparam T type to check
+template constexpr bool_t is_reference_v = is_reference {};
+
+
+
+// fennec::is_member_pointer ===========================================================================================
+
+///
+/// \brief Check if \p T is a pointer to a member
+///
+/// \details Checks if type `T` is pointer to a member and store it in `is_member_function_pointer::value`.
+/// \tparam T type to check
+template struct is_member_pointer
+ : bool_constant {};
+
+///
+/// \brief Shorthand for ```is_member_function_pointer::value```
+/// \tparam T type to check
+template constexpr bool_t is_member_pointer_v = is_member_pointer {};
+
+
+
+// fennec::is_trivial ==================================================================================================
+
+///
+/// \brief Check if type `T` is trivial
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_trivial : bool_constant {};
+
+///
+/// \brief Shorthand for `is_trivial::value`
+/// \tparam T type to check
+template constexpr bool_t is_trivial_v = is_trivial{};
+
+
+
+// fennec::is_trivially_copyable =======================================================================================
+
+///
+/// \brief Check if type `T` is trivially_copyable
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_trivially_copyable : bool_constant {};
+
+///
+/// \brief Shorthand for `is_trivially_copyable::value`
+/// \tparam T type to check
+template constexpr bool_t is_trivially_copyable_v = is_trivially_copyable{};
+
+
+
+// fennec::is_standard_layout ==========================================================================================
+
+///
+/// \brief Check if type `T` is standard_layout
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_standard_layout : bool_constant {};
+
+///
+/// \brief Shorthand for `is_standard_layout::value`
+/// \tparam T type to check
+template constexpr bool_t is_standard_layout_v = is_standard_layout{};
+
+
+
+// fennec::has_unique_object_representations ===========================================================================
+
+///
+/// \brief Check if type `T` has unique object representations
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct has_unique_object_representations
+ : bool_constant)> {};
+
+///
+/// \brief Shorthand for `has_unique_object_representations::value`
+/// \tparam T type to check
+template constexpr bool_t has_unique_object_representations_v = has_unique_object_representations{};
+
+
+
+// fennec::is_empty ====================================================================================================
+
+///
+/// \brief Check if type `T` is empty
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_empty : bool_constant {};
+
+///
+/// \brief Shorthand for `is_empty::value`
+/// \tparam T type to check
+template constexpr bool_t is_empty_v = is_empty{};
+
+
+
+// fennec::is_polymorphic ==============================================================================================
+
+///
+/// \brief Check if type `T` is polymorphic
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_polymorphic : bool_constant {};
+
+///
+/// \brief Shorthand for `is_polymorphic::value`
+/// \tparam T type to check
+template constexpr bool_t is_polymorphic_v = is_polymorphic{};
+
+
+
+// fennec::is_abstract =================================================================================================
+
+///
+/// \brief Check if type `T` is abstract
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_abstract : bool_constant {};
+
+///
+/// \brief Shorthand for `is_abstract::value`
+/// \tparam T type to check
+template constexpr bool_t is_abstract_v = is_abstract{};
+
+
+
+// fennec::is_complete =================================================================================================
+
+///
+/// \brief Check if type `T` is complete
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_complete : detail::_is_complete::type {};
+
+///
+/// \brief Shorthand for `is_complete::value`
+/// \tparam T type to check
+template constexpr bool_t is_complete_v = is_complete{};
+
+
+
+// fennec::is_final =================================================================================================
+
+///
+/// \brief Check if type `T` is final
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_final : bool_constant {};
+
+///
+/// \brief Shorthand for `is_final::value`
+/// \tparam T type to check
+template constexpr bool_t is_final_v = is_final{};
+
+
+
+// fennec::is_aggregate =================================================================================================
+
+///
+/// \brief Check if type `T` is aggregate
+///
+/// \details Checks if `T`
+/// \tparam T type to check
+template struct is_aggregate : bool_constant {};
+
+///
+/// \brief Shorthand for `is_aggregate | | | | | | |