Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <complex> 7 : #include <type_traits> 8 : 9 : namespace tt { 10 : /// @{ 11 : /// \ingroup TypeTraitsGroup 12 : /// \brief Determines if a type `T` is a `std::complex` of a fundamental type, 13 : /// is a `std::true_type` if so, and otherwise is a `std::false_type` 14 : /// 15 : /// \snippet Test_IsComplexOfFundamental.cpp is_complex_of_fundamental 16 : template <typename T, typename = std::bool_constant<true>> 17 1 : struct is_complex_of_fundamental : std::false_type {}; 18 : 19 : /// \cond 20 : // this version will only pattern match if `T` is both complex and a fundamental 21 : // type 22 : template <typename T> 23 : struct is_complex_of_fundamental<std::complex<T>, 24 : std::bool_constant<std::is_fundamental_v<T>>> 25 : : std::true_type {}; 26 : /// \endcond 27 : /// @} 28 : 29 : template <typename T> 30 0 : constexpr bool is_complex_of_fundamental_v = 31 : is_complex_of_fundamental<T>::value; 32 : 33 : /// \ingroup TypeTraitsGroup 34 : /// \brief Evaluates to `true` if type `T` is a `std::complex` of a fundamental 35 : /// type or if `T` is a fundamental type. 36 : template <typename T> 37 1 : constexpr bool is_complex_or_fundamental_v = 38 : is_complex_of_fundamental_v<T> or std::is_fundamental_v<T>; 39 : } // namespace tt