xref: /freebsd/contrib/llvm-project/libcxx/src/random_shuffle.cpp (revision 18054d0220cfc8df9c9568c437bd6fbb59d53c3c)
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 #ifndef _LIBCPP_HAS_NO_THREADS
12 #   include "mutex"
13 #   if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)
14 #       pragma comment(lib, "pthread")
15 #   endif
16 #endif
17 
18 _LIBCPP_BEGIN_NAMESPACE_STD
19 
20 #ifndef _LIBCPP_HAS_NO_THREADS
21 _LIBCPP_SAFE_STATIC static __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER;
22 #endif
23 unsigned __rs_default::__c_ = 0;
24 
25 __rs_default::__rs_default()
26 {
27 #ifndef _LIBCPP_HAS_NO_THREADS
28     __libcpp_mutex_lock(&__rs_mut);
29 #endif
30     __c_ = 1;
31 }
32 
33 __rs_default::__rs_default(const __rs_default&)
34 {
35     ++__c_;
36 }
37 
38 __rs_default::~__rs_default()
39 {
40 #ifndef _LIBCPP_HAS_NO_THREADS
41     if (--__c_ == 0)
42        __libcpp_mutex_unlock(&__rs_mut);
43 #else
44     --__c_;
45 #endif
46 }
47 
48 __rs_default::result_type
49 __rs_default::operator()()
50 {
51     static mt19937 __rs_g;
52     return __rs_g();
53 }
54 
55 __rs_default
56 __rs_get()
57 {
58     return __rs_default();
59 }
60 
61 _LIBCPP_END_NAMESPACE_STD
62