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>;