1 //=================================================================================================
2 /*!
3 //  \file blaze/math/typetraits/IsSVDExpr.h
4 //  \brief Header file for the IsSVDExpr type trait class
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_ISSVDEXPR_H_
36 #define _BLAZE_MATH_TYPETRAITS_ISSVDEXPR_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <utility>
44 #include <blaze/math/expressions/SVDExpr.h>
45 #include <blaze/util/IntegralConstant.h>
46 
47 
48 namespace blaze {
49 
50 //=================================================================================================
51 //
52 //  CLASS DEFINITION
53 //
54 //=================================================================================================
55 
56 //*************************************************************************************************
57 /*! \cond BLAZE_INTERNAL */
58 /*!\brief Auxiliary helper functions for the IsSVDExpr type trait.
59 // \ingroup math_type_traits
60 */
61 template< typename MT >
62 TrueType isSVDExpr_backend( const volatile SVDExpr<MT>* );
63 
64 FalseType isSVDExpr_backend( ... );
65 /*! \endcond */
66 //*************************************************************************************************
67 
68 
69 //*************************************************************************************************
70 /*!\brief Compile time check whether the given type is a singular value expression template.
71 // \ingroup math_type_traits
72 //
73 // This type trait class tests whether or not the given type \a Type is a singular value expression
74 // template. In order to qualify as a valid singular value expression template, the given type has
75 // to derive publicly from the SVDExpr base class. In case the given type is a valid singular value
76 // expression template, the \a value member constant is set to \a true, the nested type definition
77 // \a Type is \a TrueType, and the class derives from \a TrueType. Otherwise \a value is set to
78 // \a false, \a Type is \a FalseType, and the class derives from \a FalseType.
79 */
80 template< typename T >
81 struct IsSVDExpr
82    : public decltype( isSVDExpr_backend( std::declval<T*>() ) )
83 {};
84 //*************************************************************************************************
85 
86 
87 //*************************************************************************************************
88 /*! \cond BLAZE_INTERNAL */
89 /*!\brief Specialization of the IsSVDExpr type trait for references.
90 // \ingroup math_type_traits
91 */
92 template< typename T >
93 struct IsSVDExpr<T&>
94    : public FalseType
95 {};
96 /*! \endcond */
97 //*************************************************************************************************
98 
99 
100 //*************************************************************************************************
101 /*!\brief Auxiliary variable template for the IsSVDExpr type trait.
102 // \ingroup math_type_traits
103 //
104 // The IsSVDExpr_v variable template provides a convenient shortcut to access the nested \a value
105 // of the IsSVDExpr class template. For instance, given the type \a T the following two statements
106 // are identical:
107 
108    \code
109    constexpr bool value1 = blaze::IsSVDExpr<T>::value;
110    constexpr bool value2 = blaze::IsSVDExpr_v<T>;
111    \endcode
112 */
113 template< typename T >
114 constexpr bool IsSVDExpr_v = IsSVDExpr<T>::value;
115 //*************************************************************************************************
116 
117 } // namespace blaze
118 
119 #endif
120