1 //===----------------------------------------------------------------------===// 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 #ifndef _LIBCPP___RANDOM_RANDOM_DEVICE_H 10 #define _LIBCPP___RANDOM_RANDOM_DEVICE_H 11 12 #include <__config> 13 #include <string> 14 15 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 16 # pragma GCC system_header 17 #endif 18 19 _LIBCPP_PUSH_MACROS 20 #include <__undef_macros> 21 22 _LIBCPP_BEGIN_NAMESPACE_STD 23 24 #if !defined(_LIBCPP_HAS_NO_RANDOM_DEVICE) 25 26 class _LIBCPP_TYPE_VIS random_device 27 { 28 #ifdef _LIBCPP_USING_DEV_RANDOM 29 int __f_; 30 #elif !defined(_LIBCPP_ABI_NO_RANDOM_DEVICE_COMPATIBILITY_LAYOUT) 31 _LIBCPP_DIAGNOSTIC_PUSH 32 _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wunused-private-field") 33 34 // Apple platforms used to use the `_LIBCPP_USING_DEV_RANDOM` code path, and now 35 // use `arc4random()` as of this comment. In order to avoid breaking the ABI, we 36 // retain the same layout as before. 37 # if defined(__APPLE__) 38 int __padding_; // padding to fake the `__f_` field above 39 # endif 40 41 // ... vendors can add workarounds here if they switch to a different representation ... 42 43 _LIBCPP_DIAGNOSTIC_POP 44 #endif 45 46 public: 47 // types 48 typedef unsigned result_type; 49 50 // generator characteristics 51 static _LIBCPP_CONSTEXPR const result_type _Min = 0; 52 static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu; 53 54 _LIBCPP_INLINE_VISIBILITY 55 static _LIBCPP_CONSTEXPR result_type min() { return _Min;} 56 _LIBCPP_INLINE_VISIBILITY 57 static _LIBCPP_CONSTEXPR result_type max() { return _Max;} 58 59 // constructors 60 #ifndef _LIBCPP_CXX03_LANG 61 random_device() : random_device("/dev/urandom") {} 62 explicit random_device(const string& __token); 63 #else 64 explicit random_device(const string& __token = "/dev/urandom"); 65 #endif 66 ~random_device(); 67 68 // generating functions 69 result_type operator()(); 70 71 // property functions 72 double entropy() const _NOEXCEPT; 73 74 random_device(const random_device&) = delete; 75 void operator=(const random_device&) = delete; 76 }; 77 78 #endif // !_LIBCPP_HAS_NO_RANDOM_DEVICE 79 80 _LIBCPP_END_NAMESPACE_STD 81 82 _LIBCPP_POP_MACROS 83 84 #endif // _LIBCPP___RANDOM_RANDOM_DEVICE_H 85