some refactoring with optional_function

- wrapped std::function into utils::optional_function
-- cleaned the code accordingly in windows_emulator
- using the 'emulator'/'windows_emulator' dependency implies the emulator_common as well.
This commit is contained in:
Elias Bachaalany
2025-01-21 19:25:51 -08:00
parent eb613b2214
commit 5bf325c77f
7 changed files with 66 additions and 47 deletions

View File

@@ -0,0 +1,48 @@
#pragma once
#include <functional>
namespace utils
{
template <typename Signature>
class optional_function;
template <typename Ret, typename... Args>
class optional_function<Ret(Args...)>
{
private:
std::function<Ret(Args...)> func;
public:
optional_function() = default;
optional_function(std::function<Ret(Args...)> f)
: func(std::move(f))
{
}
optional_function& operator=(std::function<Ret(Args...)> f)
{
func = std::move(f);
return *this;
}
Ret operator()(Args... args) const
{
if (func)
{
return func(std::forward<Args>(args)...);
}
else
{
if constexpr (!std::is_void_v<Ret>)
{
return Ret();
}
}
}
explicit operator bool() const
{
return static_cast<bool>(func);
}
};
}