1 //================================================================================================= 2 /*! 3 // \file blaze/math/typetraits/HasInvSqrt.h 4 // \brief Header file for the HasInvSqrt type trait 5 // 6 // Copyright (C) 2012-2020 Klaus Iglberger - All Rights Reserved 7 // 8 // This file is part of the Blaze library. You can redistribute it and/or modify it under 9 // the terms of the New (Revised) BSD License. Redistribution and use in source and binary 10 // forms, with or without modification, are permitted provided that the following conditions 11 // are met: 12 // 13 // 1. Redistributions of source code must retain the above copyright notice, this list of 14 // conditions and the following disclaimer. 15 // 2. Redistributions in binary form must reproduce the above copyright notice, this list 16 // of conditions and the following disclaimer in the documentation and/or other materials 17 // provided with the distribution. 18 // 3. Neither the names of the Blaze development group nor the names of its contributors 19 // may be used to endorse or promote products derived from this software without specific 20 // prior written permission. 21 // 22 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 23 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 25 // SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 27 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28 // BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 31 // DAMAGE. 32 */ 33 //================================================================================================= 34 35 #ifndef _BLAZE_MATH_TYPETRAITS_HASINVSQRT_H_ 36 #define _BLAZE_MATH_TYPETRAITS_HASINVSQRT_H_ 37 38 39 //************************************************************************************************* 40 // Includes 41 //************************************************************************************************* 42 43 #include <utility> 44 #include <blaze/math/typetraits/IsMatrix.h> 45 #include <blaze/math/typetraits/IsVector.h> 46 #include <blaze/util/EnableIf.h> 47 #include <blaze/util/IntegralConstant.h> 48 #include <blaze/util/typetraits/Void.h> 49 50 51 namespace blaze { 52 53 //================================================================================================= 54 // 55 // CLASS DEFINITION 56 // 57 //================================================================================================= 58 59 //************************************************************************************************* 60 /*! \cond BLAZE_INTERNAL */ 61 /*!\brief Auxiliary helper struct for the HasInvSqrt type trait. 62 // \ingroup math_type_traits 63 */ 64 template< typename T, typename = void > 65 struct HasInvSqrtHelper 66 : public FalseType 67 {}; 68 /*! \endcond */ 69 //************************************************************************************************* 70 71 72 //************************************************************************************************* 73 /*! \cond BLAZE_INTERNAL */ 74 /*!\brief Specialization of the HasInvSqrtHelper type trait for types providing the invsqrt() 75 // operation. 76 // \ingroup math_type_traits 77 */ 78 template< typename T > 79 struct HasInvSqrtHelper< T, Void_t< decltype( invsqrt( std::declval<T>() ) ) > > 80 : public TrueType 81 {}; 82 /*! \endcond */ 83 //************************************************************************************************* 84 85 86 //************************************************************************************************* 87 /*!\brief Availability of the invsqrt() operation for the given data types. 88 // \ingroup math_type_traits 89 // 90 // This type trait provides the information whether the invsqrt() operation exists for the given 91 // data type \a T (taking the cv-qualifiers into account). In case the operation is available, 92 // the \a value member constant is set to \a true, the nested type definition \a Type is 93 // \a TrueType, and the class derives from \a TrueType. Otherwise \a value is set to \a false, 94 // \a Type is \a FalseType, and the class derives from \a FalseType. 95 96 \code 97 struct NoInvSqrt {}; // Definition of a type without the invsqrt() operation 98 99 blaze::HasInvSqrt< int >::value // Evaluates to 1 100 blaze::HasInvSqrt< DynamicVector<float> >::Type // Results in TrueType 101 blaze::HasInvSqrt< DynamicMatrix<double> > // Is derived from TrueType 102 blaze::HasInvSqrt< NoInvSqrt >::value // Evaluates to 0 103 blaze::HasInvSqrt< NoInvSqrt >::Type // Results in FalseType 104 blaze::HasInvSqrt< NoInvSqrt > // Is derived from FalseType 105 \endcode 106 */ 107 template< typename T, typename = void > 108 struct HasInvSqrt 109 : public HasInvSqrtHelper<T> 110 {}; 111 //************************************************************************************************* 112 113 114 //************************************************************************************************* 115 /*! \cond BLAZE_INTERNAL */ 116 /*!\brief Specialization of the HasInvSqrt type trait for vectors. 117 // \ingroup math_type_traits 118 */ 119 template< typename T > 120 struct HasInvSqrt< T, EnableIf_t< IsVector_v<T> > > 121 : public HasInvSqrt< typename T::ElementType > 122 {}; 123 /*! \endcond */ 124 //************************************************************************************************* 125 126 127 //************************************************************************************************* 128 /*! \cond BLAZE_INTERNAL */ 129 /*!\brief Specialization of the HasInvSqrt type trait for matrices. 130 // \ingroup math_type_traits 131 */ 132 template< typename T > 133 struct HasInvSqrt< T, EnableIf_t< IsMatrix_v<T> > > 134 : public HasInvSqrt< typename T::ElementType > 135 {}; 136 /*! \endcond */ 137 //************************************************************************************************* 138 139 140 //************************************************************************************************* 141 /*!\brief Auxiliary variable template for the HasInvSqrt type trait. 142 // \ingroup math_type_traits 143 // 144 // The HasInvSqrt_v variable template provides a convenient shortcut to access the nested \a value 145 // of the HasInvSqrt class template. For instance, given the type \a T the following two statements 146 // are identical: 147 148 \code 149 constexpr bool value1 = blaze::HasInvSqrt<T>::value; 150 constexpr bool value2 = blaze::HasInvSqrt_v<T>; 151 \endcode 152 */ 153 template< typename T > 154 constexpr bool HasInvSqrt_v = HasInvSqrt<T>::value; 155 //************************************************************************************************* 156 157 } // namespace blaze 158 159 #endif 160