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 {
425  EIGEN_DEVICE_FUNC const noncopyable& operator=(const noncopyable&);
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>
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> {
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> {
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
::int64_t int64_t
Definition: Meta.h:59
unsigned char uint8_t
Definition: ms_stdint.h:83
nullary_result_of_select< Func, FunctorType >::type type
Definition: Meta.h:538
#define EIGEN_DEFAULT_DENSE_INDEX_TYPE
const char Y
#define EIGEN_STRONG_INLINE
Definition: Macros.h:917
remove_all< T >::type type
Definition: Meta.h:130
EIGEN_DEVICE_FUNC ~noncopyable()
Definition: Meta.h:428
Key F(std::uint64_t j)
::int32_t int32_t
Definition: Meta.h:57
#define HIPRT_NAN_F
static internal::remove_reference< From >::type * ms_from
Definition: Meta.h:245
remove_all< T >::type type
Definition: Meta.h:128
::int8_t int8_t
Definition: Meta.h:53
void noncopyable()
EIGEN_DEVICE_FUNC const Scalar & x
Namespace containing all symbols from the Eigen library.
Definition: jet.h:637
static Cal3_S2 K(500, 500, 0.1, 640/2, 480/2)
CleanedUpDerType< DerType >::type() max(const AutoDiffScalar< DerType > &x, const T &y)
const T * return_ptr()
unsigned short uint16_t
Definition: ms_stdint.h:84
#define N
Definition: gksort.c:12
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const X &x, const Y &y)
Definition: Meta.h:798
signed char int8_t
Definition: ms_stdint.h:80
signed short int16_t
Definition: ms_stdint.h:81
std::size_t UIntPtr
Definition: Meta.h:92
EIGEN_DEVICE_FUNC T div_ceil(const T &a, const T &b)
Definition: Meta.h:779
static double epsilon
Definition: testRot3.cpp:37
remove_all< T >::type type
Definition: Meta.h:129
result_of< F(ArgType0, ArgType1)>::type type1
Definition: Meta.h:646
::uint32_t uint32_t
Definition: Meta.h:56
std::ptrdiff_t IntPtr
Definition: Meta.h:91
EIGEN_STRONG_INLINE void swap(T &a, T &b)
Definition: Meta.h:766
EIGEN_DEVICE_FUNC const Scalar & y
remove_all< T >::type type
Definition: Meta.h:131
EIGEN_CONSTEXPR Index size(const T(&) [N])
Definition: Meta.h:482
Values result
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
signed __int64 int64_t
Definition: ms_stdint.h:94
unsigned __int64 uint64_t
Definition: ms_stdint.h:95
unsigned int uint32_t
Definition: ms_stdint.h:85
Eigen::Triplet< double > T
signed int int32_t
Definition: ms_stdint.h:82
int data[]
ternary_result_of_select< Func, ArgType0, ArgType1, ArgType2, FunctorType >::type type
Definition: Meta.h:608
::uint16_t uint16_t
Definition: Meta.h:54
::uint64_t uint64_t
Definition: Meta.h:58
#define EIGEN_CONSTEXPR
Definition: Macros.h:787
Func::template result< Func(ArgType0, ArgType1, ArgType2)>::type type
Definition: Meta.h:596
#define HIPRT_MAX_NORMAL_F
void swap(GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &a, GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &b)
_W64 unsigned int uintptr_t
Definition: ms_stdint.h:124
EIGEN_DEVICE_FUNC noncopyable()
Definition: Meta.h:427
DenseIndex ret
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:50
CleanedUpDerType< DerType >::type() min(const AutoDiffScalar< DerType > &x, const T &y)
unary_result_of_select< Func, ArgType, FunctorType >::type type
Definition: Meta.h:560
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:976
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition: Meta.h:66
#define HIPRT_INF
::uint8_t uint8_t
Definition: Meta.h:52
internal::remove_all< ArgType0 >::type type
Definition: Meta.h:564
internal::remove_all< ArgType >::type type
Definition: Meta.h:542
::int16_t int16_t
Definition: Meta.h:55
void test(OptionalJacobian< 2, 3 > H={})
_W64 signed int intptr_t
Definition: ms_stdint.h:123
result_of< F(ArgType0, ArgType1, ArgType2)>::type type1
Definition: Meta.h:628
remove_all< type1 >::type type
Definition: Meta.h:629
remove_all< T >::type type
Definition: Meta.h:127
#define HIPRT_INF_F
const int Dynamic
Definition: Constants.h:22
binary_result_of_select< Func, ArgType0, ArgType1, FunctorType >::type type
Definition: Meta.h:584
#define X
Definition: icosphere.cpp:20
EIGEN_DEVICE_FUNC const Scalar & b
internal::remove_all< ArgType0 >::type type
Definition: Meta.h:588
#define HIPRT_NAN
Definition: pytypes.h:1370
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const X &x, const Y &y)
Definition: Meta.h:787
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


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:34:55