+template <typename Mutex>
+class once_flag {
+ public:
+ constexpr once_flag() noexcept = default;
+ once_flag(const once_flag&) = delete;
+ once_flag& operator=(const once_flag&) = delete;
+
+ template <typename Mutex_, typename Callable, class... Args>
+ friend void ::folly::call_once(
+ once_flag<Mutex_>& flag,
+ Callable&& f,
+ Args&&... args);
+ template <typename Mutex_, typename Callable, class... Args>
+ friend void call_once_impl_no_inline(
+ once_flag<Mutex_>& flag,
+ Callable&& f,
+ Args&&... args);
+
+ private:
+ std::atomic<bool> called_{false};
+ Mutex mutex_;
+};
+} // namespace detail