Please, help us to better know about our user community by answering the following short survey: https://forms.gle/wpyrxWi18ox9Z5ae9
Eigen  3.4.0
 
Loading...
Searching...
No Matches
Meta.h
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;
38typedef std::uint16_t uint16_t;
39typedef std::int16_t int16_t;
40typedef std::uint32_t uint32_t;
41typedef std::int32_t int32_t;
42typedef std::uint64_t uint64_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 {
52typedef ::uint8_t uint8_t;
53typedef ::int8_t int8_t;
54typedef ::uint16_t uint16_t;
55typedef ::int16_t int16_t;
56typedef ::uint32_t uint32_t;
57typedef ::int32_t int32_t;
58typedef ::uint64_t uint64_t;
59typedef ::int64_t int64_t;
60}
61}
62#endif
63
64namespace Eigen {
65
66typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex;
67
74typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE Index;
75
76namespace 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
88typedef std::intptr_t IntPtr;
89typedef std::uintptr_t UIntPtr;
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>
100struct bool_constant;
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;
183
184template<> struct make_unsigned<long long int> { typedef unsigned long long int type; };
185template<> struct make_unsigned<char> { typedef unsigned char type; };
186template<> struct make_unsigned<signed char> { typedef unsigned char type; };
187template<> struct make_unsigned<unsigned char> { typedef unsigned char type; };
188template<> struct make_unsigned<signed short> { typedef unsigned short type; };
189template<> struct make_unsigned<unsigned short> { typedef unsigned short type; };
190template<> struct make_unsigned<signed int> { typedef unsigned int type; };
191template<> struct make_unsigned<unsigned int> { typedef unsigned int type; };
192template<> struct make_unsigned<signed long> { typedef unsigned long type; };
193template<> struct make_unsigned<unsigned long> { typedef unsigned long type; };
194#if EIGEN_COMP_MSVC
195template<> struct make_unsigned<signed __int64> { typedef unsigned __int64 type; };
196template<> struct make_unsigned<unsigned __int64> { typedef unsigned __int64 type; };
197#endif
198
199// Some platforms define int64_t as `long long` even for C++03, where
200// `long long` is not guaranteed by the standard. In this case we are missing
201// the definition for make_unsigned. If we just define it, we run into issues
202// where `long long` doesn't exist in some compilers for C++03. We therefore add
203// the specialization for these platforms only.
204#if EIGEN_OS_MAC || EIGEN_COMP_MINGW
205template<> struct make_unsigned<unsigned long long> { typedef unsigned long long type; };
206template<> struct make_unsigned<long long> { typedef unsigned long long type; };
207#endif
208#endif
209
210template <typename T> struct add_const { typedef const T type; };
211template <typename T> struct add_const<T&> { typedef T& type; };
212
213template <typename T> struct is_const { enum { value = 0 }; };
214template <typename T> struct is_const<T const> { enum { value = 1 }; };
215
216template<typename T> struct add_const_on_value_type { typedef const T type; };
217template<typename T> struct add_const_on_value_type<T&> { typedef T const& type; };
218template<typename T> struct add_const_on_value_type<T*> { typedef T const* type; };
219template<typename T> struct add_const_on_value_type<T* const> { typedef T const* const type; };
220template<typename T> struct add_const_on_value_type<T const* const> { typedef T const* const type; };
221
222#if EIGEN_HAS_CXX11
223
224using std::is_convertible;
225
226#else
227
228template<typename From, typename To>
229struct is_convertible_impl
230{
231private:
232 struct any_conversion
233 {
234 template <typename T> any_conversion(const volatile T&);
235 template <typename T> any_conversion(T&);
236 };
237 struct yes {int a[1];};
238 struct no {int a[2];};
239
240 template<typename T>
241 static yes test(T, int);
242
243 template<typename T>
244 static no test(any_conversion, ...);
245
246public:
247 static typename internal::remove_reference<From>::type* ms_from;
248#ifdef __INTEL_COMPILER
249 #pragma warning push
250 #pragma warning ( disable : 2259 )
251#endif
252 enum { value = sizeof(test<To>(*ms_from, 0))==sizeof(yes) };
253#ifdef __INTEL_COMPILER
254 #pragma warning pop
255#endif
256};
257
258template<typename From, typename To>
259struct is_convertible
260{
261 enum { value = is_convertible_impl<From,To>::value };
262};
263
264template<typename T>
265struct is_convertible<T,T&> { enum { value = false }; };
266
267template<typename T>
268struct is_convertible<const T,const T&> { enum { value = true }; };
269
270#endif
271
275template<bool Condition, typename T=void> struct enable_if;
276
277template<typename T> struct enable_if<true,T>
278{ typedef T type; };
279
280#if defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
281#if !defined(__FLT_EPSILON__)
282#define __FLT_EPSILON__ FLT_EPSILON
283#define __DBL_EPSILON__ DBL_EPSILON
284#endif
285
286namespace device {
287
288template<typename T> struct numeric_limits
289{
290 EIGEN_DEVICE_FUNC
291 static EIGEN_CONSTEXPR T epsilon() { return 0; }
292 static T (max)() { assert(false && "Highest not supported for this type"); }
293 static T (min)() { assert(false && "Lowest not supported for this type"); }
294 static T infinity() { assert(false && "Infinity not supported for this type"); }
295 static T quiet_NaN() { assert(false && "quiet_NaN not supported for this type"); }
296};
297template<> struct numeric_limits<float>
298{
299 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
300 static float epsilon() { return __FLT_EPSILON__; }
301 EIGEN_DEVICE_FUNC
302 static float (max)() {
303 #if defined(EIGEN_CUDA_ARCH)
304 return CUDART_MAX_NORMAL_F;
305 #else
306 return HIPRT_MAX_NORMAL_F;
307 #endif
308 }
309 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
310 static float (min)() { return FLT_MIN; }
311 EIGEN_DEVICE_FUNC
312 static float infinity() {
313 #if defined(EIGEN_CUDA_ARCH)
314 return CUDART_INF_F;
315 #else
316 return HIPRT_INF_F;
317 #endif
318 }
319 EIGEN_DEVICE_FUNC
320 static float quiet_NaN() {
321 #if defined(EIGEN_CUDA_ARCH)
322 return CUDART_NAN_F;
323 #else
324 return HIPRT_NAN_F;
325 #endif
326 }
327};
328template<> struct numeric_limits<double>
329{
330 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
331 static double epsilon() { return __DBL_EPSILON__; }
332 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
333 static double (max)() { return DBL_MAX; }
334 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
335 static double (min)() { return DBL_MIN; }
336 EIGEN_DEVICE_FUNC
337 static double infinity() {
338 #if defined(EIGEN_CUDA_ARCH)
339 return CUDART_INF;
340 #else
341 return HIPRT_INF;
342 #endif
343 }
344 EIGEN_DEVICE_FUNC
345 static double quiet_NaN() {
346 #if defined(EIGEN_CUDA_ARCH)
347 return CUDART_NAN;
348 #else
349 return HIPRT_NAN;
350 #endif
351 }
352};
353template<> struct numeric_limits<int>
354{
355 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
356 static int epsilon() { return 0; }
357 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
358 static int (max)() { return INT_MAX; }
359 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
360 static int (min)() { return INT_MIN; }
361};
362template<> struct numeric_limits<unsigned int>
363{
364 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
365 static unsigned int epsilon() { return 0; }
366 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
367 static unsigned int (max)() { return UINT_MAX; }
368 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
369 static unsigned int (min)() { return 0; }
370};
371template<> struct numeric_limits<long>
372{
373 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
374 static long epsilon() { return 0; }
375 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
376 static long (max)() { return LONG_MAX; }
377 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
378 static long (min)() { return LONG_MIN; }
379};
380template<> struct numeric_limits<unsigned long>
381{
382 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
383 static unsigned long epsilon() { return 0; }
384 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
385 static unsigned long (max)() { return ULONG_MAX; }
386 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
387 static unsigned long (min)() { return 0; }
388};
389template<> struct numeric_limits<long long>
390{
391 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
392 static long long epsilon() { return 0; }
393 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
394 static long long (max)() { return LLONG_MAX; }
395 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
396 static long long (min)() { return LLONG_MIN; }
397};
398template<> struct numeric_limits<unsigned long long>
399{
400 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
401 static unsigned long long epsilon() { return 0; }
402 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
403 static unsigned long long (max)() { return ULLONG_MAX; }
404 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
405 static unsigned long long (min)() { return 0; }
406};
407template<> struct numeric_limits<bool>
408{
409 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
410 static bool epsilon() { return false; }
411 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
412 static bool (max)() { return true; }
413 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
414 static bool (min)() { return false; }
415};
416
417}
418
419#endif // defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
420
424class noncopyable
425{
426 EIGEN_DEVICE_FUNC noncopyable(const noncopyable&);
427 EIGEN_DEVICE_FUNC const noncopyable& operator=(const noncopyable&);
428protected:
429 EIGEN_DEVICE_FUNC noncopyable() {}
430 EIGEN_DEVICE_FUNC ~noncopyable() {}
431};
432
447template<typename T, typename EnableIf = void> struct array_size {
448 enum { value = Dynamic };
449};
450
451template<typename T> struct array_size<T,typename internal::enable_if<((T::SizeAtCompileTime&0)==0)>::type> {
452 enum { value = T::SizeAtCompileTime };
453};
454
455template<typename T, int N> struct array_size<const T (&)[N]> {
456 enum { value = N };
457};
458template<typename T, int N> struct array_size<T (&)[N]> {
459 enum { value = N };
460};
461
462#if EIGEN_HAS_CXX11
463template<typename T, std::size_t N> struct array_size<const std::array<T,N> > {
464 enum { value = N };
465};
466template<typename T, std::size_t N> struct array_size<std::array<T,N> > {
467 enum { value = N };
468};
469#endif
470
480template<typename T>
481EIGEN_CONSTEXPR Index size(const T& x) { return x.size(); }
482
483template<typename T,std::size_t N>
484EIGEN_CONSTEXPR Index size(const T (&) [N]) { return N; }
485
501#if EIGEN_HAS_STD_INVOKE_RESULT
502template<typename T> struct result_of;
503
504template<typename F, typename... ArgTypes>
505struct result_of<F(ArgTypes...)> {
506 typedef typename std::invoke_result<F, ArgTypes...>::type type1;
507 typedef typename remove_all<type1>::type type;
508};
509#elif EIGEN_HAS_STD_RESULT_OF
510template<typename T> struct result_of {
511 typedef typename std::result_of<T>::type type1;
512 typedef typename remove_all<type1>::type type;
513};
514#else
515template<typename T> struct result_of { };
516
517struct has_none {int a[1];};
518struct has_std_result_type {int a[2];};
519struct has_tr1_result {int a[3];};
520
521template<typename Func, int SizeOf>
522struct nullary_result_of_select {};
523
524template<typename Func>
525struct nullary_result_of_select<Func, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
526
527template<typename Func>
528struct nullary_result_of_select<Func, sizeof(has_tr1_result)> {typedef typename Func::template result<Func()>::type type;};
529
530template<typename Func>
531struct result_of<Func()> {
532 template<typename T>
533 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
534 template<typename T>
535 static has_tr1_result testFunctor(T const *, typename T::template result<T()>::type const * = 0);
536 static has_none testFunctor(...);
537
538 // note that the following indirection is needed for gcc-3.3
539 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
540 typedef typename nullary_result_of_select<Func, FunctorType>::type type;
541};
542
543template<typename Func, typename ArgType, int SizeOf=sizeof(has_none)>
544struct unary_result_of_select {typedef typename internal::remove_all<ArgType>::type type;};
545
546template<typename Func, typename ArgType>
547struct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
548
549template<typename Func, typename ArgType>
550struct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;};
551
552template<typename Func, typename ArgType>
553struct result_of<Func(ArgType)> {
554 template<typename T>
555 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
556 template<typename T>
557 static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0);
558 static has_none testFunctor(...);
559
560 // note that the following indirection is needed for gcc-3.3
561 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
562 typedef typename unary_result_of_select<Func, ArgType, FunctorType>::type type;
563};
564
565template<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)>
566struct binary_result_of_select {typedef typename internal::remove_all<ArgType0>::type type;};
567
568template<typename Func, typename ArgType0, typename ArgType1>
569struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_std_result_type)>
570{typedef typename Func::result_type type;};
571
572template<typename Func, typename ArgType0, typename ArgType1>
573struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)>
574{typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;};
575
576template<typename Func, typename ArgType0, typename ArgType1>
577struct result_of<Func(ArgType0,ArgType1)> {
578 template<typename T>
579 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
580 template<typename T>
581 static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0);
582 static has_none testFunctor(...);
583
584 // note that the following indirection is needed for gcc-3.3
585 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
586 typedef typename binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type;
587};
588
589template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2, int SizeOf=sizeof(has_none)>
590struct ternary_result_of_select {typedef typename internal::remove_all<ArgType0>::type type;};
591
592template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
593struct ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, sizeof(has_std_result_type)>
594{typedef typename Func::result_type type;};
595
596template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
597struct ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, sizeof(has_tr1_result)>
598{typedef typename Func::template result<Func(ArgType0,ArgType1,ArgType2)>::type type;};
599
600template<typename Func, typename ArgType0, typename ArgType1, typename ArgType2>
601struct result_of<Func(ArgType0,ArgType1,ArgType2)> {
602 template<typename T>
603 static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
604 template<typename T>
605 static has_tr1_result testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1,ArgType2)>::type const * = 0);
606 static has_none testFunctor(...);
607
608 // note that the following indirection is needed for gcc-3.3
609 enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
610 typedef typename ternary_result_of_select<Func, ArgType0, ArgType1, ArgType2, FunctorType>::type type;
611};
612
613#endif
614
615#if EIGEN_HAS_STD_INVOKE_RESULT
616template<typename F, typename... ArgTypes>
617struct invoke_result {
618 typedef typename std::invoke_result<F, ArgTypes...>::type type1;
619 typedef typename remove_all<type1>::type type;
620};
621#elif EIGEN_HAS_CXX11
622template<typename F, typename... ArgTypes>
623struct invoke_result {
624 typedef typename result_of<F(ArgTypes...)>::type type1;
625 typedef typename remove_all<type1>::type type;
626};
627#else
628template<typename F, typename ArgType0 = void, typename ArgType1 = void, typename ArgType2 = void>
629struct invoke_result {
630 typedef typename result_of<F(ArgType0, ArgType1, ArgType2)>::type type1;
631 typedef typename remove_all<type1>::type type;
632};
633
634template<typename F>
635struct invoke_result<F, void, void, void> {
636 typedef typename result_of<F()>::type type1;
637 typedef typename remove_all<type1>::type type;
638};
639
640template<typename F, typename ArgType0>
641struct invoke_result<F, ArgType0, void, void> {
642 typedef typename result_of<F(ArgType0)>::type type1;
643 typedef typename remove_all<type1>::type type;
644};
645
646template<typename F, typename ArgType0, typename ArgType1>
647struct invoke_result<F, ArgType0, ArgType1, void> {
648 typedef typename result_of<F(ArgType0, ArgType1)>::type type1;
649 typedef typename remove_all<type1>::type type;
650};
651#endif
652
653struct meta_yes { char a[1]; };
654struct meta_no { char a[2]; };
655
656// Check whether T::ReturnType does exist
657template <typename T>
658struct has_ReturnType
659{
660 template <typename C> static meta_yes testFunctor(C const *, typename C::ReturnType const * = 0);
661 template <typename C> static meta_no testFunctor(...);
662
663 enum { value = sizeof(testFunctor<T>(static_cast<T*>(0))) == sizeof(meta_yes) };
664};
665
666template<typename T> const T* return_ptr();
667
668template <typename T, typename IndexType=Index>
669struct has_nullary_operator
670{
671 template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()())>0)>::type * = 0);
672 static meta_no testFunctor(...);
673
674 enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
675};
676
677template <typename T, typename IndexType=Index>
678struct has_unary_operator
679{
680 template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0)))>0)>::type * = 0);
681 static meta_no testFunctor(...);
682
683 enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
684};
685
686template <typename T, typename IndexType=Index>
687struct has_binary_operator
688{
689 template <typename C> static meta_yes testFunctor(C const *,typename enable_if<(sizeof(return_ptr<C>()->operator()(IndexType(0),IndexType(0)))>0)>::type * = 0);
690 static meta_no testFunctor(...);
691
692 enum { value = sizeof(testFunctor(static_cast<T*>(0))) == sizeof(meta_yes) };
693};
694
698template<int Y,
699 int InfX = 0,
700 int SupX = ((Y==1) ? 1 : Y/2),
701 bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >
702 // use ?: instead of || just to shut up a stupid gcc 4.3 warning
703class meta_sqrt
704{
705 enum {
706 MidX = (InfX+SupX)/2,
707 TakeInf = MidX*MidX > Y ? 1 : 0,
708 NewInf = int(TakeInf) ? InfX : int(MidX),
709 NewSup = int(TakeInf) ? int(MidX) : SupX
710 };
711 public:
712 enum { ret = meta_sqrt<Y,NewInf,NewSup>::ret };
713};
714
715template<int Y, int InfX, int SupX>
716class meta_sqrt<Y, InfX, SupX, true> { public: enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
717
718
722template<int A, int B, int K=1, bool Done = ((A*K)%B)==0, bool Big=(A>=B)>
723struct meta_least_common_multiple
724{
725 enum { ret = meta_least_common_multiple<A,B,K+1>::ret };
726};
727template<int A, int B, int K, bool Done>
728struct meta_least_common_multiple<A,B,K,Done,false>
729{
730 enum { ret = meta_least_common_multiple<B,A,K>::ret };
731};
732template<int A, int B, int K>
733struct meta_least_common_multiple<A,B,K,true,true>
734{
735 enum { ret = A*K };
736};
737
738
740template<typename T, typename U> struct scalar_product_traits
741{
742 enum { Defined = 0 };
743};
744
745// FIXME quick workaround around current limitation of result_of
746// template<typename Scalar, typename ArgType0, typename ArgType1>
747// struct result_of<scalar_product_op<Scalar>(ArgType0,ArgType1)> {
748// typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type;
749// };
750
754template<unsigned Len, unsigned Align>
755struct aligned_storage {
756 struct type {
757 EIGEN_ALIGN_TO_BOUNDARY(Align) unsigned char data[Len];
758 };
759};
760
761} // end namespace internal
762
763namespace numext {
764
765#if defined(EIGEN_GPU_COMPILE_PHASE)
766template<typename T> EIGEN_DEVICE_FUNC void swap(T &a, T &b) { T tmp = b; b = a; a = tmp; }
767#else
768template<typename T> EIGEN_STRONG_INLINE void swap(T &a, T &b) { std::swap(a,b); }
769#endif
770
771#if defined(EIGEN_GPU_COMPILE_PHASE) && !EIGEN_HAS_CXX11
772using internal::device::numeric_limits;
773#else
774using std::numeric_limits;
775#endif
776
777// Integer division with rounding up.
778// T is assumed to be an integer type with a>=0, and b>0
779template<typename T>
780EIGEN_DEVICE_FUNC
781T div_ceil(const T &a, const T &b)
782{
783 return (a+b-1) / b;
784}
785
786// The aim of the following functions is to bypass -Wfloat-equal warnings
787// when we really want a strict equality comparison on floating points.
788template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
789bool equal_strict(const X& x,const Y& y) { return x == y; }
790
791#if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
792template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
793bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); }
794
795template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
796bool equal_strict(const double& x,const double& y) { return std::equal_to<double>()(x,y); }
797#endif
798
799template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
800bool not_equal_strict(const X& x,const Y& y) { return x != y; }
801
802#if !defined(EIGEN_GPU_COMPILE_PHASE) || (!defined(EIGEN_CUDA_ARCH) && defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC))
803template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
804bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); }
805
806template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
807bool not_equal_strict(const double& x,const double& y) { return std::not_equal_to<double>()(x,y); }
808#endif
809
810} // end namespace numext
811
812} // end namespace Eigen
813
814#endif // EIGEN_META_H
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
const int Dynamic
Definition Constants.h:22