From 40335c667870e72deb739b81ffbf8d23902ebe71 Mon Sep 17 00:00:00 2001 From: johannst Date: Mon, 5 Oct 2020 17:57:26 +0200 Subject: add support for function objects --- lib/thread.cc | 6 ++++++ lib/thread.h | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) (limited to 'lib') diff --git a/lib/thread.cc b/lib/thread.cc index 31161ab..e6777c0 100644 --- a/lib/thread.cc +++ b/lib/thread.cc @@ -56,4 +56,10 @@ namespace nMatcha { assert(mExecutor); ::yield(mExecutor->getStackPtr(), &mStackPtr); } + + std::unique_ptr FnThread::make(UserFn f) { return std::make_unique(CreatorToken{}, f); } + + void FnThread::threadFn() { mUserFn(*this); } + + void FnThread::yield() { Thread::yield(); } } // namespace nMatcha diff --git a/lib/thread.h b/lib/thread.h index d983734..3304892 100644 --- a/lib/thread.h +++ b/lib/thread.h @@ -2,6 +2,9 @@ #pragma once +#include +#include + namespace nMatcha { struct Executor; @@ -26,4 +29,24 @@ namespace nMatcha { friend struct Executor; const Executor* mExecutor; }; + + struct Yielder { + virtual void yield() = 0; + }; + + struct FnThread : public Thread, public Yielder { + using UserFn = std::function; + static std::unique_ptr make(UserFn f); + + private: + virtual void threadFn() override; + virtual void yield() override; + + UserFn mUserFn; + + enum class CreatorToken {}; + + public: + FnThread(CreatorToken, UserFn f) : mUserFn(f) {} + }; } // namespace nMatcha -- cgit v1.2.3