blob: be2c47fa0defbe764bd595ec3ef32904dcb66b13 [file] [log] [blame]
Louis Dionnec1f66cb2020-06-30 12:42:44 -04001//===----------------------- random_shuffle.cpp ---------------------------===//
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
23unsigned __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