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