
This commit reverts 5aaefa51 (and also partly 7f285f48e77 and b6d75682f9, which were related to the original commit). As landed, 5aaefa51 had unintended consequences on some downstream bots and didn't have proper coverage upstream due to a few subtle things. Implementing this is something we should do in libc++, however we'll first need to address a few issues listed in https://reviews.llvm.org/D106124#3349710. Differential Revision: https://reviews.llvm.org/D120683
85 lines
2.3 KiB
C++
85 lines
2.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP___RANDOM_RANDOM_DEVICE_H
|
|
#define _LIBCPP___RANDOM_RANDOM_DEVICE_H
|
|
|
|
#include <__config>
|
|
#include <string>
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
#endif
|
|
|
|
_LIBCPP_PUSH_MACROS
|
|
#include <__undef_macros>
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_RANDOM_DEVICE)
|
|
|
|
class _LIBCPP_TYPE_VIS random_device
|
|
{
|
|
#ifdef _LIBCPP_USING_DEV_RANDOM
|
|
int __f_;
|
|
#elif !defined(_LIBCPP_ABI_NO_RANDOM_DEVICE_COMPATIBILITY_LAYOUT)
|
|
_LIBCPP_DIAGNOSTIC_PUSH
|
|
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wunused-private-field")
|
|
|
|
// Apple platforms used to use the `_LIBCPP_USING_DEV_RANDOM` code path, and now
|
|
// use `arc4random()` as of this comment. In order to avoid breaking the ABI, we
|
|
// retain the same layout as before.
|
|
# if defined(__APPLE__)
|
|
int __padding_; // padding to fake the `__f_` field above
|
|
# endif
|
|
|
|
// ... vendors can add workarounds here if they switch to a different representation ...
|
|
|
|
_LIBCPP_DIAGNOSTIC_POP
|
|
#endif
|
|
|
|
public:
|
|
// types
|
|
typedef unsigned result_type;
|
|
|
|
// generator characteristics
|
|
static _LIBCPP_CONSTEXPR const result_type _Min = 0;
|
|
static _LIBCPP_CONSTEXPR const result_type _Max = 0xFFFFFFFFu;
|
|
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
static _LIBCPP_CONSTEXPR result_type min() { return _Min;}
|
|
_LIBCPP_INLINE_VISIBILITY
|
|
static _LIBCPP_CONSTEXPR result_type max() { return _Max;}
|
|
|
|
// constructors
|
|
#ifndef _LIBCPP_CXX03_LANG
|
|
random_device() : random_device("/dev/urandom") {}
|
|
explicit random_device(const string& __token);
|
|
#else
|
|
explicit random_device(const string& __token = "/dev/urandom");
|
|
#endif
|
|
~random_device();
|
|
|
|
// generating functions
|
|
result_type operator()();
|
|
|
|
// property functions
|
|
double entropy() const _NOEXCEPT;
|
|
|
|
random_device(const random_device&) = delete;
|
|
void operator=(const random_device&) = delete;
|
|
};
|
|
|
|
#endif // !_LIBCPP_HAS_NO_RANDOM_DEVICE
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
_LIBCPP_POP_MACROS
|
|
|
|
#endif // _LIBCPP___RANDOM_RANDOM_DEVICE_H
|