xref: /aosp_15_r20/external/eigen/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2015 Benoit Steiner <[email protected]>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_CXX11_TENSOR_TENSOR_META_MACROS_H
11 #define EIGEN_CXX11_TENSOR_TENSOR_META_MACROS_H
12 
13 
14 /** use this macro in sfinae selection in templated functions
15  *
16  *   template<typename T,
17  *            typename std::enable_if< isBanana<T>::value , int >::type = 0
18  *   >
19  *   void foo(){}
20  *
21  *   becomes =>
22  *
23  *   template<typename TopoType,
24  *           SFINAE_ENABLE_IF( isBanana<T>::value )
25  *   >
26  *   void foo(){}
27  */
28 
29 // SFINAE requires variadic templates
30 #if !defined(EIGEN_GPUCC)
31 #if EIGEN_HAS_VARIADIC_TEMPLATES
32   // SFINAE doesn't work for gcc <= 4.7
33   #ifdef EIGEN_COMP_GNUC
34     #if EIGEN_GNUC_AT_LEAST(4,8)
35       #define EIGEN_HAS_SFINAE
36     #endif
37   #else
38     #define EIGEN_HAS_SFINAE
39   #endif
40 #endif
41 #endif
42 
43 #define EIGEN_SFINAE_ENABLE_IF( __condition__ ) \
44     typename internal::enable_if< ( __condition__ ) , int >::type = 0
45 
46 // Define a macro to use a reference on the host but a value on the device
47 #if defined(SYCL_DEVICE_ONLY)
48   #define EIGEN_DEVICE_REF
49 #else
50   #define EIGEN_DEVICE_REF &
51 #endif
52 
53 // Define a macro for catching SYCL exceptions if exceptions are enabled
54 #define EIGEN_SYCL_TRY_CATCH(X) \
55   do { \
56     EIGEN_TRY {X;} \
57     EIGEN_CATCH(const cl::sycl::exception& e) { \
58       EIGEN_THROW_X(std::runtime_error("SYCL exception at " + \
59                                        std::string(__FILE__) + ":" + \
60                                        std::to_string(__LINE__) + "\n" + \
61                                        e.what())); \
62     } \
63   } while (false)
64 
65 // Define a macro if local memory flags are unset or one of them is set
66 // Setting both flags is the same as unsetting them
67 #if (!defined(EIGEN_SYCL_LOCAL_MEM) && !defined(EIGEN_SYCL_NO_LOCAL_MEM)) || \
68      (defined(EIGEN_SYCL_LOCAL_MEM) &&  defined(EIGEN_SYCL_NO_LOCAL_MEM))
69   #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_ON 1
70   #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_OFF 1
71 #elif defined(EIGEN_SYCL_LOCAL_MEM) && !defined(EIGEN_SYCL_NO_LOCAL_MEM)
72   #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_ON 1
73 #elif !defined(EIGEN_SYCL_LOCAL_MEM) && defined(EIGEN_SYCL_NO_LOCAL_MEM)
74   #define EIGEN_SYCL_LOCAL_MEM_UNSET_OR_OFF 1
75 #endif
76 
77 #if EIGEN_COMP_CLANG // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653)
78   #define EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
79     using Base::operator =; \
80     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) { Base::operator=(other); return *this; } \
81     template <typename OtherDerived> \
82     EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const OtherDerived& other) { Base::operator=(other); return *this; }
83 #else
84   #define EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
85     EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)
86 #endif
87 
88 /** \internal
89  * \brief Macro to manually inherit assignment operators.
90  * This is necessary, because the implicitly defined assignment operator gets deleted when a custom operator= is defined.
91  * This also inherits template<OtherDerived> operator=(const OtherDerived&) assignments.
92  * With C++11 or later this also default-implements the copy-constructor
93  */
94 #define EIGEN_TENSOR_INHERIT_ASSIGNMENT_OPERATORS(Derived)  \
95     EIGEN_TENSOR_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
96     EIGEN_DEFAULT_COPY_CONSTRUCTOR(Derived)
97 
98 #endif
99