#ifndef _LIBCPP___RANDOM_LINEAR_CONGRUENTIAL_ENGINE_H
#define _LIBCPP___RANDOM_LINEAR_CONGRUENTIAL_ENGINE_H
#include <__config>
#include <__random/is_seed_sequence.h>
#include <__type_traits/enable_if.h>
#include <__type_traits/integral_constant.h>
#include <__type_traits/is_unsigned.h>
#include <cstdint>
#include <iosfwd>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
_LIBCPP_PUSH_MACROS
#include <__undef_macros>
_LIBCPP_BEGIN_NAMESPACE_STD
enum __lce_alg_type { … };
template <unsigned long long __a,
unsigned long long __c,
unsigned long long __m,
unsigned long long _Mp,
bool _HasOverflow = (__a != 0ull && (__m & (__m - 1ull)) != 0ull),
bool _Full = (!_HasOverflow || __m - 1ull <= (_Mp - __c) / __a),
bool _Part = (!_HasOverflow || __m - 1ull <= _Mp / __a),
bool _Schrage = (_HasOverflow && __m % __a <= __m / __a)>
struct __lce_alg_picker { … };
template <unsigned long long __a,
unsigned long long __c,
unsigned long long __m,
unsigned long long _Mp,
__lce_alg_type _Mode = __lce_alg_picker<__a, __c, __m, _Mp>::__mode>
struct __lce_ta;
#ifndef _LIBCPP_HAS_NO_INT128
__lce_ta<_Ap, _Cp, _Mp, (unsigned long long)(-1), _LCE_Promote>;
#endif
__lce_ta<__a, __c, __m, (unsigned long long)(-1), _LCE_Schrage>;
__lce_ta<__a, 0ULL, __m, (unsigned long long)(-1), _LCE_Schrage>;
__lce_ta<__a, __c, __m, (unsigned long long)(-1), _LCE_Part>;
__lce_ta<__a, __c, __m, (unsigned long long)(-1), _LCE_Full>;
__lce_ta<__a, __c, 0ULL, (unsigned long long)(-1), _LCE_Full>;
__lce_ta<__a, __c, __m, unsigned int(-1), _LCE_Promote>;
__lce_ta<_Ap, _Cp, _Mp, unsigned int(-1), _LCE_Schrage>;
__lce_ta<_Ap, 0ULL, _Mp, unsigned int(-1), _LCE_Schrage>;
__lce_ta<_Ap, _Cp, _Mp, unsigned int(-1), _LCE_Part>;
__lce_ta<_Ap, _Cp, _Mp, unsigned int(-1), _LCE_Full>;
__lce_ta<_Ap, _Cp, 0ULL, unsigned int(-1), _LCE_Full>;
__lce_ta<__a, __c, __m, (unsigned short)(-1), __mode>;
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
class _LIBCPP_TEMPLATE_VIS linear_congruential_engine;
template <class _CharT, class _Traits, class _Up, _Up _Ap, _Up _Cp, _Up _Np>
_LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, const linear_congruential_engine<_Up, _Ap, _Cp, _Np>&);
template <class _CharT, class _Traits, class _Up, _Up _Ap, _Up _Cp, _Up _Np>
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, linear_congruential_engine<_Up, _Ap, _Cp, _Np>& __x);
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
class _LIBCPP_TEMPLATE_VIS linear_congruential_engine { … };
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
linear_congruential_engine<_UIntType, __a, __c, __m>::multiplier;
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
linear_congruential_engine<_UIntType, __a, __c, __m>::increment;
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
linear_congruential_engine<_UIntType, __a, __c, __m>::modulus;
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
_LIBCPP_CONSTEXPR const typename linear_congruential_engine<_UIntType, __a, __c, __m>::result_type
linear_congruential_engine<_UIntType, __a, __c, __m>::default_seed;
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
template <class _Sseq>
void linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, integral_constant<unsigned, 1>) { … }
template <class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
template <class _Sseq>
void linear_congruential_engine<_UIntType, __a, __c, __m>::__seed(_Sseq& __q, integral_constant<unsigned, 2>) { … }
template <class _CharT, class _Traits, class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
inline _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, const linear_congruential_engine<_UIntType, __a, __c, __m>& __x) { … }
template <class _CharT, class _Traits, class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m>
_LIBCPP_HIDE_FROM_ABI basic_istream<_CharT, _Traits>&
operator>>(basic_istream<_CharT, _Traits>& __is, linear_congruential_engine<_UIntType, __a, __c, __m>& __x) { … }
minstd_rand0;
minstd_rand;
_LIBCPP_END_NAMESPACE_STD
_LIBCPP_POP_MACROS
#endif