SpECTRE Documentation Coverage Report
Current view: top level - Utilities/TypeTraits - CreateHasStaticMemberVariable.hpp Hit Total Coverage
Commit: d0fc80462417e83e5cddfa1b9901bb4a9b6af4d6 Lines: 2 3 66.7 %
Date: 2024-03-29 00:33:31
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 `static constexpr`
      14             :  * variable, optionally also checking its type.
      15             :  *
      16             :  * To generate the corresponding `_v` metafunction, call
      17             :  * `CREATE_HAS_STATIC_MEMBER_VARIABLE` first and then
      18             :  * `CREATE_HAS_STATIC_MEMBER_VARIABLE_V`.
      19             :  *
      20             :  * \example
      21             :  * \snippet Test_CreateHasStaticMemberVariable.cpp CREATE_HAS_EXAMPLE
      22             :  *
      23             :  * \see `CREATE_IS_CALLABLE`
      24             :  */
      25             : // Use `NoSuchType*****` to represent any `VariableType`, i.e. not checking the
      26             : // variable type at all. If someone has that many pointers to a thing that isn't
      27             : // useful, it's their fault...
      28           1 : #define CREATE_HAS_STATIC_MEMBER_VARIABLE(CONSTEXPR_NAME)                     \
      29             :   template <typename CheckingType, typename VariableType = NoSuchType*****,   \
      30             :             typename = std::void_t<>>                                         \
      31             :   struct has_##CONSTEXPR_NAME : std::false_type {};                           \
      32             :                                                                               \
      33             :   template <typename CheckingType, typename VariableType>                     \
      34             :   struct has_##CONSTEXPR_NAME<CheckingType, VariableType,                     \
      35             :                               std::void_t<std::remove_const_t<decltype(       \
      36             :                                   CheckingType::CONSTEXPR_NAME)>>>            \
      37             :       : std::bool_constant<std::is_same_v<VariableType, NoSuchType*****> or   \
      38             :                            std::is_same_v<std::remove_const_t<decltype(       \
      39             :                                               CheckingType::CONSTEXPR_NAME)>, \
      40             :                                           VariableType>> {};
      41             : 
      42             : // Separate macros to avoid compiler warnings about unused variables
      43           1 : #define CREATE_HAS_STATIC_MEMBER_VARIABLE_V(CONSTEXPR_NAME)                 \
      44             :   template <typename CheckingType, typename VariableType = NoSuchType*****> \
      45             :   static constexpr const bool has_##CONSTEXPR_NAME##_v =                    \
      46             :       has_##CONSTEXPR_NAME<CheckingType, VariableType>::value;
      47             : /// @}

Generated by: LCOV version 1.14