Cogs.Core
Threads.h
1#pragma once
2
3#include "../FoundationBase.h"
4
5#include <future>
6#include <mutex>
7#include <thread>
8
9namespace Cogs {
10#if defined(COGS_SINGLETHREADED)
12
13 struct Mutex {
14 constexpr void lock() noexcept {}
15 constexpr void unlock() noexcept {}
16 };
17
20 struct [[nodiscard]] LockGuard {
21 constexpr LockGuard(Mutex& m) noexcept : mutex(m) { mutex.lock(); }
22 constexpr ~LockGuard() noexcept { mutex.unlock(); }
23
24 private:
25 Mutex& mutex;
26 };
27
29 struct [[nodiscard]] UniqueLock {
30 constexpr UniqueLock(Mutex& m) noexcept : mutex(m) { mutex.lock(); }
31 constexpr ~UniqueLock() noexcept { mutex.unlock(); }
32 constexpr UniqueLock(Mutex& m, std::defer_lock_t /*t*/) noexcept
33 : mutex(m)
34 {
35 }
36
38 constexpr void lock() { mutex.lock(); }
39
41 constexpr void unlock() { mutex.unlock(); }
42
43 private:
44 Mutex& mutex;
45 };
46
47 struct Thread {
48 };
49
50 template<typename T> struct Future {
51 T get() { return T(); }
52 bool valid() { return true; }
53 };
54
55 template<> struct Future<void> {
56 void get() {}
57 bool valid() { return true; }
58 };
59
60#else
61 typedef std::thread Thread;
62 typedef std::mutex Mutex;
63 typedef std::lock_guard<Mutex> LockGuard;
64 typedef std::unique_lock<Mutex> UniqueLock;
65
66 template<typename T> using Future = std::future<T>;
67#endif
68
69 namespace Threads {
70 COGSFOUNDATION_API void setName(Thread& thread, const std::string& name);
71 COGSFOUNDATION_API void sleep(int milliseconds);
72 COGSFOUNDATION_API void yield();
73 COGSFOUNDATION_API size_t hardwareConcurrency();
74 }
75}
Contains all Cogs related functionality.
Definition: FieldSetter.h:23