xref: /freebsd/contrib/llvm-project/libcxx/src/random_shuffle.cpp (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
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 //===----------------------------------------------------------------------===//
8 
9 #include <algorithm>
10 #include <random>
11 
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
18 
19 _LIBCPP_BEGIN_NAMESPACE_STD
20 
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;
25 
26 __rs_default::__rs_default()
27 {
28 #ifndef _LIBCPP_HAS_NO_THREADS
29     __libcpp_mutex_lock(&__rs_mut);
30 #endif
31     __c_ = 1;
32 }
33 
34 __rs_default::__rs_default(const __rs_default&)
35 {
36     ++__c_;
37 }
38 
39 __rs_default::~__rs_default()
40 {
41 #ifndef _LIBCPP_HAS_NO_THREADS
42     if (--__c_ == 0)
43        __libcpp_mutex_unlock(&__rs_mut);
44 #else
45     --__c_;
46 #endif
47 }
48 
49 __rs_default::result_type
50 __rs_default::operator()()
51 {
52     static mt19937 __rs_g;
53     return __rs_g();
54 }
55 
56 __rs_default
57 __rs_get()
58 {
59     return __rs_default();
60 }
61 
62 _LIBCPP_END_NAMESPACE_STD
63