14824e7fdSDimitry Andric //===----------------------------------------------------------------------===// 24824e7fdSDimitry Andric // 34824e7fdSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 44824e7fdSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 54824e7fdSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64824e7fdSDimitry Andric // 74824e7fdSDimitry Andric //===----------------------------------------------------------------------===// 84824e7fdSDimitry Andric 94824e7fdSDimitry Andric #ifndef _LIBCPP___RANDOM_RANDOM_DEVICE_H 104824e7fdSDimitry Andric #define _LIBCPP___RANDOM_RANDOM_DEVICE_H 114824e7fdSDimitry Andric 124824e7fdSDimitry Andric #include <__config> 134824e7fdSDimitry Andric #include <string> 144824e7fdSDimitry Andric 154824e7fdSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 164824e7fdSDimitry Andric # pragma GCC system_header 174824e7fdSDimitry Andric #endif 184824e7fdSDimitry Andric 194824e7fdSDimitry Andric _LIBCPP_PUSH_MACROS 204824e7fdSDimitry Andric #include <__undef_macros> 214824e7fdSDimitry Andric 224824e7fdSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 234824e7fdSDimitry Andric 244824e7fdSDimitry Andric #if !defined(_LIBCPP_HAS_NO_RANDOM_DEVICE) 254824e7fdSDimitry Andric 26*cb14a3feSDimitry Andric class _LIBCPP_EXPORTED_FROM_ABI random_device { 274824e7fdSDimitry Andric # ifdef _LIBCPP_USING_DEV_RANDOM 284824e7fdSDimitry Andric int __f_; 2904eeddc0SDimitry Andric # elif !defined(_LIBCPP_ABI_NO_RANDOM_DEVICE_COMPATIBILITY_LAYOUT) 3081ad6265SDimitry Andric _LIBCPP_DIAGNOSTIC_PUSH 3181ad6265SDimitry Andric _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wunused-private-field") 3204eeddc0SDimitry Andric 3304eeddc0SDimitry Andric // Apple platforms used to use the `_LIBCPP_USING_DEV_RANDOM` code path, and now 3404eeddc0SDimitry Andric // use `arc4random()` as of this comment. In order to avoid breaking the ABI, we 3504eeddc0SDimitry Andric // retain the same layout as before. 3604eeddc0SDimitry Andric # if defined(__APPLE__) 3704eeddc0SDimitry Andric int __padding_; // padding to fake the `__f_` field above 3804eeddc0SDimitry Andric # endif 3904eeddc0SDimitry Andric 4004eeddc0SDimitry Andric // ... vendors can add workarounds here if they switch to a different representation ... 4104eeddc0SDimitry Andric 4281ad6265SDimitry Andric _LIBCPP_DIAGNOSTIC_POP 4304eeddc0SDimitry Andric # endif 4404eeddc0SDimitry Andric 454824e7fdSDimitry Andric public: 464824e7fdSDimitry Andric // types 474824e7fdSDimitry Andric typedef unsigned result_type; 484824e7fdSDimitry Andric 494824e7fdSDimitry Andric // generator characteristics 504824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type _Min = 0; 514824e7fdSDimitry Andric static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu; 524824e7fdSDimitry Andric min()53*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type min() { return _Min; } max()54*cb14a3feSDimitry Andric _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type max() { return _Max; } 554824e7fdSDimitry Andric 564824e7fdSDimitry Andric // constructors 574824e7fdSDimitry Andric # ifndef _LIBCPP_CXX03_LANG random_device()5806c3fb27SDimitry Andric _LIBCPP_HIDE_FROM_ABI random_device() : random_device("/dev/urandom") {} 594824e7fdSDimitry Andric explicit random_device(const string& __token); 604824e7fdSDimitry Andric # else 614824e7fdSDimitry Andric explicit random_device(const string& __token = "/dev/urandom"); 624824e7fdSDimitry Andric # endif 634824e7fdSDimitry Andric ~random_device(); 644824e7fdSDimitry Andric 654824e7fdSDimitry Andric // generating functions 664824e7fdSDimitry Andric result_type operator()(); 674824e7fdSDimitry Andric 684824e7fdSDimitry Andric // property functions 694824e7fdSDimitry Andric double entropy() const _NOEXCEPT; 704824e7fdSDimitry Andric 710eae32dcSDimitry Andric random_device(const random_device&) = delete; 720eae32dcSDimitry Andric void operator=(const random_device&) = delete; 734824e7fdSDimitry Andric }; 744824e7fdSDimitry Andric 754824e7fdSDimitry Andric #endif // !_LIBCPP_HAS_NO_RANDOM_DEVICE 764824e7fdSDimitry Andric 774824e7fdSDimitry Andric _LIBCPP_END_NAMESPACE_STD 784824e7fdSDimitry Andric 794824e7fdSDimitry Andric _LIBCPP_POP_MACROS 804824e7fdSDimitry Andric 814824e7fdSDimitry Andric #endif // _LIBCPP___RANDOM_RANDOM_DEVICE_H 82