1 //=================================================================================================
2 /*!
3 //  \file blaze/math/typetraits/IsUniUpper.h
4 //  \brief Header file for the IsUniUpper 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_ISUNIUPPER_H_
36 #define _BLAZE_MATH_TYPETRAITS_ISUNIUPPER_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <blaze/math/typetraits/IsExpression.h>
44 #include <blaze/util/EnableIf.h>
45 #include <blaze/util/IntegralConstant.h>
46 #include <blaze/util/typetraits/IsSame.h>
47 
48 
49 namespace blaze {
50 
51 //=================================================================================================
52 //
53 //  CLASS DEFINITION
54 //
55 //=================================================================================================
56 
57 //*************************************************************************************************
58 /*! \cond BLAZE_INTERNAL */
59 template< typename T > struct IsUniUpper;
60 /*! \endcond */
61 //*************************************************************************************************
62 
63 
64 //*************************************************************************************************
65 /*! \cond BLAZE_INTERNAL */
66 /*!\brief Auxiliary helper struct for the IsUniUpper type trait.
67 // \ingroup math_traits
68 */
69 template< typename T
70         , typename = void >
71 struct IsUniUpperHelper
72    : public FalseType
73 {};
74 
75 template< typename T >  // Type of the operand
76 struct IsUniUpperHelper< T, EnableIf_t< IsExpression_v<T> && !IsSame_v<T,typename T::ResultType> > >
77    : public IsUniUpper< typename T::ResultType >::Type
78 {};
79 /*! \endcond */
80 //*************************************************************************************************
81 
82 
83 //*************************************************************************************************
84 /*!\brief Compile time check for upper unitriangular matrices.
85 // \ingroup math_type_traits
86 //
87 // This type trait tests whether or not the given template parameter is an upper unitriangular
88 // matrix type (i.e. a matrix type that is guaranteed to be upper unitriangular at compile time).
89 // In case the type is an upper unitriangular matrix type, the \a value member constant is set
90 // to \a true, the nested type definition \a Type is \a TrueType, and the class derives from
91 // \a TrueType. Otherwise \a value is set to \a false, \a Type is \a FalseType, and the class
92 // derives from \a FalseType.
93 
94    \code
95    using blaze::rowMajor;
96 
97    using StaticMatrixType     = blaze::StaticMatrix<double,3UL,3UL,rowMajor>;
98    using DynamicMatrixType    = blaze::DynamicMatrix<float,rowMajor>;
99    using CompressedMatrixType = blaze::CompressedMatrix<int,rowMajor>;
100 
101    using UniUpperStaticType     = blaze::UniUpperMatrix<StaticMatrixType>;
102    using UniUpperDynamicType    = blaze::UniUpperMatrix<DynamicMatrixType>;
103    using UniUpperCompressedType = blaze::UniUpperMatrix<CompressedMatrixType>;
104 
105    blaze::IsUniUpper< UniUpperStaticType >::value        // Evaluates to 1
106    blaze::IsUniUpper< const UniUpperDynamicType >::Type  // Results in TrueType
107    blaze::IsUniUpper< volatile UniUpperCompressedType >  // Is derived from TrueType
108    blaze::IsUniUpper< StaticMatrixType >::value          // Evaluates to 0
109    blaze::IsUniUpper< const DynamicMatrixType >::Type    // Results in FalseType
110    blaze::IsUniUpper< volatile CompressedMatrixType >    // Is derived from FalseType
111    \endcode
112 */
113 template< typename T >
114 struct IsUniUpper
115    : public IsUniUpperHelper<T>
116 {};
117 //*************************************************************************************************
118 
119 
120 //*************************************************************************************************
121 /*! \cond BLAZE_INTERNAL */
122 /*!\brief Specialization of the IsUniUpper type trait for const types.
123 // \ingroup math_type_traits
124 */
125 template< typename T >
126 struct IsUniUpper< const T >
127    : public IsUniUpper<T>
128 {};
129 /*! \endcond */
130 //*************************************************************************************************
131 
132 
133 //*************************************************************************************************
134 /*! \cond BLAZE_INTERNAL */
135 /*!\brief Specialization of the IsUniUpper type trait for volatile types.
136 // \ingroup math_type_traits
137 */
138 template< typename T >
139 struct IsUniUpper< volatile T >
140    : public IsUniUpper<T>
141 {};
142 /*! \endcond */
143 //*************************************************************************************************
144 
145 
146 //*************************************************************************************************
147 /*! \cond BLAZE_INTERNAL */
148 /*!\brief Specialization of the IsUniUpper type trait for cv qualified types.
149 // \ingroup math_type_traits
150 */
151 template< typename T >
152 struct IsUniUpper< const volatile T >
153    : public IsUniUpper<T>
154 {};
155 /*! \endcond */
156 //*************************************************************************************************
157 
158 
159 //*************************************************************************************************
160 /*!\brief Auxiliary variable template for the IsUniUpper type trait.
161 // \ingroup math_type_traits
162 //
163 // The IsUniUpper_v variable template provides a convenient shortcut to access the nested
164 // \a value of the IsUniUpper class template. For instance, given the type \a T the following
165 // two statements are identical:
166 
167    \code
168    constexpr bool value1 = blaze::IsUniUpper<T>::value;
169    constexpr bool value2 = blaze::IsUniUpper_v<T>;
170    \endcode
171 */
172 template< typename T >
173 constexpr bool IsUniUpper_v = IsUniUpper<T>::value;
174 //*************************************************************************************************
175 
176 } // namespace blaze
177 
178 #endif
179