11#ifndef EFI_UNIT_TEST_VERBOSE_ACTION
12#define EFI_UNIT_TEST_VERBOSE_ACTION 0
23template<
class To,
class From>
25 sizeof(To) ==
sizeof(From) &&
26 std::is_trivially_copyable_v<From> &&
27 std::is_trivially_copyable_v<To>,
32 static_assert(std::is_trivially_constructible_v<To>,
33 "This implementation additionally requires "
34 "destination type to be trivially constructible");
37 std::memcpy(&dst, &src,
sizeof(To));
49 static_assert(
alignof(T) >= 2,
"Type must be at least 2-aligned");
50 static_assert(
sizeof(
scheduler_arg_t) ==
sizeof(
void*),
"Unexpected scheduler_arg_t (i.e. m_raw) size, won't hold pointer");
56 template<
typename U = T>
68 [[nodiscard]]
constexpr bool getFlag()
const {
76 explicit constexpr operator bool()
const {
return m_raw != 0; }
119 static_assert(std::is_pointer_v<T> || std::is_integral_v<T>,
"Unsupported type");
120 if constexpr (std::is_pointer_v<T>) {
121 return reinterpret_cast<T
>(raw);
123 return static_cast<T
>(raw);
131 static_assert(std::is_pointer_v<T> || std::is_integral_v<T>,
"Unsupported type");
132 if constexpr (std::is_pointer_v<T>) {
141 template<auto Func,
typename Arg>
143 static_assert(std::is_pointer_v<Arg> || std::is_integral_v<Arg>,
"Unsupported type");
144 #if EFI_UNIT_TEST_VERBOSE_ACTION
145 std::cout <<
"action_s::trampoline: " << __PRETTY_FUNCTION__ <<
"(" <<
reinterpret_cast<scheduler_arg_t>(Func) <<
") "
146 "with raw arg = " << raw <<
"; is_ptr = " << std::is_pointer_v<Arg> << std::endl;
148 if constexpr (std::is_pointer_v<Arg>) {
149 Func(
reinterpret_cast<Arg
>(raw));
151 Func(
static_cast<Arg
>(raw));
158 #if EFI_UNIT_TEST_VERBOSE_ACTION
159 std::cout <<
"action_s::trampoline_no_arg: " << __PRETTY_FUNCTION__ <<
"(" <<
reinterpret_cast<scheduler_arg_t>(Func) <<
") with no arg" << std::endl;
174 other.m_callback =
nullptr;
177 other.fn_name =
"Moved";
185 other.m_callback =
nullptr;
189 other.fn_name =
"Moved";
195 template<auto Func,
typename Arg>
196 static constexpr action_s make(Arg arg)
noexcept(std::is_nothrow_constructible_v<action_s, schfunc_t, scheduler_arg_t>) {
197 static_assert(std::is_invocable_r_v<void,
decltype(Func), Arg>,
"Function signature mismatch");
198 #if EFI_UNIT_TEST_VERBOSE_ACTION
199 std::cout <<
"action_s::make: " << __PRETTY_FUNCTION__ <<
"(" <<
reinterpret_cast<scheduler_arg_t>(Func) <<
") "
200 "with raw arg = " << arg <<
"; is_ptr = " << std::is_pointer_v<Arg> << std::endl;
202 if constexpr (std::is_pointer_v<Arg>) {
209 static_assert(
alignof(std::remove_pointer_t<Arg>) >= 2,
"Pointer must be at least 2-aligned");
210 static_assert(
sizeof(
scheduler_arg_t) ==
sizeof(
void*),
"Unexpected scheduler_arg_t size");
222 static_assert(std::is_invocable_r_v<void,
decltype(Func)>,
"Function signature mismatch");
224 return action_s(&trampoline_no_arg<Func>, __PRETTY_FUNCTION__);
226 return action_s(&trampoline_no_arg<Func>);
232 #if EFI_UNIT_TEST_VERBOSE_ACTION
234 "with raw arg = " <<
m_param << std::endl;
238 #ifdef WE_HAVE_CRITICAL_ERROR_METHOD
276 #define NT2US(x) ((x) / US_TO_NT_MULTIPLIER)
static constexpr action_s make(Arg arg) noexcept(std::is_nothrow_constructible_v< action_s, schfunc_t, scheduler_arg_t >)
constexpr action_s(const schfunc_t callback, char const *const fn_name_) noexcept
static constexpr scheduler_arg_t to_scheduler_arg_t(T val) noexcept
action_s & operator=(action_s const &) noexcept=default
constexpr action_s(const schfunc_t callback) noexcept
constexpr T getArgument() const
static constexpr T from_scheduler_arg_t(scheduler_arg_t raw) noexcept
action_s() noexcept=default
constexpr char const * getCallbackName() const
constexpr action_s(const schfunc_t callback, const scheduler_arg_t param, char const *const fn_name_) noexcept
constexpr action_s(const schfunc_t callback, const scheduler_arg_t param) noexcept
static constexpr void trampoline(scheduler_arg_t raw) noexcept
static constexpr void trampoline_no_arg(scheduler_arg_t) noexcept
constexpr schfunc_t getCallback() const
static constexpr action_s make() noexcept(std::is_nothrow_constructible_v< action_s, schfunc_t >)
constexpr scheduler_arg_t const & getArgumentRaw() const
void(*)(scheduler_arg_t) schfunc_t
action_s & operator=(action_s &&other) noexcept
bool constexpr operator==(const action_s &other) const
void efiCriticalError(const char *message)
Scheduler * getScheduler()
uintptr_t scheduler_arg_t
std::enable_if_t< sizeof(To)==sizeof(From) &&std::is_trivially_copyable_v< From > &&std::is_trivially_copyable_v< To >, To > bit_cast(const From &src) noexcept
virtual void cancel(scheduling_s *scheduling)=0
Cancel the specified scheduling_s so that, if currently scheduled, it does not execute.
virtual void schedule(const char *msg, scheduling_s *scheduling, efitick_t targetTime, action_s const &action)=0
Schedule an action to be executed in the future.
constexpr T * getOriginalPointer() const
TaggedPointer(scheduler_arg_t const raw) noexcept
TaggedPointer & operator=(TaggedPointer const &) noexcept=default
static constexpr TaggedPointer fromRaw(scheduler_arg_t raw)
constexpr scheduler_arg_t getRaw() const
TaggedPointer & operator=(TaggedPointer &&other) noexcept
constexpr bool getFlag() const
TaggedPointer() noexcept=default
static constexpr TaggedPointer make(U ptr, const bool flag)
efitick_t getMomentUs() const
scheduling_s * nextScheduling_s
efitick_t getMomentNt() const
volatile efitick_t momentNt
void setMomentNt(efitick_t p_moment)
static tstrWifiInitParam param