diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/LuaTask.h | 61 | ||||
-rw-r--r-- | includes/c++11-surrogates.h | 21 |
2 files changed, 82 insertions, 0 deletions
diff --git a/includes/LuaTask.h b/includes/LuaTask.h new file mode 100644 index 0000000..6dff44e --- /dev/null +++ b/includes/LuaTask.h @@ -0,0 +1,61 @@ +#pragma once + +#include <c++11-surrogates.h> +#include <BLua.h> +#include <Task.h> + +namespace Balau { + +class LuaTask; +class LuaMainTask; + +class LuaExecCell { + public: + LuaExecCell() : m_detached(false) { } + void detach() { m_detached = true; } + void exec(LuaMainTask * mainTask); + protected: + virtual void run(Lua &) = 0; + private: + Events::Async m_event; + bool m_detached; + friend class LuaTask; +}; + +class LuaExecString : public LuaExecCell { + public: + LuaExecString(const String & str) : m_str(str) { } + private: + virtual void run(Lua &); + String m_str; +}; + +class LuaTask : public Task { + public: + ~LuaTask() { L.weaken(); } + virtual const char * getName() const { return "LuaTask"; } + private: + LuaTask(Lua && __L, LuaExecCell * cell) : L(Move(__L)), m_cell(cell) { } + virtual void Do(); + Lua L; + LuaExecCell * m_cell; + friend class LuaMainTask; +}; + +class LuaMainTask : public Task { + public: + LuaMainTask() : m_stopping(false) { } + ~LuaMainTask() { L.close(); } + void stop(); + virtual const char * getName() const { return "LuaMainTask"; } + private: + void exec(LuaExecCell * cell); + virtual void Do(); + Lua L; + Events::Async m_queueEvent; + Queue<LuaExecCell> m_queue; + bool m_stopping; + friend class LuaExecCell; +}; + +}; diff --git a/includes/c++11-surrogates.h b/includes/c++11-surrogates.h new file mode 100644 index 0000000..4f3a1a0 --- /dev/null +++ b/includes/c++11-surrogates.h @@ -0,0 +1,21 @@ +#pragma once + +namespace Balau { + +template <typename T> struct RemoveReference { + typedef T type; +}; + +template <typename T> struct RemoveReference<T&> { + typedef T type; +}; + +template <typename T> struct RemoveReference<T&&> { + typedef T type; +}; + +template <typename T> typename RemoveReference<T>::type&& Move(T&& t) { + return static_cast<typename RemoveReference<T>::type&&>(t); +} + +}; |