Lodestar
An integrated real-time control package in C++
CompileTimeQualifiers.hpp
1 //
2 // Created by Hamza El-Kebir on 5/17/21.
3 //
4 
5 #ifndef LODESTAR_COMPILETIMEQUALIFIERS_HPP
6 #define LODESTAR_COMPILETIMEQUALIFIERS_HPP
7 
8 #include <type_traits>
9 
10 #define LS_IS_DYNAMIC_DEFAULT(TSTATE, TINPUT, TOUTPUT) typename std::enable_if<((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0))>::type* = nullptr
11 
12 #define LS_ENABLE_IF_DYNAMIC_DEFAULT(TSTATE, TINPUT, TOUTPUT) template <typename std::enable_if<((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0)), int>::type = 0>
13 
14 #define LS_ENABLE_IF_DYNAMIC(TSTATE, TINPUT, TOUTPUT) template <typename std::enable_if<((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0)), int>::type>
15 
16 #define IF_DYNAMIC_RETURN(TSTATE, TINPUT, TOUTPUT, RETTYPE) template <int T_##TSTATE = TSTATE, int T_##TINPUT = TINPUT, int T_##TOUTPUT = TOUTPUT> typename std::enable_if<((T_##TSTATE < 0) || (T_##TINPUT < 0) || (T_##TOUTPUT < 0)), RETTYPE>::type
17 
18 #define IF_STATIC_RETURN(TSTATE, TINPUT, TOUTPUT, RETTYPE) template <int T_##TSTATE = TSTATE, int T_##TINPUT = TINPUT, int T_##TOUTPUT = TOUTPUT> typename std::enable_if<!((T_##TSTATE < 0) || (T_##TINPUT < 0) || (T_##TOUTPUT < 0)), RETTYPE>::type
19 
20 #define LS_IS_DYNAMIC(TSTATE, TINPUT, TOUTPUT) typename std::enable_if<((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0))>::type*
21 
22 #define LS_IS_STATIC_DEFAULT(TSTATE, TINPUT, TOUTPUT) typename std::enable_if<!((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0))>::type* = nullptr
23 
24 #define LS_IS_STATIC(TSTATE, TINPUT, TOUTPUT) typename std::enable_if<!((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0))>::type*
25 
26 #define LS_ENABLE_IF_STATIC_DEFAULT(TSTATE, TINPUT, TOUTPUT) template <typename std::enable_if<!((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0)), int>::type = 0>
27 
28 #define LS_ENABLE_IF_STATIC(TSTATE, TINPUT, TOUTPUT) template <typename std::enable_if<!((TSTATE < 0) || (TINPUT < 0) || (TOUTPUT < 0)), int>::type>
29 
30 //#define LS_IS_STATIC_DEFAULT(TSTATE, TINPUT, TOUTPUT) typename std::enable_if<((TSTATE >= 0) && (TINPUT >= 0) && (TOUTPUT >= 0))>::type* = nullptr
31 //
32 //#define LS_IS_STATIC(TSTATE, TINPUT, TOUTPUT) typename std::enable_if<((TSTATE >= 0) && (TINPUT >= 0) && (TOUTPUT >= 0))>::type*
33 
34 template<class T>
35 constexpr T &Kmin(T a, T b)
36 {
37  return (a > b ? b : a);
38 }
39 
40 template<class T>
41 constexpr T &Kmax(const T &a, const T &b)
42 {
43  return (int &) (a >= b ? a : b);
44 }
45 
46 template<class T>
47 constexpr T Kmax2(const T a, const T b, const T c)
48 {
49  return (a >= b ? a : c);
50 }
51 
52 template <typename TInt, typename TFloat>
53 constexpr TInt ceil(TFloat f)
54 {
55  return f > static_cast<TFloat>(f) ? static_cast<TFloat>(f) + 1 : static_cast<TFloat>(f);
56 }
57 
58 template <typename TInt, typename TFloat>
59 constexpr TInt floor(TFloat f)
60 {
61  return f < static_cast<TFloat>(f) ? static_cast<TFloat>(f) - 1 : static_cast<TFloat>(f);
62 }
63 
64 #define LS_STATIC_UNLESS_DYNAMIC(DIM) Kmax(-1, DIM)
65 
66 #define LS_STATIC_UNLESS_DYNAMIC_VAL(DIM, VAL) Kmax2(-1, DIM, VAL)
67 
68 #endif //LODESTAR_COMPILETIMEQUALIFIERS_HPP