cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

TensorMacros.h (3642B)


      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 #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