Path: blob/main/contrib/llvm-project/libcxx/include/__random/discard_block_engine.h
35233 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef _LIBCPP___RANDOM_DISCARD_BLOCK_ENGINE_H9#define _LIBCPP___RANDOM_DISCARD_BLOCK_ENGINE_H1011#include <__config>12#include <__random/is_seed_sequence.h>13#include <__type_traits/enable_if.h>14#include <__type_traits/is_convertible.h>15#include <__utility/move.h>16#include <cstddef>17#include <iosfwd>18#include <limits>1920#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)21# pragma GCC system_header22#endif2324_LIBCPP_PUSH_MACROS25#include <__undef_macros>2627_LIBCPP_BEGIN_NAMESPACE_STD2829template <class _Engine, size_t __p, size_t __r>30class _LIBCPP_TEMPLATE_VIS discard_block_engine {31_Engine __e_;32int __n_;3334static_assert(0 < __r, "discard_block_engine invalid parameters");35static_assert(__r <= __p, "discard_block_engine invalid parameters");36#ifndef _LIBCPP_CXX03_LANG // numeric_limits::max() is not constexpr in C++0337static_assert(__r <= numeric_limits<int>::max(), "discard_block_engine invalid parameters");38#endif3940public:41// types42typedef typename _Engine::result_type result_type;4344// engine characteristics45static _LIBCPP_CONSTEXPR const size_t block_size = __p;46static _LIBCPP_CONSTEXPR const size_t used_block = __r;4748#ifdef _LIBCPP_CXX03_LANG49static const result_type _Min = _Engine::_Min;50static const result_type _Max = _Engine::_Max;51#else52static constexpr result_type _Min = _Engine::min();53static constexpr result_type _Max = _Engine::max();54#endif5556_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); }57_LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); }5859// constructors and seeding functions60_LIBCPP_HIDE_FROM_ABI discard_block_engine() : __n_(0) {}61_LIBCPP_HIDE_FROM_ABI explicit discard_block_engine(const _Engine& __e) : __e_(__e), __n_(0) {}62#ifndef _LIBCPP_CXX03_LANG63_LIBCPP_HIDE_FROM_ABI explicit discard_block_engine(_Engine&& __e) : __e_(std::move(__e)), __n_(0) {}64#endif // _LIBCPP_CXX03_LANG65_LIBCPP_HIDE_FROM_ABI explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {}66template <67class _Sseq,68__enable_if_t<__is_seed_sequence<_Sseq, discard_block_engine>::value && !is_convertible<_Sseq, _Engine>::value,69int> = 0>70_LIBCPP_HIDE_FROM_ABI explicit discard_block_engine(_Sseq& __q) : __e_(__q), __n_(0) {}71_LIBCPP_HIDE_FROM_ABI void seed() {72__e_.seed();73__n_ = 0;74}75_LIBCPP_HIDE_FROM_ABI void seed(result_type __sd) {76__e_.seed(__sd);77__n_ = 0;78}79template <class _Sseq, __enable_if_t<__is_seed_sequence<_Sseq, discard_block_engine>::value, int> = 0>80_LIBCPP_HIDE_FROM_ABI void seed(_Sseq& __q) {81__e_.seed(__q);82__n_ = 0;83}8485// generating functions86_LIBCPP_HIDE_FROM_ABI result_type operator()();87_LIBCPP_HIDE_FROM_ABI void discard(unsigned long long __z) {88for (; __z; --__z)89operator()();90}9192// property functions93_LIBCPP_HIDE_FROM_ABI const _Engine& base() const _NOEXCEPT { return __e_; }9495template <class _Eng, size_t _Pp, size_t _Rp>96friend bool97operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, const discard_block_engine<_Eng, _Pp, _Rp>& __y);9899template <class _Eng, size_t _Pp, size_t _Rp>100friend bool101operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, const discard_block_engine<_Eng, _Pp, _Rp>& __y);102103template <class _CharT, class _Traits, class _Eng, size_t _Pp, size_t _Rp>104friend basic_ostream<_CharT, _Traits>&105operator<<(basic_ostream<_CharT, _Traits>& __os, const discard_block_engine<_Eng, _Pp, _Rp>& __x);106107template <class _CharT, class _Traits, class _Eng, size_t _Pp, size_t _Rp>108friend basic_istream<_CharT, _Traits>&109operator>>(basic_istream<_CharT, _Traits>& __is, discard_block_engine<_Eng, _Pp, _Rp>& __x);110};111112template <class _Engine, size_t __p, size_t __r>113_LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size;114115template <class _Engine, size_t __p, size_t __r>116_LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block;117118template <class _Engine, size_t __p, size_t __r>119typename discard_block_engine<_Engine, __p, __r>::result_type discard_block_engine<_Engine, __p, __r>::operator()() {120if (__n_ >= static_cast<int>(__r)) {121__e_.discard(__p - __r);122__n_ = 0;123}124++__n_;125return __e_();126}127128template <class _Eng, size_t _Pp, size_t _Rp>129inline _LIBCPP_HIDE_FROM_ABI bool130operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, const discard_block_engine<_Eng, _Pp, _Rp>& __y) {131return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_;132}133134template <class _Eng, size_t _Pp, size_t _Rp>135inline _LIBCPP_HIDE_FROM_ABI bool136operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, const discard_block_engine<_Eng, _Pp, _Rp>& __y) {137return !(__x == __y);138}139140template <class _CharT, class _Traits, class _Eng, size_t _Pp, size_t _Rp>141_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&142operator<<(basic_ostream<_CharT, _Traits>& __os, const discard_block_engine<_Eng, _Pp, _Rp>& __x) {143__save_flags<_CharT, _Traits> __lx(__os);144typedef basic_ostream<_CharT, _Traits> _Ostream;145__os.flags(_Ostream::dec | _Ostream::left);146_CharT __sp = __os.widen(' ');147__os.fill(__sp);148return __os << __x.__e_ << __sp << __x.__n_;149}150151template <class _CharT, class _Traits, class _Eng, size_t _Pp, size_t _Rp>152_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&153operator>>(basic_istream<_CharT, _Traits>& __is, discard_block_engine<_Eng, _Pp, _Rp>& __x) {154__save_flags<_CharT, _Traits> __lx(__is);155typedef basic_istream<_CharT, _Traits> _Istream;156__is.flags(_Istream::dec | _Istream::skipws);157_Eng __e;158int __n;159__is >> __e >> __n;160if (!__is.fail()) {161__x.__e_ = __e;162__x.__n_ = __n;163}164return __is;165}166167_LIBCPP_END_NAMESPACE_STD168169_LIBCPP_POP_MACROS170171#endif // _LIBCPP___RANDOM_DISCARD_BLOCK_ENGINE_H172173174