#ifndef HEADER_THREAD_H #define HEADER_THREAD_H #include "Base.h" #ifdef CRU_WINDOWS #include #else #include #endif #ifdef __cplusplus #include #include #include #include #include #include #include namespace cru { class CRU_API Thread { public: Thread() = default; template Thread(Fn &&process, Args &&...args); Thread(const Thread &other) = delete; Thread(Thread &&other) noexcept; Thread &operator=(const Thread &other) = delete; Thread &operator=(Thread &&other) noexcept; ~Thread(); public: void Join(); void Detach(); #ifdef CRU_WINDOWS DWORD #else pthread_t #endif GetNativeID(); #ifdef CRU_WINDOWS HANDLE #else pthread_t #endif GetNativeHandle(); void swap(Thread &other) noexcept; private: void Destroy() noexcept; void CreateThread(std::function *proc); private: bool detached_ = false; bool joined_ = false; #ifdef CRU_WINDOWS DWORD thread_id_ = 0; HANDLE thread_handle_ = nullptr; #else std::unique_ptr thread_; #endif }; template Thread::Thread(Fn &&process, Args &&...args) { std::tuple...> a{std::forward(args)...}; auto p = new std::function( [process = std::forward(process), args = std::move(a)]() { std::apply(process, std::move(args)); }); CreateThread(p); }; } // namespace cru #endif #endif