From 6d3c276bfed1c9fc88fd9fd4a0a24570f5cf3912 Mon Sep 17 00:00:00 2001 From: Medusa Slockbower Date: Wed, 18 Jun 2025 11:57:57 -0400 Subject: [PATCH] - Added More Documentation --- CMakeLists.txt | 2 + include/fennec/lang/lang.h | 2 + include/fennec/lang/sequences.h | 129 +++++++++++++++++------------- include/fennec/lang/type_traits.h | 86 +++++++++++++++----- 4 files changed, 143 insertions(+), 76 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 13e1fee..42b13c4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,6 +141,8 @@ if(DOXYGEN_FOUND) COMMENT "Generating Doxygen Documentation" VERBATIM) + add_dependencies(fennecdocs fennecdocs-clean) + # Target for cleaning docs add_custom_target(fennecdocs-clean ALL COMMAND rm -r "${PROJECT_SOURCE_DIR}/docs/" diff --git a/include/fennec/lang/lang.h b/include/fennec/lang/lang.h index 0c58a0a..33b2256 100644 --- a/include/fennec/lang/lang.h +++ b/include/fennec/lang/lang.h @@ -54,6 +54,8 @@ /// - \subpage fennec_lang_constants /// - \subpage fennec_lang_conditional_types /// - \subpage fennec_lang_numeric_transforms +/// - \subpage fennec_lang_sequences +/// - \subpage fennec_lang_type_traits /// /// diff --git a/include/fennec/lang/sequences.h b/include/fennec/lang/sequences.h index 9100336..2b33f0a 100644 --- a/include/fennec/lang/sequences.h +++ b/include/fennec/lang/sequences.h @@ -31,6 +31,45 @@ #ifndef FENNEC_LANG_SEQUENCES_H #define FENNEC_LANG_SEQUENCES_H +/// +/// \page fennec_lang_sequences Sequences +/// +/// \brief This header is part of the metaprogramming library. It defines structures for sequences of values, used during compile time. +/// +/// \code #include \endcode +/// +/// +///
Syntax +/// Description +/// +///

+/// \ref fennec::sequence "sequence"
+///
+/// \copydetails fennec::sequence +/// +///

+/// \ref fennec::integer_sequence "integer_sequence"
+/// \ref fennec::make_integer_sequence "typename make_integer_sequence::type"
+/// \ref fennec::make_integer_sequence_t "make_integer_sequence_t" +///
+/// \copydetails fennec::integer_sequence +/// +///

+/// \ref fennec::index_sequence "index_sequence"
+/// \ref fennec::make_index_sequence "typename make_index_sequence::type"
+/// \ref fennec::make_index_sequence_t "make_index_sequence_t" +///
+/// \copydetails fennec::index_sequence +/// +///

