Meta.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2015 Gael Guennebaud <gael.guennebaud@inria.fr>
5 // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_META_H
12 #define EIGEN_META_H
13 
14 #if defined(EIGEN_GPU_COMPILE_PHASE)
15 
16  #include <cfloat>
17 
18  #if defined(EIGEN_CUDA_ARCH)
19  #include <math_constants.h>
20  #endif
21 
22  #if defined(EIGEN_HIP_DEVICE_COMPILE)
24  #endif
25 
26 #endif
27 
28 // Recent versions of ICC require <cstdint> for pointer types below.
29 #define EIGEN_ICC_NEEDS_CSTDINT (EIGEN_COMP_ICC>=1600 && EIGEN_COMP_CXXVER >= 11)
30 
31 // Define portable (u)int{32,64} types
32 #if EIGEN_HAS_CXX11 || EIGEN_ICC_NEEDS_CSTDINT
33 #include <cstdint>
34 namespace Eigen {
35 namespace numext {
36 typedef std::uint8_t uint8_t;
37 typedef std::int8_t int8_t;
38 typedef std::uint16_t uint16_t;
39 typedef std::int16_t int16_t;
40 typedef std::uint32_t uint32_t;
41 typedef std::int32_t int32_t;
42 typedef std::uint64_t uint64_t;
43 typedef std::int64_t int64_t;
44 }
45 }
46 #else
47 // Without c++11, all compilers able to compile Eigen also
48 // provide the C99 stdint.h header file.
49 #include <stdint.h>
50 namespace Eigen {
51 namespace numext {
60 }
61 }
62 #endif
63 
64 namespace Eigen {
65 
67 
75 
76 namespace internal {
77 
85 // Only recent versions of ICC complain about using ptrdiff_t to hold pointers,
86 // and older versions do not provide *intptr_t types.
87 #if EIGEN_ICC_NEEDS_CSTDINT
88 typedef std::intptr_t IntPtr;
89 typedef std::uintptr_t UIntPtr;
90 #else
91 typedef std::ptrdiff_t IntPtr;
93 #endif
94 #undef EIGEN_ICC_NEEDS_CSTDINT
95 
96 struct true_type { enum { value = 1 }; };
97 struct false_type { enum { value = 0 }; };
98 
99 template<bool Condition>
101 
102 template<>
103 struct bool_constant<true> : true_type {};
104 
105 template<>
106 struct bool_constant<false> : false_type {};
107 
108 template<bool Condition, typename Then, typename Else>
109 struct conditional { typedef Then type; };
110 
111 template<typename Then, typename Else>
112 struct conditional <false, Then, Else> { typedef Else type; };
113 
114 template<typename T> struct remove_reference { typedef T type; };
115 template<typename T> struct remove_reference<T&> { typedef T type; };
116 
117 template<typename T> struct remove_pointer { typedef T type; };
118 template<typename T> struct remove_pointer<T*> { typedef T type; };
119 template<typename T> struct remove_pointer<T*const> { typedef T type; };
120 
121 template <class T> struct remove_const { typedef T type; };
122 template <class T> struct remove_const<const T> { typedef T type; };
123 template <class T> struct remove_const<const T[]> { typedef T type[]; };
124 template <class T, unsigned int Size> struct remove_const<const T[Size]> { typedef T type[Size]; };
125 
126 template<typename T> struct remove_all { typedef T type; };
127 template<typename T> struct remove_all<const T> { typedef typename remove_all<T>::type type; };
128 template<typename T> struct remove_all<T const&> { typedef typename remove_all<T>::type type; };
129 template<typename T> struct remove_all<T&> { typedef typename remove_all<T>::type type; };
130 template<typename T> struct remove_all<T const*> { typedef typename remove_all<T>::type type; };
131 template<typename T> struct remove_all<T*> { typedef typename remove_all<T>::type type; };
132 
133 template<typename T> struct is_arithmetic { enum { value = false }; };
134 template<> struct is_arithmetic<float> { enum { value = true }; };
135 template<> struct is_arithmetic<double> { enum { value = true }; };
136 template<> struct is_arithmetic<long double> { enum { value = true }; };
137 template<> struct is_arithmetic<bool> { enum { value = true }; };
138 template<> struct is_arithmetic<char> { enum { value = true }; };
139 template<> struct is_arithmetic<signed char> { enum { value = true }; };
140 template<> struct is_arithmetic<unsigned char> { enum { value = true }; };
141 template<> struct is_arithmetic<signed short> { enum { value = true }; };
142 template<> struct is_arithmetic<unsigned short>{ enum { value = true }; };
143 template<> struct is_arithmetic<signed int> { enum { value = true }; };
144 template<> struct is_arithmetic<unsigned int> { enum { value = true }; };
145 template<> struct is_arithmetic<signed long> { enum { value = true }; };
146 template<> struct is_arithmetic<unsigned long> { enum { value = true }; };
147 
148 template<typename T, typename U> struct is_same { enum { value = 0 }; };
149 template<typename T> struct is_same<T,T> { enum { value = 1 }; };
150 
151 template< class T >
152 struct is_void : is_same<void, typename remove_const<T>::type> {};
153 
154 #if EIGEN_HAS_CXX11
155 template<> struct is_arithmetic<signed long long> { enum { value = true }; };
156 template<> struct is_arithmetic<unsigned long long> { enum { value = true }; };
157 using std::is_integral;
158 #else
159 template<typename T> struct is_integral { enum { value = false }; };
160 template<> struct is_integral<bool> { enum { value = true }; };
161 template<> struct is_integral<char> { enum { value = true }; };
162 template<> struct is_integral<signed char> { enum { value = true }; };
163 template<> struct is_integral<unsigned char> { enum { value = true }; };
164 template<> struct is_integral<signed short> { enum { value = true }; };
165 template<> struct is_integral<unsigned short> { enum { value = true }; };
166 template<> struct is_integral<signed int> { enum { value = true }; };
167 template<> struct is_integral<unsigned int> { enum { value = true }; };
168 template<> struct is_integral<signed long> { enum { value = true }; };
169 template<> struct is_integral<unsigned long> { enum { value = true }; };
170 #if EIGEN_COMP_MSVC
171 template<> struct is_integral<signed __int64> { enum { value = true }; };
172 template<> struct is_integral<unsigned __int64> { enum { value = true }; };
173 #endif
174 #endif
175 
176 #if EIGEN_HAS_CXX11
177 using std::make_unsigned;
178 #else
179 // TODO: Possibly improve this implementation of make_unsigned.
180 // It is currently used only by
181 // template<typename Scalar> struct random_default_impl<Scalar, false, true>.
182 template<typename> struct make_unsigned;
183 template<> struct make_unsigned<char> { typedef unsigned char type; };
184 template<> struct make_unsigned<signed char> { typedef unsigned char type; };
185 template<> struct make_unsigned<unsigned char> { typedef unsigned char type; };
186 template<> struct make_unsigned<signed short> { typedef unsigned short type; };
187 template<> struct make_unsigned<unsigned short> { typedef unsigned short type; };
188 template<> struct make_unsigned<signed int> { typedef unsigned int type; };
189 template<> struct make_unsigned<unsigned int> { typedef unsigned int type; };
190 template<> struct make_unsigned<signed long> { typedef unsigned long type; };
191 template<> struct make_unsigned<unsigned long> { typedef unsigned long type; };
192 #if EIGEN_COMP_MSVC
193 template<> struct make_unsigned<signed __int64> { typedef unsigned __int64 type; };
194 template<> struct make_unsigned<unsigned __int64> { typedef unsigned __int64 type; };
195 #endif
196 
197 // Some platforms define int64_t as `long long` even for C++03, where
198 // `long long` is not guaranteed by the standard. In this case we are missing
199 // the definition for make_unsigned. If we just define it, we run into issues
200 // where `long long` doesn't exist in some compilers for C++03. We therefore add
201 // the specialization for these platforms only.
202 #if EIGEN_OS_MAC || EIGEN_COMP_MINGW
203 template<> struct make_unsigned<unsigned long long> { typedef unsigned long long type; };
204 template<> struct make_unsigned<long long> { typedef unsigned long long type; };
205 #endif
206 #endif
207 
208 template <typename T> struct add_const { typedef const T type; };
209 template <typename T> struct add_const<T&> { typedef T& type; };
210 
211 template <typename T> struct is_const { enum { value = 0 }; };
212 template <typename T> struct is_const<T const> { enum { value = 1 }; };
213 
214 template<typename T> struct add_const_on_value_type { typedef const T type; };
215 template<typename T> struct add_const_on_value_type<T&> { typedef T const& type; };
216 template<typename T> struct add_const_on_value_type<T*> { typedef T const* type; };
217 template<typename T> struct add_const_on_value_type<T* const> { typedef T const* const type; };
218 template<typename T> struct add_const_on_value_type<T const* const> { typedef T const* const type; };
219 
220 #if EIGEN_HAS_CXX11
221 
222 using std::is_convertible;
223 
224 #else
225 
226 template<typename From, typename To>
228 {
229 private:
231  {
232  template <typename T> any_conversion(const volatile T&);
233  template <typename T> any_conversion(T&);
234  };
235  struct yes {int a[1];};
236  struct no {int a[2];};
237 
238  template<typename T>
239  static yes test(T, int);
240 
241  template<typename T>
242  static no test(any_conversion, ...);
243 
244 public:
246 #ifdef __INTEL_COMPILER
247  #pragma warning push
248  #pragma warning ( disable : 2259 )
249 #endif
250  enum { value = sizeof(test<To>(*ms_from, 0))==sizeof(yes) };
251 #ifdef __INTEL_COMPILER
252  #pragma warning pop
253 #endif
254 };
255 
256 template<typename From, typename To>
258 {
260 };
261 
262 template<typename T>
263 struct is_convertible<T,T&> { enum { value = false }; };
264 
265 template<typename T>
266 struct is_convertible<const T,const T&> { enum { value = true }; };
267 
268 #endif
269 
273 template<bool Condition, typename T=void> struct enable_if;
274 
275 template<typename T> struct enable_if<true,T>
276 { typedef T type; };
277 
278 #if defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
279 #if !defined(__FLT_EPSILON__)
280 #define __FLT_EPSILON__ FLT_EPSILON
281 #define __DBL_EPSILON__ DBL_EPSILON
282 #endif
283 
284 namespace device {
285 
286 template<typename T> struct numeric_limits
287 {
289  static EIGEN_CONSTEXPR T epsilon() { return 0; }
290  static T (max)() { assert(false && "Highest not supported for this type"); }
291  static T (min)() { assert(false && "Lowest not supported for this type"); }
292  static T infinity() { assert(false && "Infinity not supported for this type"); }
293  static T quiet_NaN() { assert(false && "quiet_NaN not supported for this type"); }
294 };
295 template<> struct numeric_limits<float>
296 {
298  static float epsilon() { return __FLT_EPSILON__; }
300  static float (max)() {
301  #if defined(EIGEN_CUDA_ARCH)
302  return CUDART_MAX_NORMAL_F;
303  #else
304  return HIPRT_MAX_NORMAL_F;
305  #endif
306  }
308  static float (min)() { return FLT_MIN; }
310  static float infinity() {
311  #if defined(EIGEN_CUDA_ARCH)
312  return CUDART_INF_F;
313  #else
314  return HIPRT_INF_F;
315  #endif
316  }
318  static float quiet_NaN() {
319  #if defined(EIGEN_CUDA_ARCH)
320  return CUDART_NAN_F;
321  #else
322  return HIPRT_NAN_F;
323  #endif
324  }
325 };
326 template<> struct numeric_limits<double>
327 {
329  static double epsilon() { return __DBL_EPSILON__; }
331  static double (max)() { return DBL_MAX; }
333  static double (min)() { return DBL_MIN; }
335  static double infinity() {
336  #if defined(EIGEN_CUDA_ARCH)
337  return CUDART_INF;
338  #else
339  return HIPRT_INF;
340  #endif
341  }
343  static double quiet_NaN() {
344  #if defined(EIGEN_CUDA_ARCH)
345  return CUDART_NAN;
346  #else
347  return HIPRT_NAN;
348  #endif
349  }
350 };
351 template<> struct numeric_limits<int>
352 {
354  static int epsilon() { return 0; }
356  static int (max)() { return INT_MAX; }
358  static int (min)() { return INT_MIN; }
359 };
360 template<> struct numeric_limits<unsigned int>
361 {
363  static unsigned int epsilon() { return 0; }
365  static unsigned int (max)() { return UINT_MAX; }
367  static unsigned int (min)() { return 0; }
368 };
369 template<> struct numeric_limits<long>
370 {
372  static long epsilon() { return 0; }
374  static long (max)() { return LONG_MAX; }
376  static long (min)() { return LONG_MIN; }
377 };
378 template<> struct numeric_limits<unsigned long>
379 {
381  static unsigned long epsilon() { return 0; }
383  static unsigned long (max)() { return ULONG_MAX; }
385  static unsigned long (min)() { return 0; }
386 };
387 template<> struct numeric_limits<long long>
388 {
390  static long long epsilon() { return 0; }
392  static long long (max)() { return LLONG_MAX; }
394  static long long (min)() { return LLONG_MIN; }
395 };
396 template<> struct numeric_limits<unsigned long long>
397 {
399  static unsigned long long epsilon() { return 0; }
401  static unsigned long long (max)() { return ULLONG_MAX; }
403  static unsigned long long (min)() { return 0; }
404 };
405 template<> struct numeric_limits<bool>
406 {
408  static bool epsilon() { return false; }
410  static bool (max)() { return true; }
412  static bool (min)() { return false; }
413 };
414 
415 }
416 
417 #endif // defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
418 
423 {
426 protected:
429 };
430 
445 template<typename T, typename EnableIf = void> struct array_size {
446  enum { value = Dynamic };
447 };
448 
449 template<typename T> struct array_size<T,typename internal::enable_if<((T::SizeAtCompileTime&0)==0)>::type> {
450  enum { value = T::SizeAtCompileTime };
451 };
452 
453 template<typename T, int N> struct array_size<const T (&)[N]> {
454  enum { value = N };
455 };
456 template<typename T, int N> struct array_size<T (&)[N]> {
457  enum { value = N };
458 };
459 
460 #if EIGEN_HAS_CXX11
461 template<typename T, std::size_t N> struct array_size<const std::array<T,N> > {
462  enum { value = N };
463 };
464 template<typename T, std::size_t N> struct array_size<std::array<T,N> > {
465  enum { value = N };
466 };
467 #endif
468 
478 template<typename T>
479 EIGEN_CONSTEXPR Index size(const T& x) { return x.size(); }
480 
481 template<typename T,std::size_t N>
482 EIGEN_CONSTEXPR Index size(const T (&) [N]) { return N; }
483 
499 #if EIGEN_HAS_STD_INVOKE_RESULT
500 template<typename T> struct result_of;
501 
502 template<typename F, typename... ArgTypes>
503 struct result_of<F(ArgTypes...)> {
504  typedef typename std::invoke_result<F, ArgTypes...>::type type1;
505  typedef typename remove_all<type1>::type type;
506 };
507 #elif EIGEN_HAS_STD_RESULT_OF
508 template<typename T> struct result_of {
509  typedef typename std::result_of<T>::type type1;
510  typedef typename remove_all<type1>::type type;
511 };
512 #else
513 template<typename T> struct result_of { };
514 
515 struct has_none {int a[1];};
516 struct has_std_result_type {int a[2];};
517 struct has_tr1_result {int a[3];};
518 
519 template<typename Func, int SizeOf>
521 
522 template<typename Func>
523 struct nullary_result_of_select<Func, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
524 
525 template<typename Func>
526 struct nullary_result_of_select<Func, sizeof(has_tr1_result)> {typedef typename Func::template result<Func()>::type type;};
527 
528 template<typename Func>
529 struct result_of<Func()> {
530  template<typename T>
531  static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
532  template<typename T>
533  static has_tr1_result testFunctor(T const *, typename T::template result<T()>::type const * = 0);
534  static has_none testFunctor(...);
535 
536  // note that the following indirection is needed for gcc-3.3
537  enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
539 };
540 
541 template<typename Func, typename ArgType, int SizeOf=sizeof(has_none)>
543 
544 template<typename Func, typename ArgType>
545 struct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
546 
547 template<typename Func, typename ArgType>
548 struct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;};
549 
550 template<typename Func, typename ArgType>
551 struct result_of<Func(ArgType)> {
552  template<typename T>
553  static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
554  template<typename T>
555  static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0);
556  static has_none testFunctor(...);
557 
558  // note that the following indirection is needed for gcc-3.3
559  enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
561 };
562 
563 template<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)>
565 
566 template<typename Func, typename ArgType0, typename ArgType1>
567 struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_std_result_type)>
568 {typedef typename Func::result_type type;};
569 
570 template<typename Func, typename ArgType0, typename ArgType1>
571 struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)>
572 {typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;};
573 
574 template<typename Func, typename ArgType0, typename ArgType1>
575 struct result_of<Func(ArgType0,ArgType1)> {
576  template<typename T>
577  static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
578  template<typename T>
579  static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0);
580  static has_none testFunctor(...);
581 
582  // note that the following indirection is needed for gcc-3.3
583  enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
585 };
586 
587 template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2, int SizeOf=sizeof(has_none)>
589 
590 template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
591 struct ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, sizeof(has_std_result_type)>
592 {typedef typename Func::result_type type;};
593 
594 template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
595 struct ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, sizeof(has_tr1_result)>
596 {typedef typename Func::template result<Func(ArgType0,ArgType1,ArgType2)>::type type;};
597 
598 template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
599 struct result_of<Func(ArgType0,ArgType1,ArgType2)> {
600  template<typename T>
601  static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
602  template<typename T>
603  static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1,ArgType2)>::type const * = 0);
604  static has_none testFunctor(...);
605 
606  // note that the following indirection is needed for gcc-3.3
607  enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
609 };
610 
611 #endif
612 
613 #if EIGEN_HAS_STD_INVOKE_RESULT
614 template<typename F, typename... ArgTypes>
615 struct invoke_result {
616  typedef typename std::invoke_result<F, ArgTypes...>::type type1;
617  typedef typename remove_all<type1>::type type;
618 };
619 #elif EIGEN_HAS_CXX11
620 template<typename F, typename... ArgTypes>
621 struct invoke_result {
622  typedef typename result_of<F(ArgTypes...)>::type type1;
623  typedef typename remove_all<type1>::type type;
624 };
625 #else
626 template<typename F, typename ArgType0 = void, typename ArgType1 = void, typename ArgType2 = void>
628  typedef typename result_of<F(ArgType0, ArgType1, ArgType2)>::type type1;
629  typedef typename remove_all<type1>::type type;
630 };
631 
632 template<typename F>
633 struct invoke_result<F, void, void, void> {
634  typedef typename result_of<F()>::type type1;
635  typedef typename remove_all<type1>::type type;
636 };
637 
638 template<typename F, typename ArgType0>
639 struct invoke_result<F, ArgType0, void, void> {
640  typedef typename result_of<F(ArgType0)>::type type1;
641  typedef typename remove_all<type1>::type type;
642 };
643 
644 template<typename F, typename ArgType0, typename ArgType1>
645 struct invoke_result<F, ArgType0, ArgType1, void> {
646  typedef typename result_of<F(ArgType0, ArgType1)>::type type1;
647  typedef typename remove_all<type1>::type type;
648 };
649 #endif
650 
651 struct meta_yes { char a[1]; };
652 struct meta_no { char a[2]; };
653 
654 // Check whether T::ReturnType does exist
655 template <typename T>
657 {
658  template <typename C> static meta_yes testFunctor(C const *, typename C::ReturnType const * = 0);
659  template <typename C> static meta_no testFunctor(...);
660 
661  enum { value = sizeof(testFunctor<T>(static_cast<T*>(0))) == sizeof(meta_yes) };
662 };
663 
664 template<typename T> const T* return_ptr();
665 
666 template <typename T, typename IndexType=Index>
668 {
669  template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()())>0)>::type * = 0);
670  static meta_no testFunctor(...);
671 
672  enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
673 };
674 
675 template <typename T, typename IndexType=Index>
677 {
678  template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0)))>0)>::type * = 0);
679  static meta_no testFunctor(...);
680 
681  enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
682 };
683 
684 template <typename T, typename IndexType=Index>
686 {
687  template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0),IndexType(0)))>0)>::type * = 0);
688  static meta_no testFunctor(...);
689 
690  enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
691 };
692 
696 template<int Y,
697  int InfX = 0,
698  int SupX = ((Y==1) ? 1 : Y/2),
699  bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >
700  // use ?: instead of || just to shut up a stupid gcc 4.3 warning
702 {
703  enum {
704  MidX = (InfX+SupX)/2,
705  TakeInf = MidX*MidX > Y ? 1 : 0,
706  NewInf = int(TakeInf) ? InfX : int(MidX),
707  NewSup = int(TakeInf) ? int(MidX) : SupX
708  };
709  public:
711 };
712 
713 template<int Y, int InfX, int SupX>
714 class meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
715 
716 
720 template<int A, int B, int K=1, bool Done = ((A*K)%B)==0, bool Big=(A>=B)>
722 {
724 };
725 template<int A, int B, int K, bool Done>
726 struct meta_least_common_multiple<A,B,K,Done,false>
727 {
729 };
730 template<int A, int B, int K>
731 struct meta_least_common_multiple<A,B,K,true,true>
732 {
733  enum { ret = A*K };
734 };
735 
736 
738 template<typename T, typename U> struct scalar_product_traits
739 {
740  enum { Defined = 0 };
741 };
742 
743 // FIXME quick workaround around current limitation of result_of
744 // template<typename Scalar, typename ArgType0, typename ArgType1>
745 // struct result_of<scalar_product_op<Scalar>(ArgType0,ArgType1)> {
746 // typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type;
747 // };
748 
752 template<unsigned Len, unsigned Align>
754  struct type {
755  EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len];
756  };
757 };
758 
759 } // end namespace internal
760 
761 namespace numext {
762 
763 #if defined(EIGEN_GPU_COMPILE_PHASE)
764 template<typename T> EIGEN_DEVICE_FUNC void swap(T &a, T &b) { T tmp = b; b = a; a = tmp; }
765 #else
766 template<typename T> EIGEN_STRONG_INLINE void swap(T &a, T &b) { std::swap(a,b); }
767 #endif
768 
769 #if defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
770 using internal::device::numeric_limits;
771 #else
772 using std::numeric_limits;
773 #endif
774 
775 // Integer division with rounding up.
776 // T is assumed to be an integer type with a>=0, and b>0
777 template<typename T>
779 T div_ceil(const T &a, const T &b)
780 {
781  return (a+b-1) / b;
782 }
783 
784 // The aim of the following functions is to bypass -Wfloat-equal warnings
785 // when we really want a strict equality comparison on floating points.
786 template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
787 bool equal_strict(const X& x,const Y& y) { return x == y; }
788 
789 #if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
791 bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); }
792 
794 bool equal_strict(const double& x,const double& y) { return std::equal_to<double>()(x,y); }
795 #endif
796 
797 template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
798 bool not_equal_strict(const X& x,const Y& y) { return x != y; }
799 
800 #if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
802 bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); }
803 
805 bool not_equal_strict(const double& x,const double& y) { return std::not_equal_to<double>()(x,y); }
806 #endif
807 
808 } // end namespace numext
809 
810 } // end namespace Eigen
811 
812 #endif // EIGEN_META_H
Eigen::internal::make_unsigned< signed char >::type
unsigned char type
Definition: Meta.h:184
gtsam.examples.DogLegOptimizerExample.int
int
Definition: DogLegOptimizerExample.py:111
Eigen::internal::invoke_result
Definition: Meta.h:627
Eigen::numext::div_ceil
EIGEN_DEVICE_FUNC T div_ceil(const T &a, const T &b)
Definition: Meta.h:779
Eigen::internal::meta_least_common_multiple::ret
@ ret
Definition: Meta.h:723
Eigen::internal::meta_sqrt::ret
@ ret
Definition: Meta.h:710
Eigen::internal::meta_yes::a
char a[1]
Definition: Meta.h:651
Eigen::internal::has_unary_operator::testFunctor
static meta_yes testFunctor(C const *, typename enable_if<(sizeof(return_ptr< C >() ->operator()(IndexType(0)))>0)>::type *=0)
Eigen::internal::array_size::value
@ value
Definition: Meta.h:446
Eigen::internal::invoke_result< F, ArgType0, ArgType1, void >::type
remove_all< type1 >::type type
Definition: Meta.h:647
EIGEN_DEVICE_FUNC
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:976
Eigen::internal::make_unsigned< unsigned long >::type
unsigned long type
Definition: Meta.h:191
Eigen::internal::remove_reference< T & >::type
T type
Definition: Meta.h:115
Eigen
Namespace containing all symbols from the Eigen library.
Definition: jet.h:637
Eigen::internal::make_unsigned< char >::type
unsigned char type
Definition: Meta.h:183
Eigen::internal::noncopyable
Definition: Meta.h:422
Eigen::internal::add_const_on_value_type< T *const >::type
T const *const type
Definition: Meta.h:217
Y
const char Y
Definition: test/EulerAngles.cpp:31
int16_t
signed short int16_t
Definition: ms_stdint.h:81
Eigen::internal::add_const::type
const typedef T type
Definition: Meta.h:208
Eigen::max
CleanedUpDerType< DerType >::type() max(const AutoDiffScalar< DerType > &x, const T &y)
Definition: AutoDiffScalar.h:585
Eigen::internal::meta_sqrt
Definition: Meta.h:701
Eigen::numext::int16_t
::int16_t int16_t
Definition: Meta.h:55
Eigen::internal::has_ReturnType::testFunctor
static meta_yes testFunctor(C const *, typename C::ReturnType const *=0)
gtsam.examples.DogLegOptimizerExample.type
type
Definition: DogLegOptimizerExample.py:111
Eigen::internal::is_same::value
@ value
Definition: Meta.h:148
Eigen::internal::UIntPtr
std::size_t UIntPtr
Definition: Meta.h:92
Eigen::internal::meta_no
Definition: Meta.h:652
Eigen::array
Definition: EmulateArray.h:21
Eigen::internal::binary_result_of_select< Func, ArgType0, ArgType1, sizeof(has_std_result_type)>::type
Func::result_type type
Definition: Meta.h:568
Eigen::internal::remove_all
Definition: Meta.h:126
uint32_t
unsigned int uint32_t
Definition: ms_stdint.h:85
Eigen::internal::nullary_result_of_select
Definition: Meta.h:520
b
Scalar * b
Definition: benchVecAdd.cpp:17
Eigen::internal::conditional::type
Then type
Definition: Meta.h:109
Eigen::internal::unary_result_of_select
Definition: Meta.h:542
Eigen::numext::uint32_t
::uint32_t uint32_t
Definition: Meta.h:56
Eigen::internal::invoke_result< F, void, void, void >::type
remove_all< type1 >::type type
Definition: Meta.h:635
x
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Definition: gnuplot_common_settings.hh:12
Eigen::internal::is_convertible_impl::ms_from
static internal::remove_reference< From >::type * ms_from
Definition: Meta.h:245
Eigen::internal::invoke_result< F, ArgType0, void, void >::type1
result_of< F(ArgType0)>::type type1
Definition: Meta.h:640
Eigen::internal::false_type
Definition: Meta.h:97
Eigen::internal::noncopyable::noncopyable
EIGEN_DEVICE_FUNC noncopyable()
Definition: Meta.h:427
ret
DenseIndex ret
Definition: level1_cplx_impl.h:44
B
Definition: test_numpy_dtypes.cpp:299
EIGEN_CONSTEXPR
#define EIGEN_CONSTEXPR
Definition: Macros.h:787
Eigen::internal::true_type::value
@ value
Definition: Meta.h:96
HIPRT_NAN
#define HIPRT_NAN
Definition: math_constants.h:21
type
Definition: pytypes.h:1491
Eigen::internal::remove_all< T const * >::type
remove_all< T >::type type
Definition: Meta.h:130
Eigen::numext::int64_t
::int64_t int64_t
Definition: Meta.h:59
T
Eigen::Triplet< double > T
Definition: Tutorial_sparse_example.cpp:6
Eigen::internal::remove_all::type
T type
Definition: Meta.h:126
Eigen::internal::invoke_result::type
remove_all< type1 >::type type
Definition: Meta.h:629
Eigen::internal::remove_all< const T >::type
remove_all< T >::type type
Definition: Meta.h:127
X
#define X
Definition: icosphere.cpp:20
Eigen::internal::scalar_product_traits
Definition: Meta.h:738
EIGEN_DEFAULT_DENSE_INDEX_TYPE
#define EIGEN_DEFAULT_DENSE_INDEX_TYPE
Definition: tensor_benchmarks.h:5
Eigen::internal::remove_pointer< T * >::type
T type
Definition: Meta.h:118
Eigen::internal::is_convertible_impl::test
static yes test(T, int)
result
Values result
Definition: OdometryOptimize.cpp:8
uint8_t
unsigned char uint8_t
Definition: ms_stdint.h:83
Eigen::internal::aligned_storage::type::EIGEN_ALIGN_TO_BOUNDARY
EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len]
Eigen::internal::ternary_result_of_select< Func, ArgType0, ArgType1, ArgType2, sizeof(has_tr1_result)>::type
Func::template result< Func(ArgType0, ArgType1, ArgType2)>::type type
Definition: Meta.h:596
Eigen::internal::is_arithmetic::value
@ value
Definition: Meta.h:133
Eigen::numext::uint64_t
::uint64_t uint64_t
Definition: Meta.h:58
Eigen::internal::ternary_result_of_select< Func, ArgType0, ArgType1, ArgType2, sizeof(has_std_result_type)>::type
Func::result_type type
Definition: Meta.h:592
Eigen::internal::has_ReturnType
Definition: Meta.h:656
Eigen::internal::add_const< T & >::type
T & type
Definition: Meta.h:209
Eigen::numext::equal_strict
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const double &x, const double &y)
Definition: Meta.h:794
Eigen::internal::has_binary_operator
Definition: Meta.h:685
epsilon
static double epsilon
Definition: testRot3.cpp:37
Eigen::internal::is_convertible
Definition: Meta.h:257
Eigen::internal::add_const_on_value_type::type
const typedef T type
Definition: Meta.h:214
Eigen::internal::aligned_storage::type
Definition: Meta.h:754
Eigen::internal::enable_if< true, T >::type
T type
Definition: Meta.h:276
Eigen::internal::true_type
Definition: Meta.h:96
Eigen::internal::remove_pointer
Definition: Meta.h:117
Eigen::internal::remove_const
Definition: Meta.h:121
Eigen::internal::remove_reference::type
T type
Definition: Meta.h:114
Eigen::internal::result_of< Func(ArgType)>::type
unary_result_of_select< Func, ArgType, FunctorType >::type type
Definition: Meta.h:560
Eigen::internal::ternary_result_of_select::type
internal::remove_all< ArgType0 >::type type
Definition: Meta.h:588
Eigen::numext::uint16_t
::uint16_t uint16_t
Definition: Meta.h:54
Eigen::internal::make_unsigned< unsigned short >::type
unsigned short type
Definition: Meta.h:187
A
Definition: test_numpy_dtypes.cpp:298
data
int data[]
Definition: Map_placement_new.cpp:1
Eigen::internal::remove_pointer< T *const >::type
T type
Definition: Meta.h:119
int64_t
signed __int64 int64_t
Definition: ms_stdint.h:94
Eigen::internal::result_of< Func()>::type
nullary_result_of_select< Func, FunctorType >::type type
Definition: Meta.h:538
HIPRT_INF_F
#define HIPRT_INF_F
Definition: math_constants.h:11
Eigen::internal::is_convertible_impl::value
@ value
Definition: Meta.h:250
Eigen::internal::add_const_on_value_type< T * >::type
T const * type
Definition: Meta.h:216
Eigen::internal::binary_result_of_select< Func, ArgType0, ArgType1, sizeof(has_tr1_result)>::type
Func::template result< Func(ArgType0, ArgType1)>::type type
Definition: Meta.h:572
Eigen::internal::binary_result_of_select
Definition: Meta.h:564
intptr_t
_W64 signed int intptr_t
Definition: ms_stdint.h:123
Eigen::Dynamic
const int Dynamic
Definition: Constants.h:22
Eigen::internal::add_const_on_value_type< T & >::type
T const & type
Definition: Meta.h:215
Eigen::internal::is_convertible_impl::no::a
int a[2]
Definition: Meta.h:236
Eigen::internal::result_of< Func(ArgType0, ArgType1)>::type
binary_result_of_select< Func, ArgType0, ArgType1, FunctorType >::type type
Definition: Meta.h:584
Eigen::internal::remove_all< T * >::type
remove_all< T >::type type
Definition: Meta.h:131
EIGEN_STRONG_INLINE
#define EIGEN_STRONG_INLINE
Definition: Macros.h:917
Eigen::internal::is_convertible_impl::no
Definition: Meta.h:236
std::swap
void swap(GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &a, GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &b)
Definition: NearestNeighbor.hpp:827
Eigen::internal::is_integral::value
@ value
Definition: Meta.h:159
Eigen::internal::invoke_result< F, void, void, void >::type1
result_of< F()>::type type1
Definition: Meta.h:634
Eigen::internal::add_const
Definition: Meta.h:208
math_constants.h
Eigen::internal::noncopyable::~noncopyable
EIGEN_DEVICE_FUNC ~noncopyable()
Definition: Meta.h:428
Eigen::Triplet< double >
Eigen::internal::invoke_result::type1
result_of< F(ArgType0, ArgType1, ArgType2)>::type type1
Definition: Meta.h:628
Eigen::internal::is_convertible_impl::any_conversion::any_conversion
any_conversion(const volatile T &)
int8_t
signed char int8_t
Definition: ms_stdint.h:80
Eigen::internal::has_none::a
int a[1]
Definition: Meta.h:515
Eigen::internal::is_convertible_impl
Definition: Meta.h:227
Eigen::internal::make_unsigned< signed int >::type
unsigned int type
Definition: Meta.h:188
Eigen::internal::is_convertible::value
@ value
Definition: Meta.h:259
gtsam::symbol_shorthand::F
Key F(std::uint64_t j)
Definition: inference/Symbol.h:153
size_t
std::size_t size_t
Definition: wrap/pybind11/include/pybind11/detail/common.h:476
Eigen::internal::remove_reference
Definition: Meta.h:114
Eigen::internal::is_integral
Definition: Meta.h:159
anyset::size
size_t size() const
Definition: pytypes.h:2173
Eigen::internal::array_size
Definition: Meta.h:445
Eigen::internal::invoke_result< F, ArgType0, ArgType1, void >::type1
result_of< F(ArgType0, ArgType1)>::type type1
Definition: Meta.h:646
Eigen::internal::has_std_result_type
Definition: Meta.h:516
Eigen::internal::return_ptr
const T * return_ptr()
Eigen::internal::remove_const::type
T type
Definition: Meta.h:121
Eigen::internal::false_type::value
@ value
Definition: Meta.h:97
Eigen::internal::unary_result_of_select< Func, ArgType, sizeof(has_std_result_type)>::type
Func::result_type type
Definition: Meta.h:545
Eigen::internal::nullary_result_of_select< Func, sizeof(has_std_result_type)>::type
Func::result_type type
Definition: Meta.h:523
a
ArrayXXi a
Definition: Array_initializer_list_23_cxx11.cpp:1
array
Definition: numpy.h:684
Eigen::internal::ternary_result_of_select
Definition: Meta.h:588
C
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:50
Eigen::internal::remove_const< const T >::type
T type
Definition: Meta.h:122
Eigen::numext::not_equal_strict
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const double &x, const double &y)
Definition: Meta.h:805
HIPRT_NAN_F
#define HIPRT_NAN_F
Definition: math_constants.h:12
Eigen::internal::invoke_result< F, ArgType0, void, void >::type
remove_all< type1 >::type type
Definition: Meta.h:641
Eigen::internal::has_nullary_operator::value
@ value
Definition: Meta.h:672
Eigen::internal::unary_result_of_select< Func, ArgType, sizeof(has_tr1_result)>::type
Func::template result< Func(ArgType)>::type type
Definition: Meta.h:548
Eigen::numext::int8_t
::int8_t int8_t
Definition: Meta.h:53
K
#define K
Definition: igam.h:8
Eigen::DenseIndex
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition: Meta.h:66
Eigen::numext::uint8_t
::uint8_t uint8_t
Definition: Meta.h:52
Eigen::internal::result_of< Func(ArgType0, ArgType1, ArgType2)>::type
ternary_result_of_select< Func, ArgType0, ArgType1, ArgType2, FunctorType >::type type
Definition: Meta.h:608
Eigen::internal::binary_result_of_select::type
internal::remove_all< ArgType0 >::type type
Definition: Meta.h:564
Eigen::internal::make_unsigned< unsigned char >::type
unsigned char type
Definition: Meta.h:185
Eigen::internal::y
const Scalar & y
Definition: Eigen/src/Core/MathFunctions.h:821
std
Definition: BFloat16.h:88
Eigen::internal::has_nullary_operator::testFunctor
static meta_yes testFunctor(C const *, typename enable_if<(sizeof(return_ptr< C >() ->operator()())>0)>::type *=0)
Eigen::internal::conditional
Definition: Meta.h:109
uint16_t
unsigned short uint16_t
Definition: ms_stdint.h:84
Eigen::internal::swap
void swap(scoped_array< T > &a, scoped_array< T > &b)
Definition: Memory.h:709
Eigen::internal::has_none
Definition: Meta.h:515
Eigen::internal::is_const::value
@ value
Definition: Meta.h:211
Eigen::internal::remove_pointer::type
T type
Definition: Meta.h:117
Eigen::internal::is_convertible_impl::yes
Definition: Meta.h:235
Eigen::internal::has_binary_operator::testFunctor
static meta_yes testFunctor(C const *, typename enable_if<(sizeof(return_ptr< C >() ->operator()(IndexType(0), IndexType(0)))>0)>::type *=0)
Eigen::internal::remove_all< T & >::type
remove_all< T >::type type
Definition: Meta.h:129
Eigen::internal::result_of
Definition: Meta.h:513
Eigen::internal::has_unary_operator
Definition: Meta.h:676
Eigen::internal::is_convertible_impl::any_conversion
Definition: Meta.h:230
Eigen::internal::scalar_product_traits::Defined
@ Defined
Definition: Meta.h:740
gtsam.examples.DogLegOptimizerExample.float
float
Definition: DogLegOptimizerExample.py:113
int32_t
signed int int32_t
Definition: ms_stdint.h:82
Eigen::internal::is_same
Definition: Meta.h:148
Eigen::internal::is_void
Definition: Meta.h:152
uint64_t
unsigned __int64 uint64_t
Definition: ms_stdint.h:95
Eigen::internal::meta_no::a
char a[2]
Definition: Meta.h:652
N
#define N
Definition: igam.h:9
internal
Definition: BandTriangularSolver.h:13
Eigen::internal::is_const
Definition: Meta.h:211
Eigen::min
CleanedUpDerType< DerType >::type() min(const AutoDiffScalar< DerType > &x, const T &y)
Definition: AutoDiffScalar.h:580
Eigen::internal::add_const_on_value_type< T const *const >::type
T const *const type
Definition: Meta.h:218
Eigen::internal::meta_yes
Definition: Meta.h:651
HIPRT_MAX_NORMAL_F
#define HIPRT_MAX_NORMAL_F
Definition: math_constants.h:14
gtsam::internal::Align
static Similarity2 Align(const Point2Pairs &d_abPointPairs, const Rot2 &aRb, const Point2Pair &centroids)
This method estimates the similarity transform from differences point pairs, given a known or estimat...
Definition: Similarity2.cpp:74
Eigen::internal::enable_if
Definition: Meta.h:273
Eigen::internal::make_unsigned< signed long >::type
unsigned long type
Definition: Meta.h:190
Eigen::internal::aligned_storage
Definition: Meta.h:753
Eigen::internal::has_tr1_result::a
int a[3]
Definition: Meta.h:517
Eigen::internal::nullary_result_of_select< Func, sizeof(has_tr1_result)>::type
Func::template result< Func()>::type type
Definition: Meta.h:526
Eigen::internal::make_unsigned< unsigned int >::type
unsigned int type
Definition: Meta.h:189
Eigen::internal::size
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
Eigen::internal::is_convertible_impl::yes::a
int a[1]
Definition: Meta.h:235
Eigen::internal::remove_all< T const & >::type
remove_all< T >::type type
Definition: Meta.h:128
HIPRT_INF
#define HIPRT_INF
Definition: math_constants.h:20
Eigen::internal::make_unsigned< signed short >::type
unsigned short type
Definition: Meta.h:186
Eigen::internal::conditional< false, Then, Else >::type
Else type
Definition: Meta.h:112
Eigen::internal::IntPtr
std::ptrdiff_t IntPtr
Definition: Meta.h:91
Eigen::internal::has_nullary_operator
Definition: Meta.h:667
test_callbacks.value
value
Definition: test_callbacks.py:158
Eigen::internal::has_tr1_result
Definition: Meta.h:517
Eigen::internal::make_unsigned
Definition: Meta.h:182
Eigen::internal::has_binary_operator::value
@ value
Definition: Meta.h:690
uintptr_t
_W64 unsigned int uintptr_t
Definition: ms_stdint.h:124
Eigen::internal::meta_least_common_multiple
Definition: Meta.h:721
Eigen::numext::int32_t
::int32_t int32_t
Definition: Meta.h:57
Eigen::internal::unary_result_of_select::type
internal::remove_all< ArgType >::type type
Definition: Meta.h:542
Eigen::internal::has_ReturnType::value
@ value
Definition: Meta.h:661
Eigen::internal::has_std_result_type::a
int a[2]
Definition: Meta.h:516
Eigen::internal::bool_constant
Definition: Meta.h:100
Eigen::internal::is_arithmetic
Definition: Meta.h:133
Eigen::Index
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Eigen::internal::has_unary_operator::value
@ value
Definition: Meta.h:681
Eigen::internal::noncopyable::operator=
const EIGEN_DEVICE_FUNC noncopyable & operator=(const noncopyable &)
Eigen::internal::add_const_on_value_type
Definition: Meta.h:214


gtsam
Author(s):
autogenerated on Sat Jun 1 2024 03:02:24