mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Scripts: Remove Optional<> wrapper from all Scripting::v2::ActionResultSetter uses
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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<>
|
||||
|
||||
Reference in New Issue
Block a user