+/// \ref fennec::concat_sequence "typename concat_sequence::type"
+/// \ref fennec::concat_sequence_t "concat_sequence_t"
+///
+/// \copydetails fennec::concat_sequence +/// +///
+/// + #include namespace fennec @@ -38,56 +77,54 @@ namespace fennec // fennec::sequence ==================================================================================================== -/// /// /// \brief metaprogramming sequence /// -/// \details +/// \details Stores a sequence of values of type `ValueT` as a template pack. +/// You can access the parameter pack in another template function, i.e. +/// \code{cpp} +/// template +/// constexpr TypeT summation(sequence) +/// { +/// return (Values + ...); +/// } +/// \endcode /// \tparam ValueT type of the values -/// \tparam ValuesV sequence values -/// -template struct sequence +/// \tparam Values sequence values +template struct sequence { - /// /// \brief type of the sequence using value_type = ValueT; - /// /// \brief self-referential type using type = sequence; - /// /// /// \brief returns the number of elements /// /// \return number of elements in the array - inline static constexpr size_t size() noexcept { return sizeof...(ValuesV); } + inline static constexpr size_t size() noexcept { return sizeof...(Values); } }; // fennec::integer_sequence ============================================================================================ -/// /// /// \brief metaprogramming integral sequence /// -/// \details -/// \tparam T type of the values, must satisfy ```fennec::is_integral``` +/// \details A `fennec::sequence` specialized integer types. +/// \tparam IntT type of the values, must satisfy ```fennec::is_integral``` /// \tparam Values sequence values -/// -template requires(is_integral_v) -struct integer_sequence : sequence +template requires(is_integral_v) +struct integer_sequence : sequence { - /// /// \brief type of the sequence - using value_type = T; + using value_type = IntT; - /// /// \brief self-referential type using type = integer_sequence; - /// /// /// \brief returns the number of elements /// @@ -96,42 +133,35 @@ struct integer_sequence : sequence }; -/// /// /// \brief generate a fennec::integer_sequence \f$\left[\,0\,\ldots\,N\,\right)\f$ /// /// \details -/// \tparam T type of the values, must satisfy ```fennec::is_integral``` +/// \tparam IntT type of the values, must satisfy ```fennec::is_integral``` /// \tparam N size of the sequence to generate -/// -template struct make_integer_sequence; +template struct make_integer_sequence; /// /// \brief shorthand for ```typename make_integer_sequence::type``` -template using make_integer_sequence_t = typename make_integer_sequence::type; +template using make_integer_sequence_t = typename make_integer_sequence::type; // fennec::index_sequence ============================================================================================== -/// /// /// \brief metaprogramming integral sequence /// -/// \details +/// \details A `fennec::integer_sequence` specialized for sequences of `size_t` indices. /// \tparam Indices sequence values -/// template struct index_sequence : integer_sequence { - /// /// \brief type of the sequence using value_type = size_t; - /// /// \brief self-referential type using type = index_sequence; - /// /// /// \brief returns the number of elements /// @@ -140,14 +170,12 @@ template struct index_sequence : integer_sequence``` /// \tparam N size of the sequence to generate -/// template struct make_index_sequence; /// @@ -158,11 +186,10 @@ template using make_index_sequence_t = typename make_index_sequence struct concat_sequence; @@ -172,29 +199,6 @@ template struct concat_sequence; template using concat_sequence_t = typename concat_sequence::type; -/// -/// -/// \brief specialization to concatenate two integer sequences -/// -/// \details -/// \tparam T integral type -/// \tparam SequenceT0 lhs -/// \tparam SequenceT1 rhs -template -struct concat_sequence, integer_sequence> - : integer_sequence{}; - -/// -/// -/// \brief specialization to concatenate two index sequences -/// -/// \details -/// \tparam SequenceT0 lhs -/// \tparam SequenceT1 rhs -template -struct concat_sequence, index_sequence> - : index_sequence{}; - // Internal ============================================================================================================ @@ -219,6 +223,17 @@ template<> struct make_index_sequence<0> : index_sequence<> {}; template<> struct make_index_sequence<1> : index_sequence<0>{}; +// Specialization for integer sequences +template +struct concat_sequence, integer_sequence> + : integer_sequence{}; + +// Specialization for index sequences +template +struct concat_sequence, index_sequence> + : index_sequence{}; + + } diff --git a/include/fennec/lang/type_traits.h b/include/fennec/lang/type_traits.h index 28ed62c..cd8586f 100644 --- a/include/fennec/lang/type_traits.h +++ b/include/fennec/lang/type_traits.h @@ -31,6 +31,70 @@ #ifndef FENNEC_LANG_TYPE_TRAITS_H #define FENNEC_LANG_TYPE_TRAITS_H +/// +/// \page fennec_lang_type_traits Type Traits +/// +/// \brief Part of the fennec metaprogramming library. This header defines structures for accessing traits of types +/// at compile time. +/// +/// \code #include \endcode +/// +/// +/// +///
Syntax +/// Description +/// +///

+/// \ref fennec::is_void "is_void::value"
+/// \ref fennec::is_void_v "is_void_v" +///
+/// \copydetails fennec::is_void +/// +///

