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