5 #define DEFINE_ASSERT_ONE_PARAM(name) \ 
   11                     "Assert "#name" failed"  \ 
   16         struct assert_##name<true> : std::true_type \ 
   20     inline constexpr bool assert_##name =       \ 
   21         details::assert_##name<name<T>>::value; \ 
   23 #define DEFINE_ASSERT_TWO_PARAM(name) \ 
   26         struct assert_##name                    \ 
   29                     "Assert "#name" failed"  \ 
   34         struct assert_##name<true> : std::true_type \ 
   37     template <class T, class U>                 \ 
   38     inline constexpr bool assert_##name =       \ 
   39         details::assert_##name<name<T, U>>::value; \ 
   42 #define PPL_CONT_XOR_DISC \ 
   43     "Expression must be either continuous or discrete. " \ 
   44     "It cannot be both continuous and discrete. " 
   52 template <
class From, 
class To>
 
   54     std::is_constructible_v<To, From> &&
 
   55     !std::is_convertible_v<From, To>
 
   66     T& 
self() { 
return static_cast<T&
>(*this); }
 
   67     const T& 
self() 
const { 
return static_cast<const T&
>(*this); }
 
   71 inline constexpr 
bool is_cont_v = std::is_floating_point_v<T>;
 
   74 inline constexpr 
bool is_disc_v = std::is_integral_v<T>;