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