mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-08 17:48:46 -10:00
This is necessary after all to properly clean up resources if an operation becomes invalid. Also bumps Visual Studio version to 2017 on Appveyor.
78 lines
1.7 KiB
C++
78 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include "LuaConvert.h"
|
|
#include "LuaTypes.h"
|
|
#include "LuaValue.h"
|
|
#include "LuaFunction.h"
|
|
|
|
#include <iterator>
|
|
|
|
namespace luacpp {
|
|
|
|
/**
|
|
* @brief Class to improve handling of lua threads (aka coroutines).
|
|
*
|
|
* This class provides a high-level interface to lua threads.
|
|
*
|
|
* @see LuaConvert
|
|
*/
|
|
class LuaThread : public LuaValue {
|
|
public:
|
|
using ErrorCallback = std::function<bool(lua_State* mainState, lua_State* thread)>;
|
|
struct ResumeState
|
|
{
|
|
bool completed = false;
|
|
LuaValueList returnVals;
|
|
};
|
|
|
|
/**
|
|
* @brief Creates a new empty thread.
|
|
*/
|
|
static LuaThread create(lua_State* L, const LuaFunction& func);
|
|
|
|
/**
|
|
* @brief Default constructor
|
|
*/
|
|
LuaThread();
|
|
|
|
/**
|
|
* @brief Copy-constructor
|
|
* @param other The other thread.
|
|
*/
|
|
LuaThread(const LuaThread&);
|
|
LuaThread& operator=(const LuaThread&);
|
|
|
|
// These should be noexcept but Visual Studio doesn't like that yet in a recent enough version
|
|
LuaThread(LuaThread&&); // NOLINT(performance-noexcept-move-constructor)
|
|
LuaThread& operator=(LuaThread&&); // NOLINT(performance-noexcept-move-constructor)
|
|
|
|
~LuaThread() override;
|
|
|
|
/**
|
|
* @brief Sets a new reference.
|
|
* This overload checks if the passed reference is a thread
|
|
*
|
|
* @param ref The new reference
|
|
* @return void
|
|
*/
|
|
void setReference(const LuaReference& ref) override;
|
|
|
|
void setErrorCallback(ErrorCallback errorCallback);
|
|
|
|
ResumeState resume(const LuaValueList& params) const;
|
|
|
|
lua_State* getThreadHandle() const;
|
|
private:
|
|
LuaThread(lua_State* luaState, lua_State* threadHandle);
|
|
|
|
lua_State* _thread = nullptr;
|
|
ErrorCallback _errorCallback;
|
|
};
|
|
|
|
namespace convert {
|
|
|
|
bool popValue(lua_State* luaState, LuaThread& target, int stackposition = -1, bool remove = true);
|
|
|
|
}
|
|
} // namespace luacpp
|