xref: /freebsd/contrib/llvm-project/libcxx/include/__random/random_device.h (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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_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 
45 public:
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