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