+/// \ref fennec::is_unique "is_unique::value"
+/// \ref fennec::is_unique_v "is_unique_v"
+///
+/// \copydoc fennec::is_unique
///
///
@@ -59,6 +65,12 @@
namespace fennec
{
+
+template struct type_sequence {};
+
+
+// fennec::first_element ===============================================================================================
+
///
/// \brief Get the first element of a template parameter pack
/// \tparam TypesT the Parameter Pack
@@ -69,8 +81,20 @@ template struct first_element : detail::_first_element using first_element_t = typename first_element::type;
+
+// fennec::nth_element =================================================================================================
+
+///
+/// \brief Gets the type of the nth element of the type sequence `TypesT...`
+/// \tparam n The index in the type sequence
+/// \tparam TypesT The type sequence
template struct nth_element : detail::_nth_element {};
+template using nth_element_t = nth_element::type;
+
+
+
+// fennec::replace_first_element =======================================================================================
///
/// \brief Take a Template with a Pack `ClassT` and replace the first `ArgT` of `ArgsT...` with `SubT`
@@ -84,6 +108,99 @@ template<
struct replace_first_element, SubT> // Specialization
{ using type = ClassT; }; // Definition
+
+
+// fennec::max_element_size ============================================================================================
+
+///
+/// \brief Gets the max value of the size of each type in the sequence, i.e. `max(sizeof(Ts)...)`
+/// \tparam Ts The type sequence to check
+template struct max_element_size : detail::_max_element_size<0, Ts...> {};
+
+///
+/// \brief Shorthand for `max_element_size::value`
+/// \tparam Ts The type sequence to check
+template constexpr size_t max_element_size_v = max_element_size::value;
+
+
+
+// fennec::find_element ================================================================================================
+
+///
+/// \brief Finds the index of `T` in `Ts`, if `T` is not found, results in `sizeof...(Ts)`
+/// \tparam T The type to find
+/// \tparam Ts The type sequence to check
+template struct find_element : detail::_find_element<0, T, Ts...> {};
+
+///
+/// \brief Shorthand for `find_element::value`
+/// \tparam T The type to find
+/// \tparam Ts The type sequence to check
+template constexpr size_t find_element_v = find_element::value;
+
+
+
+// fennec::search_element ==============================================================================================
+
+
+///
+/// \brief Find the first element in `TypesT...` that satisfies `SearchT`
+/// \tparam SearchT A type that satisfies `template` and contains `static constexpr bool value;` to use for searching
+/// \tparam TypesT The type sequence to search
+template typename SearchT, typename...TypesT> struct search_element : detail::_search_element {};
+
+///
+/// \brief Shorthand for `search_element_t::type`
+/// \tparam SearchT A type that satisfies `template` and contains `static constexpr bool value;` to use for searching
+/// \tparam TypesT The type sequence to search
+template typename SearchT, typename...TypesT> using search_element_t = search_element::type;
+
+
+template typename, typename, typename...> struct search_element_args;
+
+template typename SearchT, typename...TypesT, typename...ArgsT>
+struct search_element_args, TypesT...>
+ : detail::_search_element_args, TypesT...> {
+};
+
+
+
+
+// fennec::contains_element ============================================================================================
+
+///
+/// \brief Checks if the type sequence `Ts...` contains `T`
+/// \tparam T The type to find
+/// \tparam Ts The type sequence to check
+template struct contains_element : bool_constant<(is_same_v or ...)> {};
+
+///
+/// \brief Shorthand for `contains_element_v::value`
+/// \tparam T The type to find
+/// \tparam Ts The type sequence to check
+template constexpr bool contains_element_v = contains_element::value;
+
+
+
+// fennec::is_unique ===================================================================================================
+
+///
+/// \brief Checks if all types in a type sequence are unique
+/// \tparam Ts The type sequence to check
+template struct is_unique : false_type {};
+
+// Single type case
+template struct is_unique : true_type {};
+
+// Recursion case
+template requires(not is_same_v && ...)
+struct is_unique : is_unique {};
+
+///
+/// \brief Shorthand for `is_unique::value`
+/// \tparam Ts The type sequence to check
+template constexpr bool is_unique_v = is_unique::value;
+
}
diff --git a/include/fennec/lang/type_traits.h b/include/fennec/lang/type_traits.h
index aee6efa..d56703f 100644
--- a/include/fennec/lang/type_traits.h
+++ b/include/fennec/lang/type_traits.h
@@ -360,7 +360,7 @@
/// \ref fennec::is_nothrow_move_constructible "is_nothrow_move_constructible::value"
/// \ref fennec::is_nothrow_move_constructible_v "is_nothrow_move_constructible_v"
///
-/// \movedetails fennec::is_move_constructible
+/// \copydetails fennec::is_move_constructible
///
/// |
/// \ref fennec::is_assignable "is_assignable::value"
@@ -390,7 +390,7 @@
/// \ref fennec::is_nothrow_move_assignable "is_nothrow_move_assignable::value"
/// \ref fennec::is_nothrow_move_assignable_v "is_nothrow_move_assignable_v"
///
-/// \movedetails fennec::is_move_assignable
+/// \copydetails fennec::is_move_assignable
///
/// |
/// \ref fennec::is_destructible "is_destructible::value"
@@ -446,7 +446,7 @@ constexpr inline bool is_constant_evaluated() noexcept {
// fennec::is_void =====================================================================================================
///
-/// \brief check if \p T is of type void
+/// \brief Check if \p T is of type void
///
/// \details Stores a boolean value in `is_void::value`, representing whether the provided type is of base type void.
/// \tparam T type to check
@@ -454,7 +454,7 @@ template struct is_void
: detail::_is_void>{};
///
-/// \brief shorthand for ```is_void::value```
+/// \brief Shorthand for ```is_void::value```
/// \tparam T type to check
template constexpr bool_t is_void_v = is_void::value;
@@ -463,7 +463,7 @@ template constexpr bool_t is_void_v = is_void::value;
// fennec::is_null_pointer =============================================================================================
///
-/// \brief check if \p T is of type nullptr_t
+/// \brief Check if \p T is of type nullptr_t
///
/// \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
@@ -471,7 +471,7 @@ template struct is_null_pointer
: detail::_is_null_pointer>{};
///
-/// \brief shorthand for ```is_null_pointer::value```
+/// \brief Shorthand for ```is_null_pointer::value```
/// \tparam T type to check
template constexpr bool_t is_null_pointer_v = is_null_pointer::value;
@@ -482,7 +482,7 @@ template constexpr bool_t is_null_pointer_v = is_null_pointer::va
#ifdef FENNEC_BUILTIN_IS_ARRAY
///
-/// \brief check if \p T is of an array type
+/// \brief Check if \p T is of an array type
/// \tparam T type to check
template struct is_array
: bool_constant {};
@@ -490,7 +490,7 @@ template struct is_array
#else
///
-/// \brief check if \p T is of an array type
+/// \brief Check if \p T is of an array type
/// \tparam T type to check
template struct is_array
: false_type {};
@@ -506,25 +506,72 @@ template struct is_array
#endif
///
-/// \brief shorthand for ```is_array::value```
+/// \brief Shorthand for ```is_array::value```
/// \tparam T type to check
template constexpr bool_t is_array_v = is_array::value;
+
+
+// fennec::is_enum ====================================================================================================
+
+///
+/// \brief Check if \p T is an enum
+/// \tparam T type to check
+template struct is_enum
+ : bool_constant {};
+
+///
+/// \brief Check if \p T is a class
+/// \tparam T type to check
+template constexpr size_t is_enum_v = is_enum::value;
+
+
+
+// fennec::is_union ====================================================================================================
+
+///
+/// \brief Check if \p T is a union
+/// \tparam T type to check
+template struct is_union
+ : bool_constant {};
+
+///
+/// \brief Check if \p T is a class
+/// \tparam T type to check
+template constexpr size_t is_union_v = is_union::value;
+
+
+
// fennec::is_class ====================================================================================================
///
-/// \brief check if \p T is a class
+/// \brief Check if \p T is a class
/// \tparam T type to check
template struct is_class
: bool_constant {};
///
-/// \brief check if \p T is a class
+/// \brief Check if \p T is a class
/// \tparam T type to check
template constexpr size_t is_class_v = is_class | | | |