libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
once.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <mutex>
14#include <utility>
15#include <promeki/namespace.h>
16
17PROMEKI_NAMESPACE_BEGIN
18
57class OnceFlag {
58 public:
60 OnceFlag() = default;
61
63 ~OnceFlag() = default;
64
65 OnceFlag(const OnceFlag &) = delete;
66 OnceFlag &operator=(const OnceFlag &) = delete;
67 OnceFlag(OnceFlag &&) = delete;
68 OnceFlag &operator=(OnceFlag &&) = delete;
69
70 private:
71 template <typename Callable, typename... Args> friend void callOnce(OnceFlag &, Callable &&, Args &&...);
72
73 std::once_flag _flag;
74};
75
95template <typename Callable, typename... Args> void callOnce(OnceFlag &flag, Callable &&callable, Args &&...args) {
96 std::call_once(flag._flag, std::forward<Callable>(callable), std::forward<Args>(args)...);
97}
98
99PROMEKI_NAMESPACE_END
100
101#endif // PROMEKI_ENABLE_CORE