1 //=================================================================================================
2 /*!
3 //  \file blaze/math/typetraits/YieldsLower.h
4 //  \brief Header file for the YieldsLower 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_YIELDSLOWER_H_
36 #define _BLAZE_MATH_TYPETRAITS_YIELDSLOWER_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <blaze/math/typetraits/YieldsStrictlyLower.h>
44 #include <blaze/math/typetraits/YieldsUniLower.h>
45 #include <blaze/util/IntegralConstant.h>
46 
47 
48 namespace blaze {
49 
50 //=================================================================================================
51 //
52 //  CLASS DEFINITION
53 //
54 //=================================================================================================
55 
56 //*************************************************************************************************
57 /*!\brief Compile time check for operations on matrices.
58 // \ingroup math_type_traits
59 //
60 // This type trait tests whether or not the given operation \a OP yields a lower matrix when
61 // applied to several matrices of types \a MT and \a MTs. In case the operation yields a lower
62 // matrix, the \a value member constant is set to \a true, the nested type definition \a Type is
63 // \a TrueType, and the class derives from \a TrueType. Otherwise \a value is set to \a false,
64 // \a Type is \a FalseType, and the class derives from \a FalseType.
65 */
66 template< typename OP, typename MT, typename... MTs >
67 struct YieldsLower
68    : public BoolConstant< YieldsUniLower_v<OP,MT,MTs...> || YieldsStrictlyLower_v<OP,MT,MTs...> >
69 {};
70 //*************************************************************************************************
71 
72 
73 //*************************************************************************************************
74 /*! \cond BLAZE_INTERNAL */
75 /*!\brief Specialization of the YieldsLower type trait for const types.
76 // \ingroup math_type_traits
77 */
78 template< typename OP, typename MT, typename... MTs >
79 struct YieldsLower< const OP, MT, MTs... >
80    : public YieldsLower<OP,MT,MTs...>
81 {};
82 /*! \endcond */
83 //*************************************************************************************************
84 
85 
86 //*************************************************************************************************
87 /*! \cond BLAZE_INTERNAL */
88 /*!\brief Specialization of the YieldsLower type trait for volatile types.
89 // \ingroup math_type_traits
90 */
91 template< typename OP, typename MT, typename... MTs >
92 struct YieldsLower< volatile OP, MT, MTs... >
93    : public YieldsLower<OP,MT,MTs...>
94 {};
95 /*! \endcond */
96 //*************************************************************************************************
97 
98 
99 //*************************************************************************************************
100 /*! \cond BLAZE_INTERNAL */
101 /*!\brief Specialization of the YieldsLower type trait for cv qualified types.
102 // \ingroup math_type_traits
103 */
104 template< typename OP, typename MT, typename... MTs >
105 struct YieldsLower< const volatile OP, MT, MTs... >
106    : public YieldsLower<OP,MT,MTs...>
107 {};
108 /*! \endcond */
109 //*************************************************************************************************
110 
111 
112 //*************************************************************************************************
113 /*!\brief Auxiliary variable template for the YieldsLower type trait.
114 // \ingroup math_type_traits
115 //
116 // The YieldsLower_v variable template provides a convenient shortcut to access the nested
117 // \a value of the YieldsLower class template. For instance, given the operation \a OP and
118 // the matrix type \a MT the following two statements are identical:
119 
120    \code
121    constexpr bool value1 = blaze::YieldsLower<OP,MT>::value;
122    constexpr bool value2 = blaze::YieldsLower_v<OP,MT>;
123    \endcode
124 */
125 template< typename OP, typename MT, typename... MTs >
126 constexpr bool YieldsLower_v = YieldsLower<OP,MT,MTs...>::value;
127 //*************************************************************************************************
128 
129 } // namespace blaze
130 
131 #endif
132