1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2015 Benoit Steiner <benoit.steiner.goog@gmail.com>
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 #ifndef __CUDACC__
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 
47 #if EIGEN_HAS_CONSTEXPR
48 #define EIGEN_CONSTEXPR constexpr
49 #else
50 #define EIGEN_CONSTEXPR
51 #endif
52 
53 
54 #endif
55