Go to the documentation of this file.
5 #ifndef UAVCAN_UTIL_TEMPLATES_HPP_INCLUDED
6 #define UAVCAN_UTIL_TEMPLATES_HPP_INCLUDED
13 #ifndef UAVCAN_CPP_VERSION
14 # error UAVCAN_CPP_VERSION
16 #if UAVCAN_CPP_VERSION < UAVCAN_CPP11
58 template <
bool B,
typename T =
void>
70 template <
typename T,
typename R =
void>
79 template <
bool Condition,
typename TrueType,
typename FalseType>
82 template <
typename TrueType,
typename FalseType>
88 template <
typename TrueType,
typename FalseType>
97 template<
class T,
class U>
103 template <
typename T>
114 #if UAVCAN_CPP_VERSION > UAVCAN_CPP03
123 #if UAVCAN_CPP_VERSION > UAVCAN_CPP03
124 template <
typename U>
struct ParameterType<U&&> {
typedef U&& Type; };
139 template <
typename T1,
typename T2>
142 template <
typename U>
static U returner();
159 template <
typename From,
typename To>
162 static To
impl(
const From& from,
const To&,
TrueType) {
return To(from); }
163 static To
impl(
const From&,
const To& default_,
FalseType) {
return default_; }
170 template <
typename To,
typename From>
182 template <
typename To,
typename From>
196 template <
long A,
long B>
205 template <
unsigned long A,
unsigned long B>
236 template <
typename InputIt,
typename OutputIt>
238 OutputIt
copy(InputIt first, InputIt last, OutputIt result)
240 while (first != last)
252 template <
typename ForwardIt,
typename T>
254 void fill(ForwardIt first, ForwardIt last,
const T& value)
256 while (first != last)
266 template<
typename OutputIt,
typename T>
279 template <
typename T>
281 const T&
min(
const T& a,
const T& b)
283 return (b < a) ? b : a;
289 template <
typename T>
291 const T&
max(
const T& a,
const T& b)
293 return (a < b) ? b : a;
299 template<
typename InputIt1,
typename InputIt2>
303 while ((first1 != last1) && (first2 != last2))
305 if (*first1 < *first2)
309 if (*first2 < *first1)
316 return (first1 == last1) && (first2 != last2);
322 template<
typename InputIt1,
typename InputIt2>
324 bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
326 while (first1 != last1)
328 if (*first1 != *first2)
341 template <
typename T>
348 enum { IsSigned = 0 };
349 enum { IsInteger = 1 };
350 static bool max() {
return true; }
351 static bool min() {
return false; }
358 enum { IsSigned = 1 };
359 enum { IsInteger = 1 };
360 static char max() {
return CHAR_MAX; }
361 static char min() {
return CHAR_MIN; }
366 enum { IsSigned = 1 };
367 enum { IsInteger = 1 };
368 static signed char max() {
return SCHAR_MAX; }
369 static signed char min() {
return SCHAR_MIN; }
374 enum { IsSigned = 0 };
375 enum { IsInteger = 1 };
376 static unsigned char max() {
return UCHAR_MAX; }
377 static unsigned char min() {
return 0; }
384 enum { IsSigned = 1 };
385 enum { IsInteger = 1 };
386 static short max() {
return SHRT_MAX; }
387 static short min() {
return SHRT_MIN; }
392 enum { IsSigned = 0 };
393 enum { IsInteger = 1 };
394 static unsigned short max() {
return USHRT_MAX; }
395 static unsigned short min() {
return 0; }
402 enum { IsSigned = 1 };
403 enum { IsInteger = 1 };
404 static int max() {
return INT_MAX; }
405 static int min() {
return INT_MIN; }
410 enum { IsSigned = 0 };
411 enum { IsInteger = 1 };
412 static unsigned int max() {
return UINT_MAX; }
413 static unsigned int min() {
return 0; }
420 enum { IsSigned = 1 };
421 enum { IsInteger = 1 };
422 static long max() {
return LONG_MAX; }
423 static long min() {
return LONG_MIN; }
428 enum { IsSigned = 0 };
429 enum { IsInteger = 1 };
430 static unsigned long max() {
return ULONG_MAX; }
431 static unsigned long min() {
return 0; }
438 enum { IsSigned = 1 };
439 enum { IsInteger = 1 };
440 static long long max() {
return LLONG_MAX; }
441 static long long min() {
return LLONG_MIN; }
446 enum { IsSigned = 0 };
447 enum { IsInteger = 1 };
448 static unsigned long long max() {
return ULLONG_MAX; }
449 static unsigned long long min() {
return 0; }
456 enum { IsSigned = 1 };
457 enum { IsInteger = 0 };
458 static float max() {
return FLT_MAX; }
459 static float min() {
return FLT_MIN; }
461 static float epsilon() {
return FLT_EPSILON; }
468 enum { IsSigned = 1 };
469 enum { IsInteger = 0 };
470 static double max() {
return DBL_MAX; }
471 static double min() {
return DBL_MIN; }
472 static double infinity() {
return static_cast<double>(INFINITY) *
static_cast<double>(INFINITY); }
473 static double epsilon() {
return DBL_EPSILON; }
476 #if defined(LDBL_MAX) && defined(LDBL_MIN) && defined(LDBL_EPSILON)
481 enum { IsSigned = 1 };
482 enum { IsInteger = 0 };
483 static long double max() {
return LDBL_MAX; }
484 static long double min() {
return LDBL_MIN; }
485 static long double infinity() {
return static_cast<long double>(INFINITY) *
static_cast<long double>(INFINITY); }
486 static long double epsilon() {
return LDBL_EPSILON; }
490 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
500 template <
typename T>
503 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
504 return std::isnan(arg);
508 return !(arg <= arg);
516 template <
typename T>
519 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
520 return std::isinf(arg);
522 return (arg >= NumericTraits<T>::infinity()) || (arg <= -NumericTraits<T>::infinity());
530 template <
typename T>
533 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
534 return std::isfinite(arg);
544 template <
typename T>
547 #if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
548 return std::signbit(arg);
551 return arg < T(0) || (((arg <= T(0)) && (arg >= T(0))) && (T(1) / arg < T(0)));
557 #endif // UAVCAN_UTIL_TEMPLATES_HPP_INCLUDED
static unsigned int min()
static unsigned long min()
static To impl(const From &, const To &default_, FalseType)
static unsigned long long max()
struct UAVCAN_EXPORT StaticAssert
UAVCAN_EXPORT void fill_n(OutputIt first, std::size_t n, const T &value)
BooleanType< true > TrueType
static unsigned short max()
static unsigned long long min()
struct UAVCAN_EXPORT NumericTraits
const UAVCAN_EXPORT T & max(const T &a, const T &b)
static unsigned long max()
UAVCAN_EXPORT bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
struct UAVCAN_EXPORT Select
const UAVCAN_EXPORT T & min(const T &a, const T &b)
struct UAVCAN_EXPORT CompileTimeIntSqrt
static unsigned int max()
static To impl(const From &from, const To &, TrueType)
UAVCAN_EXPORT bool lexicographical_compare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
UAVCAN_EXPORT To coerceOrFallback(const From &from, const To &default_)
static unsigned short min()
static unsigned char max()
UAVCAN_EXPORT void fill(ForwardIt first, ForwardIt last, const T &value)
UAVCAN_EXPORT OutputIt copy(InputIt first, InputIt last, OutputIt result)
BooleanType< false > FalseType
static unsigned char min()