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