SpECTRE Documentation Coverage Report
Current view: top level - Utilities/TypeTraits - CreateHasTypeAlias.hpp Hit Total Coverage
Commit: 3c072f0ce967e2e56649d3fa12aa2a0e4fe2a42e Lines: 2 3 66.7 %
Date: 2024-04-23 20:50:18
Legend: Lines: hit not hit

          Line data    Source code
       1           0 : // Distributed under the MIT License.
       2             : // See LICENSE.txt for details.
       3             : 
       4             : #pragma once
       5             : 
       6             : #include <type_traits>
       7             : 
       8             : #include "Utilities/NoSuchType.hpp"
       9             : 
      10             : /// @{
      11             : /*!
      12             :  * \ingroup TypeTraitsGroup
      13             :  * \brief Generate a type trait to check if a class has a type alias with a
      14             :  * particular name, optionally also checking its type.
      15             :  *
      16             :  * To generate the corresponding `_v` metafunction, call
      17             :  * `CREATE_HAS_TYPE_ALIAS` first and then `CREATE_HAS_TYPE_ALIAS_V`.
      18             :  *
      19             :  * \example
      20             :  * \snippet Test_CreateHasTypeAlias.cpp CREATE_HAS_TYPE_ALIAS
      21             :  *
      22             :  * \see `CREATE_IS_CALLABLE`
      23             :  */
      24             : // Use `NoSuchType*****` to represent any `AliasType`, i.e. not checking the
      25             : // alias type at all. If someone has that many pointers to a thing that isn't
      26             : // useful, it's their fault...
      27           1 : #define CREATE_HAS_TYPE_ALIAS(ALIAS_NAME)                                 \
      28             :   template <typename CheckingType, typename AliasType = NoSuchType*****,  \
      29             :             typename = std::void_t<>>                                     \
      30             :   struct has_##ALIAS_NAME : std::false_type {};                           \
      31             :                                                                           \
      32             :   template <typename CheckingType, typename AliasType>                    \
      33             :   struct has_##ALIAS_NAME<CheckingType, AliasType,                        \
      34             :                           std::void_t<typename CheckingType::ALIAS_NAME>> \
      35             :       : std::bool_constant<                                               \
      36             :             std::is_same_v<AliasType, NoSuchType*****> or                 \
      37             :             std::is_same_v<typename CheckingType::ALIAS_NAME, AliasType>> {};
      38             : // Separate macros to avoid compiler warnings about unused variables
      39           1 : #define CREATE_HAS_TYPE_ALIAS_V(ALIAS_NAME)                              \
      40             :   template <typename CheckingType, typename AliasType = NoSuchType*****> \
      41             :   static constexpr const bool has_##ALIAS_NAME##_v =                     \
      42             :       has_##ALIAS_NAME<CheckingType, AliasType>::value;
      43             : /// @}

Generated by: LCOV version 1.14