Core/Scripts: Remove Optional<> wrapper from all Scripting::v2::ActionResultSetter uses

This commit is contained in:
Shauren
2026-01-09 00:37:42 +01:00
parent 05406d034e
commit 00542ca800
29 changed files with 106 additions and 90 deletions

View File

@@ -24,32 +24,46 @@ namespace Scripting::v2
{
class ActionBase;
template <typename T>
struct ActionResultValueHolder
{
ActionBase& Action;
T Result = { };
};
void MarkActionCompleted(ActionBase& action);
template <typename T>
class ActionResultSetter
{
public:
explicit ActionResultSetter(std::shared_ptr<ActionBase> action, T* result) : _action(std::move(action)), _result(result) { }
ActionResultSetter() = default;
explicit ActionResultSetter(std::shared_ptr<ActionResultValueHolder<T>>&& action) : _action(std::move(action)) { }
void SetResult(T result)
{
if (std::shared_ptr<ActionBase> ptr = _action.lock())
if (std::shared_ptr<ActionResultValueHolder<T>> ptr = _action.lock())
{
*_result = std::move(result);
MarkActionCompleted(*ptr);
ptr->Result = result;
MarkActionCompleted(ptr->Action);
}
}
explicit operator bool() const { return !_action.expired(); }
void Reset() { _action.reset(); }
private:
std::weak_ptr<ActionBase> _action;
T* _result;
std::weak_ptr<ActionResultValueHolder<T>> _action;
};
template <>
class ActionResultSetter<void>
{
public:
ActionResultSetter() = default;
explicit ActionResultSetter(std::shared_ptr<ActionBase> action) : _action(std::move(action)) { }
void SetResult()
@@ -58,6 +72,10 @@ public:
MarkActionCompleted(*ptr);
}
explicit operator bool() const { return !_action.expired(); }
void Reset() { _action.reset(); }
private:
std::weak_ptr<ActionBase> _action;
};

View File

@@ -65,12 +65,11 @@ class ActionResult : public ActionBase
public:
[[nodiscard]] static ActionResultSetter<T> GetResultSetter(std::shared_ptr<ActionResult> action)
{
T* resultPtr = &action->_result;
return ActionResultSetter<T>(std::move(action), resultPtr);
return ActionResultSetter<T>(std::shared_ptr<ActionResultValueHolder<T>>(std::move(action), &action->_result));
}
private:
T _result = { };
ActionResultValueHolder<T> _result = { .Action = *this };
};
template<>