WPILibC++ 2023.4.3-108-ge5452e3
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)
23 // #include "Eigen/src/Core/arch/HIP/hcc/math_constants.h"
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>
34namespace Eigen {
35namespace numext {
36typedef std::uint8_t uint8_t;
37typedef std::int8_t int8_t;
39typedef std::int16_t int16_t;
41typedef std::int32_t int32_t;
43typedef 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>
50namespace Eigen {
51namespace numext {
60}
61}
62#endif
63
64namespace Eigen {
65
67
68/**
69 * \brief The Index type as used for the API.
70 * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE.
71 * \sa \blank \ref TopicPreprocessorDirectives, StorageIndex.
72 */
73
75
76namespace internal {
77
78/** \internal
79 * \file Meta.h
80 * This file contains generic metaprogramming classes which are not specifically related to Eigen.
81 * \note In case you wonder, yes we're aware that Boost already provides all these features,
82 * we however don't want to add a dependency to Boost.
83 */
84
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
88typedef std::intptr_t IntPtr;
90#else
91typedef std::ptrdiff_t IntPtr;
92typedef std::size_t UIntPtr;
93#endif
94#undef EIGEN_ICC_NEEDS_CSTDINT
95
96struct true_type { enum { value = 1 }; };
97struct false_type { enum { value = 0 }; };
98
99template<bool Condition>
101
102template<>
103struct bool_constant<true> : true_type {};
104
105template<>
106struct bool_constant<false> : false_type {};
107
108template<bool Condition, typename Then, typename Else>
109struct conditional { typedef Then type; };
110
111template<typename Then, typename Else>
112struct conditional <false, Then, Else> { typedef Else type; };
113
114template<typename T> struct remove_reference { typedef T type; };
115template<typename T> struct remove_reference<T&> { typedef T type; };
116
117template<typename T> struct remove_pointer { typedef T type; };
118template<typename T> struct remove_pointer<T*> { typedef T type; };
119template<typename T> struct remove_pointer<T*const> { typedef T type; };
120
121template <class T> struct remove_const { typedef T type; };
122template <class T> struct remove_const<const T> { typedef T type; };
123template <class T> struct remove_const<const T[]> { typedef T type[]; };
124template <class T, unsigned int Size> struct remove_const<const T[Size]> { typedef T type[Size]; };
125
126template<typename T> struct remove_all { typedef T type; };
127template<typename T> struct remove_all<const T> { typedef typename remove_all<T>::type type; };
128template<typename T> struct remove_all<T const&> { typedef typename remove_all<T>::type type; };
129template<typename T> struct remove_all<T&> { typedef typename remove_all<T>::type type; };
130template<typename T> struct remove_all<T const*> { typedef typename remove_all<T>::type type; };
131template<typename T> struct remove_all<T*> { typedef typename remove_all<T>::type type; };
132
133template<typename T> struct is_arithmetic { enum { value = false }; };
134template<> struct is_arithmetic<float> { enum { value = true }; };
135template<> struct is_arithmetic<double> { enum { value = true }; };
136template<> struct is_arithmetic<long double> { enum { value = true }; };
137template<> struct is_arithmetic<bool> { enum { value = true }; };
138template<> struct is_arithmetic<char> { enum { value = true }; };
139template<> struct is_arithmetic<signed char> { enum { value = true }; };
140template<> struct is_arithmetic<unsigned char> { enum { value = true }; };
141template<> struct is_arithmetic<signed short> { enum { value = true }; };
142template<> struct is_arithmetic<unsigned short>{ enum { value = true }; };
143template<> struct is_arithmetic<signed int> { enum { value = true }; };
144template<> struct is_arithmetic<unsigned int> { enum { value = true }; };
145template<> struct is_arithmetic<signed long> { enum { value = true }; };
146template<> struct is_arithmetic<unsigned long> { enum { value = true }; };
147
148template<typename T, typename U> struct is_same { enum { value = 0 }; };
149template<typename T> struct is_same<T,T> { enum { value = 1 }; };
150
151template< class T >
152struct is_void : is_same<void, typename remove_const<T>::type> {};
153
154#if EIGEN_HAS_CXX11
155template<> struct is_arithmetic<signed long long> { enum { value = true }; };
156template<> struct is_arithmetic<unsigned long long> { enum { value = true }; };
157using std::is_integral;
158#else
159template<typename T> struct is_integral { enum { value = false }; };
160template<> struct is_integral<bool> { enum { value = true }; };
161template<> struct is_integral<char> { enum { value = true }; };
162template<> struct is_integral<signed char> { enum { value = true }; };
163template<> struct is_integral<unsigned char> { enum { value = true }; };
164template<> struct is_integral<signed short> { enum { value = true }; };
165template<> struct is_integral<unsigned short> { enum { value = true }; };
166template<> struct is_integral<signed int> { enum { value = true }; };
167template<> struct is_integral<unsigned int> { enum { value = true }; };
168template<> struct is_integral<signed long> { enum { value = true }; };
169template<> struct is_integral<unsigned long> { enum { value = true }; };
170#if EIGEN_COMP_MSVC
171template<> struct is_integral<signed __int64> { enum { value = true }; };
172template<> struct is_integral<unsigned __int64> { enum { value = true }; };
173#endif
174#endif
175
176#if EIGEN_HAS_CXX11
177using 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>.
182template<typename> struct make_unsigned;
183template<> struct make_unsigned<char> { typedef unsigned char type; };
184template<> struct make_unsigned<signed char> { typedef unsigned char type; };
185template<> struct make_unsigned<unsigned char> { typedef unsigned char type; };
186template<> struct make_unsigned<signed short> { typedef unsigned short type; };
187template<> struct make_unsigned<unsigned short> { typedef unsigned short type; };
188template<> struct make_unsigned<signed int> { typedef unsigned int type; };
189template<> struct make_unsigned<unsigned int> { typedef unsigned int type; };
190template<> struct make_unsigned<signed long> { typedef unsigned long type; };
191template<> struct make_unsigned<unsigned long> { typedef unsigned long type; };
192#if EIGEN_COMP_MSVC
193template<> struct make_unsigned<signed __int64> { typedef unsigned __int64 type; };
194template<> 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
203template<> struct make_unsigned<unsigned long long> { typedef unsigned long long type; };
204template<> struct make_unsigned<long long> { typedef unsigned long long type; };
205#endif
206#endif
207
208template <typename T> struct add_const { typedef const T type; };
209template <typename T> struct add_const<T&> { typedef T& type; };
210
211template <typename T> struct is_const { enum { value = 0 }; };
212template <typename T> struct is_const<T const> { enum { value = 1 }; };
213
214template<typename T> struct add_const_on_value_type { typedef const T type; };
215template<typename T> struct add_const_on_value_type<T&> { typedef T const& type; };
216template<typename T> struct add_const_on_value_type<T*> { typedef T const* type; };
217template<typename T> struct add_const_on_value_type<T* const> { typedef T const* const type; };
218template<typename T> struct add_const_on_value_type<T const* const> { typedef T const* const type; };
219
220#if EIGEN_HAS_CXX11
221
222using std::is_convertible;
223
224#else
225
226template<typename From, typename To>
228{
229private:
230 struct any_conversion
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
244public:
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
256template<typename From, typename To>
258{
260};
261
262template<typename T>
263struct is_convertible<T,T&> { enum { value = false }; };
264
265template<typename T>
266struct is_convertible<const T,const T&> { enum { value = true }; };
267
268#endif
269
270/** \internal Allows to enable/disable an overload
271 * according to a compile time condition.
272 */
273template<bool Condition, typename T=void> struct enable_if;
274
275template<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
284namespace device {
285
286template<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};
295template<> 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};
326template<> 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};
351template<> 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};
360template<> 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};
369template<> 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};
378template<> 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};
387template<> 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};
396template<> 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};
405template<> 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
419/** \internal
420 * A base class do disable default copy ctor and copy assignment operator.
421 */
423{
425 EIGEN_DEVICE_FUNC const noncopyable& operator=(const noncopyable&);
426protected:
429};
430
431/** \internal
432 * Provides access to the number of elements in the object of as a compile-time constant expression.
433 * It "returns" Eigen::Dynamic if the size cannot be resolved at compile-time (default).
434 *
435 * Similar to std::tuple_size, but more general.
436 *
437 * It currently supports:
438 * - any types T defining T::SizeAtCompileTime
439 * - plain C arrays as T[N]
440 * - std::array (c++11)
441 * - some internal types such as SingleRange and AllRange
442 *
443 * The second template parameter eases SFINAE-based specializations.
444 */
445template<typename T, typename EnableIf = void> struct array_size {
446 enum { value = Dynamic };
447};
448
449template<typename T> struct array_size<T,typename internal::enable_if<((T::SizeAtCompileTime&0)==0)>::type> {
450 enum { value = T::SizeAtCompileTime };
451};
452
453template<typename T, int N> struct array_size<const T (&)[N]> {
454 enum { value = N };
455};
456template<typename T, int N> struct array_size<T (&)[N]> {
457 enum { value = N };
458};
459
460#if EIGEN_HAS_CXX11
461template<typename T, std::size_t N> struct array_size<const std::array<T,N> > {
462 enum { value = N };
463};
464template<typename T, std::size_t N> struct array_size<std::array<T,N> > {
465 enum { value = N };
466};
467#endif
468
469/** \internal
470 * Analogue of the std::size free function.
471 * It returns the size of the container or view \a x of type \c T
472 *
473 * It currently supports:
474 * - any types T defining a member T::size() const
475 * - plain C arrays as T[N]
476 *
477 */
478template<typename T>
479EIGEN_CONSTEXPR Index size(const T& x) { return x.size(); }
480
481template<typename T,std::size_t N>
482EIGEN_CONSTEXPR Index size(const T (&) [N]) { return N; }
483
484/** \internal
485 * Convenient struct to get the result type of a nullary, unary, binary, or
486 * ternary functor.
487 *
488 * Pre C++11:
489 * Supports both a Func::result_type member and templated
490 * Func::result<Func(ArgTypes...)>::type member.
491 *
492 * If none of these members is provided, then the type of the first
493 * argument is returned.
494 *
495 * Post C++11:
496 * This uses std::result_of. However, note the `type` member removes
497 * const and converts references/pointers to their corresponding value type.
498 */
499#if EIGEN_HAS_STD_INVOKE_RESULT
500template<typename T> struct result_of;
501
502template<typename F, typename... ArgTypes>
503struct 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
508template<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
513template<typename T> struct result_of { };
514
515struct has_none {int a[1];};
516struct has_std_result_type {int a[2];};
517struct has_tr1_result {int a[3];};
518
519template<typename Func, int SizeOf>
521
522template<typename Func>
523struct nullary_result_of_select<Func, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
524
525template<typename Func>
526struct nullary_result_of_select<Func, sizeof(has_tr1_result)> {typedef typename Func::template result<Func()>::type type;};
527
528template<typename Func>
529struct 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);
535
536 // note that the following indirection is needed for gcc-3.3
537 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
539};
540
541template<typename Func, typename ArgType, int SizeOf=sizeof(has_none)>
543
544template<typename Func, typename ArgType>
545struct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
546
547template<typename Func, typename ArgType>
548struct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;};
549
550template<typename Func, typename ArgType>
551struct 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);
557
558 // note that the following indirection is needed for gcc-3.3
559 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
561};
562
563template<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)>
565
566template<typename Func, typename ArgType0, typename ArgType1>
567struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_std_result_type)>
568{typedef typename Func::result_type type;};
569
570template<typename Func, typename ArgType0, typename ArgType1>
571struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)>
572{typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;};
573
574template<typename Func, typename ArgType0, typename ArgType1>
575struct 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);
581
582 // note that the following indirection is needed for gcc-3.3
583 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
585};
586
587template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2, int SizeOf=sizeof(has_none)>
589
590template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
591struct ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, sizeof(has_std_result_type)>
592{typedef typename Func::result_type type;};
593
594template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
595struct 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
598template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
599struct 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);
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
614template<typename F, typename... ArgTypes>
615struct 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
620template<typename F, typename... ArgTypes>
621struct invoke_result {
622 typedef typename result_of<F(ArgTypes...)>::type type1;
623 typedef typename remove_all<type1>::type type;
624};
625#else
626template<typename F, typename ArgType0 = void, typename ArgType1 = void, typename ArgType2 = void>
628 typedef typename result_of<F(ArgType0, ArgType1, ArgType2)>::type type1;
630};
631
632template<typename F>
633struct invoke_result<F, void, void, void> {
634 typedef typename result_of<F()>::type type1;
636};
637
638template<typename F, typename ArgType0>
639struct invoke_result<F, ArgType0, void, void> {
640 typedef typename result_of<F(ArgType0)>::type type1;
642};
643
644template<typename F, typename ArgType0, typename ArgType1>
645struct invoke_result<F, ArgType0, ArgType1, void> {
646 typedef typename result_of<F(ArgType0, ArgType1)>::type type1;
648};
649#endif
650
651struct meta_yes { char a[1]; };
652struct meta_no { char a[2]; };
653
654// Check whether T::ReturnType does exist
655template <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
664template<typename T> const T* return_ptr();
665
666template <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
675template <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
684template <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
693/** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer.
694 * Usage example: \code meta_sqrt<1023>::ret \endcode
695 */
696template<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
713template<int Y, int InfX, int SupX>
714class meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
715
716
717/** \internal Computes the least common multiple of two positive integer A and B
718 * at compile-time.
719 */
720template<int A, int B, int K=1, bool Done = ((A*K)%B)==0, bool Big=(A>=B)>
722{
724};
725template<int A, int B, int K, bool Done>
726struct meta_least_common_multiple<A,B,K,Done,false>
727{
729};
730template<int A, int B, int K>
731struct meta_least_common_multiple<A,B,K,true,true>
732{
733 enum { ret = A*K };
734};
735
736
737/** \internal determines whether the product of two numeric types is allowed and what the return type is */
738template<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
749/** \internal Obtains a POD type suitable to use as storage for an object of a size
750 * of at most Len bytes, aligned as specified by \c Align.
751 */
752template<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
761namespace numext {
762
763#if defined(EIGEN_GPU_COMPILE_PHASE)
764template<typename T> EIGEN_DEVICE_FUNC void swap(T &a, T &b) { T tmp = b; b = a; a = tmp; }
765#else
766template<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
770using internal::device::numeric_limits;
771#else
772using 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
777template<typename T>
779T 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.
786template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
787bool 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))
791bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); }
792
794bool equal_strict(const double& x,const double& y) { return std::equal_to<double>()(x,y); }
795#endif
796
797template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
798bool 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))
802bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); }
803
805bool 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
#define EIGEN_DEFAULT_DENSE_INDEX_TYPE
Definition: Macros.h:33
#define EIGEN_CONSTEXPR
Definition: Macros.h:797
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:986
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
Definition: Meta.h:702
@ ret
Definition: Meta.h:710
Definition: Meta.h:423
EIGEN_DEVICE_FUNC ~noncopyable()
Definition: Meta.h:428
EIGEN_DEVICE_FUNC noncopyable()
Definition: Meta.h:427
Definition: core.h:1240
type
Definition: core.h:575
constexpr common_t< T1, T2 > max(const T1 x, const T2 y) noexcept
Compile-time pairwise maximum function.
Definition: max.hpp:35
constexpr common_t< T1, T2 > min(const T1 x, const T2 y) noexcept
Compile-time pairwise minimum function.
Definition: min.hpp:35
std::size_t UIntPtr
Definition: Meta.h:92
const T * return_ptr()
std::ptrdiff_t IntPtr
Definition: Meta.h:91
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
::uint64_t uint64_t
Definition: Meta.h:58
::int16_t int16_t
Definition: Meta.h:55
::uint16_t uint16_t
Definition: Meta.h:54
::uint32_t uint32_t
Definition: Meta.h:56
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool equal_strict(const X &x, const Y &y)
Definition: Meta.h:787
EIGEN_DEVICE_FUNC const Scalar & y
Definition: MathFunctions.h:1332
EIGEN_STRONG_INLINE void swap(T &a, T &b)
Definition: Meta.h:766
::int32_t int32_t
Definition: Meta.h:57
::int8_t int8_t
Definition: Meta.h:53
::int64_t int64_t
Definition: Meta.h:59
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool not_equal_strict(const X &x, const Y &y)
Definition: Meta.h:798
::uint8_t uint8_t
Definition: Meta.h:52
EIGEN_DEVICE_FUNC T div_ceil(const T &a, const T &b)
Definition: Meta.h:779
Namespace containing all symbols from the Eigen library.
Definition: Core:141
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex
Definition: Meta.h:66
const int Dynamic
This value means that a positive quantity (e.g., a size) is not known at compile-time,...
Definition: Constants.h:22
uint128_t uintptr_t
Definition: format.h:432
result
Definition: format.h:2564
Definition: Eigen_Colamd.h:50
Definition: BFloat16.h:88
void swap(wpi::SmallPtrSet< T, N > &LHS, wpi::SmallPtrSet< T, N > &RHS)
Implement std::swap in terms of SmallPtrSet swap.
Definition: SmallPtrSet.h:512
static constexpr const unit_t< compound_unit< charge::coulomb, inverse< substance::mol > > > F(N_A *e)
Faraday constant.
b
Definition: data.h:44
array(T, Ts...) -> array< T, 1+sizeof...(Ts)>
T & type
Definition: Meta.h:209
T const * type
Definition: Meta.h:216
T const *const type
Definition: Meta.h:217
T const & type
Definition: Meta.h:215
const T type
Definition: Meta.h:214
Definition: Meta.h:208
const T type
Definition: Meta.h:208
EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len]
Definition: Meta.h:753
Definition: Meta.h:445
Func::template result< Func(ArgType0, ArgType1)>::type type
Definition: Meta.h:572
internal::remove_all< ArgType0 >::type type
Definition: Meta.h:564
Definition: Meta.h:100
Definition: Meta.h:109
Then type
Definition: Meta.h:109
Definition: Meta.h:273
Definition: Meta.h:97
Definition: Meta.h:657
static meta_yes testFunctor(C const *, typename C::ReturnType const *=0)
static meta_no testFunctor(...)
static meta_yes testFunctor(C const *, typename enable_if<(sizeof(return_ptr< C >() ->operator()(IndexType(0), IndexType(0)))>0)>::type *=0)
Definition: Meta.h:515
int a[1]
Definition: Meta.h:515
static meta_yes testFunctor(C const *, typename enable_if<(sizeof(return_ptr< C >() ->operator()())>0)>::type *=0)
int a[2]
Definition: Meta.h:516
Definition: Meta.h:517
int a[3]
Definition: Meta.h:517
static meta_yes testFunctor(C const *, typename enable_if<(sizeof(return_ptr< C >() ->operator()(IndexType(0)))>0)>::type *=0)
remove_all< type1 >::type type
Definition: Meta.h:647
result_of< F(ArgType0, ArgType1)>::type type1
Definition: Meta.h:646
result_of< F(ArgType0)>::type type1
Definition: Meta.h:640
remove_all< type1 >::type type
Definition: Meta.h:641
result_of< F()>::type type1
Definition: Meta.h:634
remove_all< type1 >::type type
Definition: Meta.h:635
Definition: Meta.h:627
result_of< F(ArgType0, ArgType1, ArgType2)>::type type1
Definition: Meta.h:628
remove_all< type1 >::type type
Definition: Meta.h:629
Definition: Meta.h:133
Definition: Meta.h:211
static internal::remove_reference< From >::type * ms_from
Definition: Meta.h:245
Definition: Meta.h:258
Definition: Meta.h:159
Definition: Meta.h:148
Definition: Meta.h:152
unsigned char type
Definition: Meta.h:183
unsigned char type
Definition: Meta.h:184
unsigned int type
Definition: Meta.h:188
unsigned long type
Definition: Meta.h:190
unsigned short type
Definition: Meta.h:186
unsigned char type
Definition: Meta.h:185
unsigned int type
Definition: Meta.h:189
unsigned long type
Definition: Meta.h:191
unsigned short type
Definition: Meta.h:187
Definition: Meta.h:182
Definition: Meta.h:652
char a[2]
Definition: Meta.h:652
Definition: Meta.h:651
char a[1]
Definition: Meta.h:651
Func::template result< Func()>::type type
Definition: Meta.h:526
remove_all< T >::type type
Definition: Meta.h:131
remove_all< T >::type type
Definition: Meta.h:129
remove_all< T >::type type
Definition: Meta.h:130
remove_all< T >::type type
Definition: Meta.h:128
remove_all< T >::type type
Definition: Meta.h:127
Definition: Meta.h:126
T type
Definition: Meta.h:126
Definition: Meta.h:121
T type
Definition: Meta.h:121
Definition: Meta.h:117
T type
Definition: Meta.h:117
Definition: Meta.h:114
T type
Definition: Meta.h:114
static has_none testFunctor(...)
nullary_result_of_select< Func, FunctorType >::type type
Definition: Meta.h:538
static has_std_result_type testFunctor(T const *, typename T::result_type const *=0)
static has_tr1_result testFunctor(T const *, typename T::template result< T()>::type const *=0)
static has_std_result_type testFunctor(T const *, typename T::result_type const *=0)
ternary_result_of_select< Func, ArgType0, ArgType1, ArgType2, FunctorType >::type type
Definition: Meta.h:608
static has_tr1_result testFunctor(T const *, typename T::template result< T(ArgType0, ArgType1, ArgType2)>::type const *=0)
binary_result_of_select< Func, ArgType0, ArgType1, FunctorType >::type type
Definition: Meta.h:584
static has_tr1_result testFunctor(T const *, typename T::template result< T(ArgType0, ArgType1)>::type const *=0)
static has_std_result_type testFunctor(T const *, typename T::result_type const *=0)
unary_result_of_select< Func, ArgType, FunctorType >::type type
Definition: Meta.h:560
static has_std_result_type testFunctor(T const *, typename T::result_type const *=0)
static has_tr1_result testFunctor(T const *, typename T::template result< T(ArgType)>::type const *=0)
Definition: Meta.h:513
Func::template result< Func(ArgType0, ArgType1, ArgType2)>::type type
Definition: Meta.h:596
internal::remove_all< ArgType0 >::type type
Definition: Meta.h:588
Definition: Meta.h:96
Func::template result< Func(ArgType)>::type type
Definition: Meta.h:548
internal::remove_all< ArgType >::type type
Definition: Meta.h:542
Definition: format.h:1552
Definition: format.h:997