diff options
author | Andrey Khalyavin <[email protected]> | 2022-02-10 16:46:29 +0300 |
---|---|---|
committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:46:29 +0300 |
commit | f773626848a7c7456803654292e716b83d69cc12 (patch) | |
tree | db052dfcf9134f492bdbb962cb6c16cea58e1ed3 /contrib/libs/cxxsupp/libcxx/include/latch | |
parent | f43ab775d197d300eb67bd4497632b909cd7c2a5 (diff) |
Restoring authorship annotation for Andrey Khalyavin <[email protected]>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/cxxsupp/libcxx/include/latch')
-rw-r--r-- | contrib/libs/cxxsupp/libcxx/include/latch | 224 |
1 files changed, 112 insertions, 112 deletions
diff --git a/contrib/libs/cxxsupp/libcxx/include/latch b/contrib/libs/cxxsupp/libcxx/include/latch index 10ae5721fbe..42f4a7367b0 100644 --- a/contrib/libs/cxxsupp/libcxx/include/latch +++ b/contrib/libs/cxxsupp/libcxx/include/latch @@ -1,112 +1,112 @@ -// -*- C++ -*- -//===--------------------------- latch -----------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP_LATCH -#define _LIBCPP_LATCH - -/* - latch synopsis - -namespace std -{ - - class latch - { - public: - static constexpr ptrdiff_t max() noexcept; - - constexpr explicit latch(ptrdiff_t __expected); - ~latch(); - - latch(const latch&) = delete; - latch& operator=(const latch&) = delete; - - void count_down(ptrdiff_t __update = 1); - bool try_wait() const noexcept; - void wait() const; - void arrive_and_wait(ptrdiff_t __update = 1); - - private: - ptrdiff_t __counter; // exposition only - }; - -} - -*/ - -#include <__availability> -#include <__config> -#include <atomic> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -#pragma GCC system_header -#endif - -#ifdef _LIBCPP_HAS_NO_THREADS -# error <latch> is not supported on this single threaded system -#endif - -_LIBCPP_PUSH_MACROS -#include <__undef_macros> - -#if _LIBCPP_STD_VER >= 14 - -_LIBCPP_BEGIN_NAMESPACE_STD - -class latch -{ - __atomic_base<ptrdiff_t> __a; - -public: - static constexpr ptrdiff_t max() noexcept { - return numeric_limits<ptrdiff_t>::max(); - } - - inline _LIBCPP_INLINE_VISIBILITY - constexpr explicit latch(ptrdiff_t __expected) : __a(__expected) { } - - ~latch() = default; - latch(const latch&) = delete; - latch& operator=(const latch&) = delete; - - inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY - void count_down(ptrdiff_t __update = 1) - { - auto const __old = __a.fetch_sub(__update, memory_order_release); - if(__old == __update) - __a.notify_all(); - } - inline _LIBCPP_INLINE_VISIBILITY - bool try_wait() const noexcept - { - return 0 == __a.load(memory_order_acquire); - } - inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY - void wait() const - { - auto const __test_fn = [=]() -> bool { - return try_wait(); - }; - __cxx_atomic_wait(&__a.__a_, __test_fn); - } - inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY - void arrive_and_wait(ptrdiff_t __update = 1) - { - count_down(__update); - wait(); - } -}; - -_LIBCPP_END_NAMESPACE_STD - -#endif // _LIBCPP_STD_VER >= 14 - -_LIBCPP_POP_MACROS - -#endif //_LIBCPP_LATCH +// -*- C++ -*- +//===--------------------------- latch -----------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP_LATCH +#define _LIBCPP_LATCH + +/* + latch synopsis + +namespace std +{ + + class latch + { + public: + static constexpr ptrdiff_t max() noexcept; + + constexpr explicit latch(ptrdiff_t __expected); + ~latch(); + + latch(const latch&) = delete; + latch& operator=(const latch&) = delete; + + void count_down(ptrdiff_t __update = 1); + bool try_wait() const noexcept; + void wait() const; + void arrive_and_wait(ptrdiff_t __update = 1); + + private: + ptrdiff_t __counter; // exposition only + }; + +} + +*/ + +#include <__availability> +#include <__config> +#include <atomic> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +#ifdef _LIBCPP_HAS_NO_THREADS +# error <latch> is not supported on this single threaded system +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +#if _LIBCPP_STD_VER >= 14 + +_LIBCPP_BEGIN_NAMESPACE_STD + +class latch +{ + __atomic_base<ptrdiff_t> __a; + +public: + static constexpr ptrdiff_t max() noexcept { + return numeric_limits<ptrdiff_t>::max(); + } + + inline _LIBCPP_INLINE_VISIBILITY + constexpr explicit latch(ptrdiff_t __expected) : __a(__expected) { } + + ~latch() = default; + latch(const latch&) = delete; + latch& operator=(const latch&) = delete; + + inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY + void count_down(ptrdiff_t __update = 1) + { + auto const __old = __a.fetch_sub(__update, memory_order_release); + if(__old == __update) + __a.notify_all(); + } + inline _LIBCPP_INLINE_VISIBILITY + bool try_wait() const noexcept + { + return 0 == __a.load(memory_order_acquire); + } + inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY + void wait() const + { + auto const __test_fn = [=]() -> bool { + return try_wait(); + }; + __cxx_atomic_wait(&__a.__a_, __test_fn); + } + inline _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY + void arrive_and_wait(ptrdiff_t __update = 1) + { + count_down(__update); + wait(); + } +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP_STD_VER >= 14 + +_LIBCPP_POP_MACROS + +#endif //_LIBCPP_LATCH |