+/// \ref fennec::is_bool "is_bool::value"
+/// \ref fennec::is_bool_v "is_bool_v" +///
+/// \copydetails fennec::is_bool +/// +///

+/// \ref fennec::is_integral "is_integral::value"
+/// \ref fennec::is_integral_v "is_integral_v" +///
+/// \copydetails fennec::is_integral +/// +///

+/// \ref fennec::is_signed "is_signed::value"
+/// \ref fennec::is_signed_v "is_signed_v" +///
+/// \copydetails fennec::is_signed +/// +///

+/// \ref fennec::is_unsigned "is_unsigned::value"
+/// \ref fennec::is_unsigned_v "is_unsigned_v" +///
+/// \copydetails fennec::is_unsigned +/// +///

+/// \ref fennec::is_floating_point "is_floating_point::value"
+/// \ref fennec::is_floating_point_v "is_floating_point_v" +///
+/// \copydetails fennec::is_floating_point +/// +///

+/// \ref fennec::is_arithmetic "is_arithmetic::value"
+/// \ref fennec::is_arithmetic_v "is_arithmetic_v" +///
+/// \copydetails fennec::is_arithmetic +/// +///

+/// \ref fennec::is_same "is_same::value"
+/// \ref fennec::is_same_v "is_same_v" +///
+/// \copydetails fennec::is_same +/// +///
+/// + #include #include @@ -39,16 +103,14 @@ namespace fennec // fennec::is_void ===================================================================================================== -/// /// /// \brief check if \p T is of type void /// -/// \details +/// \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>{}; -/// /// /// \brief shorthand for ```is_void::value``` /// \tparam T type to check @@ -59,16 +121,14 @@ template constexpr bool_t is_void_v // fennec::is_bool ===================================================================================================== -/// /// /// \brief check if \p T is of type bool /// -/// \details +/// \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 @@ -79,16 +139,14 @@ template constexpr bool_t is_bool_v // Integral Types ====================================================================================================== -/// /// /// \brief check if \p T is of an integral /// -/// \details +/// \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 @@ -96,7 +154,6 @@ template constexpr bool_t is_integral_v = is_integral::value; -/// /// /// \brief check if \p T is of a signed integral /// @@ -105,7 +162,6 @@ template constexpr bool_t is_integral_v template struct is_signed : detail::__is_signed> {}; -/// /// /// \brief shorthand for ```is_signed::value``` /// \tparam T type to check @@ -113,7 +169,6 @@ template constexpr bool_t is_signed_v = is_signed::value; -/// /// /// \brief check if \p T is of an unsigned integral /// @@ -122,7 +177,6 @@ template constexpr bool_t is_signed_v template struct is_unsigned : detail::__is_unsigned> {}; -/// /// /// \brief shorthand for ```is_unsigned::value``` /// \tparam T type to check @@ -133,7 +187,6 @@ template constexpr bool_t is_unsigned_v // Floating Point Types ================================================================================================ -/// /// /// \brief check if \p T is of a floating point type /// @@ -142,7 +195,6 @@ template constexpr bool_t is_unsigned_v template struct is_floating_point : detail::__is_floating_point>{}; -/// /// /// \brief shorthand for ```is_floating_point::value``` /// \tparam T type to check @@ -153,7 +205,6 @@ template constexpr bool_t is_floating_point_v // Arithmetic Types ==================================================================================================== -/// /// /// \brief check if \p T is an arithmetic type /// @@ -162,7 +213,6 @@ template constexpr bool_t is_floating_point_v template struct is_arithmetic : bool_constant or is_floating_point_v>{}; -/// /// /// \brief shorthand for ```is_arithmetic::value``` /// \tparam T type to check @@ -171,7 +221,6 @@ template constexpr bool_t is_arithmetic_v // fennec::is_same ===================================================================================================== -/// /// /// \brief check if the two types are identical /// @@ -184,7 +233,6 @@ template struct is_same template struct is_same : true_type {}; -/// /// /// \brief shorthand for ```is_same::value``` /// \tparam T type to check