[mlir][ods] Store the pointer to the anchor element (NFC)
[llvm-project.git] / libcxx / src / random_shuffle.cpp
blobe9087a97014f7586dad4c15db5bb20a853156631
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include <algorithm>
10 #include <random>
12 #ifndef _LIBCPP_HAS_NO_THREADS
13 # include <mutex>
14 # if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)
15 # pragma comment(lib, "pthread")
16 # endif
17 #endif
19 _LIBCPP_BEGIN_NAMESPACE_STD
21 #ifndef _LIBCPP_HAS_NO_THREADS
22 static constinit __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER;
23 #endif
24 unsigned __rs_default::__c_ = 0;
26 __rs_default::__rs_default()
28 #ifndef _LIBCPP_HAS_NO_THREADS
29 __libcpp_mutex_lock(&__rs_mut);
30 #endif
31 __c_ = 1;
34 __rs_default::__rs_default(const __rs_default&)
36 ++__c_;
39 __rs_default::~__rs_default()
41 #ifndef _LIBCPP_HAS_NO_THREADS
42 if (--__c_ == 0)
43 __libcpp_mutex_unlock(&__rs_mut);
44 #else
45 --__c_;
46 #endif
49 __rs_default::result_type
50 __rs_default::operator()()
52 static mt19937 __rs_g;
53 return __rs_g();
56 __rs_default
57 __rs_get()
59 return __rs_default();
62 _LIBCPP_END_NAMESPACE_STD