xref: /netbsd-src/external/apache2/llvm/dist/libcxx/src/random_shuffle.cpp (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
1*4d6fc14bSjoerg //===----------------------- random_shuffle.cpp ---------------------------===//
2*4d6fc14bSjoerg //
3*4d6fc14bSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*4d6fc14bSjoerg // See https://llvm.org/LICENSE.txt for license information.
5*4d6fc14bSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*4d6fc14bSjoerg //
7*4d6fc14bSjoerg //===----------------------------------------------------------------------===//
8*4d6fc14bSjoerg 
9*4d6fc14bSjoerg #include "algorithm"
10*4d6fc14bSjoerg #include "random"
11*4d6fc14bSjoerg #ifndef _LIBCPP_HAS_NO_THREADS
12*4d6fc14bSjoerg #   include "mutex"
13*4d6fc14bSjoerg #   if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)
14*4d6fc14bSjoerg #       pragma comment(lib, "pthread")
15*4d6fc14bSjoerg #   endif
16*4d6fc14bSjoerg #endif
17*4d6fc14bSjoerg 
18*4d6fc14bSjoerg _LIBCPP_BEGIN_NAMESPACE_STD
19*4d6fc14bSjoerg 
20*4d6fc14bSjoerg #ifndef _LIBCPP_HAS_NO_THREADS
21*4d6fc14bSjoerg _LIBCPP_SAFE_STATIC static __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER;
22*4d6fc14bSjoerg #endif
23*4d6fc14bSjoerg unsigned __rs_default::__c_ = 0;
24*4d6fc14bSjoerg 
__rs_default()25*4d6fc14bSjoerg __rs_default::__rs_default()
26*4d6fc14bSjoerg {
27*4d6fc14bSjoerg #ifndef _LIBCPP_HAS_NO_THREADS
28*4d6fc14bSjoerg     __libcpp_mutex_lock(&__rs_mut);
29*4d6fc14bSjoerg #endif
30*4d6fc14bSjoerg     __c_ = 1;
31*4d6fc14bSjoerg }
32*4d6fc14bSjoerg 
__rs_default(const __rs_default &)33*4d6fc14bSjoerg __rs_default::__rs_default(const __rs_default&)
34*4d6fc14bSjoerg {
35*4d6fc14bSjoerg     ++__c_;
36*4d6fc14bSjoerg }
37*4d6fc14bSjoerg 
~__rs_default()38*4d6fc14bSjoerg __rs_default::~__rs_default()
39*4d6fc14bSjoerg {
40*4d6fc14bSjoerg #ifndef _LIBCPP_HAS_NO_THREADS
41*4d6fc14bSjoerg     if (--__c_ == 0)
42*4d6fc14bSjoerg        __libcpp_mutex_unlock(&__rs_mut);
43*4d6fc14bSjoerg #else
44*4d6fc14bSjoerg     --__c_;
45*4d6fc14bSjoerg #endif
46*4d6fc14bSjoerg }
47*4d6fc14bSjoerg 
48*4d6fc14bSjoerg __rs_default::result_type
operator ()()49*4d6fc14bSjoerg __rs_default::operator()()
50*4d6fc14bSjoerg {
51*4d6fc14bSjoerg     static mt19937 __rs_g;
52*4d6fc14bSjoerg     return __rs_g();
53*4d6fc14bSjoerg }
54*4d6fc14bSjoerg 
55*4d6fc14bSjoerg __rs_default
__rs_get()56*4d6fc14bSjoerg __rs_get()
57*4d6fc14bSjoerg {
58*4d6fc14bSjoerg     return __rs_default();
59*4d6fc14bSjoerg }
60*4d6fc14bSjoerg 
61*4d6fc14bSjoerg _LIBCPP_END_NAMESPACE_STD
62