diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-12-02 21:02:54 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-12-02 21:02:54 +0000 | 
| commit | f65dcba83ce5035ab88a85fe17628b447eb56e1b (patch) | |
| tree | 35f37bb72b3cfc6060193e66c76ee7c9478969b0 /libcxx | |
| parent | 846a2208a8ab099f595fe7e8b2e6d54a7b5e67fb (diff) | |
Diffstat (limited to 'libcxx')
78 files changed, 7963 insertions, 6116 deletions
diff --git a/libcxx/CREDITS.TXT b/libcxx/CREDITS.TXT index 597c5fcb7cf4..fc442f4db1a1 100644 --- a/libcxx/CREDITS.TXT +++ b/libcxx/CREDITS.TXT @@ -149,6 +149,10 @@ N: Klaas de Vries  E: klaas at klaasgaaf dot nl  D: Minor bug fix. +N: Mark de Wever +E: koraq at xs4all dot nl +D: Format library support. +  N: Zhang Xiongpang  E: zhangxiongpang@gmail.com  D: Minor patches and bug fixes. diff --git a/libcxx/include/__bit/byteswap.h b/libcxx/include/__bit/byteswap.h new file mode 100644 index 000000000000..970074ed98ce --- /dev/null +++ b/libcxx/include/__bit/byteswap.h @@ -0,0 +1,55 @@ +// -*- 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___BIT_BYTESWAP_H +#define _LIBCPP___BIT_BYTESWAP_H + +#include <__concepts/arithmetic.h> +#include <__config> +#include <cstdint> +#include <cstdlib> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 20 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +template <integral _Tp> +_LIBCPP_HIDE_FROM_ABI constexpr _Tp byteswap(_Tp __val) noexcept { + +  if constexpr (sizeof(_Tp) == 1) { +    return __val; +  } else if constexpr (sizeof(_Tp) == 2) { +    return __builtin_bswap16(__val); +  } else if constexpr (sizeof(_Tp) == 4) { +    return __builtin_bswap32(__val); +  } else if constexpr (sizeof(_Tp) == 8) { +    return __builtin_bswap64(__val); +#ifndef _LIBCPP_HAS_NO_INT128 +  } else if constexpr (sizeof(_Tp) == 16) { +#if __has_builtin(__builtin_bswap128) +    return __builtin_bswap128(__val); +#else +    return static_cast<_Tp>(byteswap(static_cast<uint64_t>(__val))) << 64 | +           static_cast<_Tp>(byteswap(static_cast<uint64_t>(__val >> 64))); +#endif // __has_builtin(__builtin_bswap128) +#endif // _LIBCPP_HAS_NO_INT128 +  } else { +    static_assert(sizeof(_Tp) == 0, "byteswap is unimplemented for integral types of this size"); +  } +} + +#endif // _LIBCPP_STD_VER > 20 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___BIT_BYTESWAP_H diff --git a/libcxx/include/__bsd_locale_fallbacks.h b/libcxx/include/__bsd_locale_fallbacks.h index 2d5c2eca4679..a5788d9777b5 100644 --- a/libcxx/include/__bsd_locale_fallbacks.h +++ b/libcxx/include/__bsd_locale_fallbacks.h @@ -108,7 +108,7 @@ size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,  }  #endif -inline +inline _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 4, 5)  int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {      va_list __va;      va_start(__va, __format); @@ -118,7 +118,7 @@ int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__forma      return __res;  } -inline +inline _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 3, 4)  int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {      va_list __va;      va_start(__va, __format); @@ -128,7 +128,7 @@ int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {      return __res;  } -inline +inline _LIBCPP_ATTRIBUTE_FORMAT(__scanf__, 3, 4)  int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {      va_list __va;      va_start(__va, __format); diff --git a/libcxx/include/__compare/partial_order.h b/libcxx/include/__compare/partial_order.h new file mode 100644 index 000000000000..ac8b405a4090 --- /dev/null +++ b/libcxx/include/__compare/partial_order.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// 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___COMPARE_PARTIAL_ORDER +#define _LIBCPP___COMPARE_PARTIAL_ORDER + +#include <__compare/compare_three_way.h> +#include <__compare/ordering.h> +#include <__compare/weak_order.h> +#include <__config> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> +#include <type_traits> + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +// [cmp.alg] +namespace __partial_order { +    struct __fn { +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<2>) +            noexcept(noexcept(partial_ordering(partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      partial_ordering(partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          partial_ordering(partial_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) +            noexcept(noexcept(partial_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      partial_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          partial_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) +            noexcept(noexcept(partial_ordering(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      partial_ordering(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          partial_ordering(_VSTD::weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up> +        _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const +            noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()))) +            -> decltype(      __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>())) +            { return          __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()); } +    }; +} // namespace __partial_order + +inline namespace __cpo { +    inline constexpr auto partial_order = __partial_order::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_PARTIAL_ORDER diff --git a/libcxx/include/__compare/strong_order.h b/libcxx/include/__compare/strong_order.h new file mode 100644 index 000000000000..e49b2d45de45 --- /dev/null +++ b/libcxx/include/__compare/strong_order.h @@ -0,0 +1,136 @@ +//===----------------------------------------------------------------------===// +// +// 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___COMPARE_STRONG_ORDER +#define _LIBCPP___COMPARE_STRONG_ORDER + +#include <__bit/bit_cast.h> +#include <__compare/compare_three_way.h> +#include <__compare/ordering.h> +#include <__config> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> +#include <cmath> +#include <cstdint> +#include <limits> +#include <type_traits> + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +// [cmp.alg] +namespace __strong_order { +    struct __fn { +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<2>) +            noexcept(noexcept(strong_ordering(strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      strong_ordering(strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          strong_ordering(strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up, class _Dp = decay_t<_Tp>> +            requires is_same_v<_Dp, decay_t<_Up>> && is_floating_point_v<_Dp> +        _LIBCPP_HIDE_FROM_ABI static constexpr strong_ordering +        __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) noexcept +        { +            if constexpr (numeric_limits<_Dp>::is_iec559 && sizeof(_Dp) == sizeof(int32_t)) { +                int32_t __rx = _VSTD::bit_cast<int32_t>(__t); +                int32_t __ry = _VSTD::bit_cast<int32_t>(__u); +                __rx = (__rx < 0) ? (numeric_limits<int32_t>::min() - __rx - 1) : __rx; +                __ry = (__ry < 0) ? (numeric_limits<int32_t>::min() - __ry - 1) : __ry; +                return (__rx <=> __ry); +            } else if constexpr (numeric_limits<_Dp>::is_iec559 && sizeof(_Dp) == sizeof(int64_t)) { +                int64_t __rx = _VSTD::bit_cast<int64_t>(__t); +                int64_t __ry = _VSTD::bit_cast<int64_t>(__u); +                __rx = (__rx < 0) ? (numeric_limits<int64_t>::min() - __rx - 1) : __rx; +                __ry = (__ry < 0) ? (numeric_limits<int64_t>::min() - __ry - 1) : __ry; +                return (__rx <=> __ry); +            } else if (__t < __u) { +                return strong_ordering::less; +            } else if (__t > __u) { +                return strong_ordering::greater; +            } else if (__t == __u) { +                if constexpr (numeric_limits<_Dp>::radix == 2) { +                    return _VSTD::signbit(__u) <=> _VSTD::signbit(__t); +                } else { +                    // This is bullet 3 of the IEEE754 algorithm, relevant +                    // only for decimal floating-point; +                    // see https://stackoverflow.com/questions/69068075/ +                    if (__t == 0 || _VSTD::isinf(__t)) { +                        return _VSTD::signbit(__u) <=> _VSTD::signbit(__t); +                    } else { +                        int __texp, __uexp; +                        (void)_VSTD::frexp(__t, &__texp); +                        (void)_VSTD::frexp(__u, &__uexp); +                        return (__t < 0) ? (__texp <=> __uexp) : (__uexp <=> __texp); +                    } +                } +            } else { +                // They're unordered, so one of them must be a NAN. +                // The order is -QNAN, -SNAN, numbers, +SNAN, +QNAN. +                bool __t_is_nan = _VSTD::isnan(__t); +                bool __u_is_nan = _VSTD::isnan(__u); +                bool __t_is_negative = _VSTD::signbit(__t); +                bool __u_is_negative = _VSTD::signbit(__u); +                using _IntType = std::conditional_t< +                    sizeof(__t) == sizeof(int32_t), int32_t, std::conditional_t< +                    sizeof(__t) == sizeof(int64_t), int64_t, void> +                >; +                if constexpr (std::is_same_v<_IntType, void>) { +                    static_assert(sizeof(_Dp) == 0, "std::strong_order is unimplemented for this floating-point type"); +                } else if (__t_is_nan && __u_is_nan) { +                    // Order by sign bit, then by "payload bits" (we'll just use bit_cast). +                    if (__t_is_negative != __u_is_negative) { +                        return (__u_is_negative <=> __t_is_negative); +                    } else { +                        return _VSTD::bit_cast<_IntType>(__t) <=> _VSTD::bit_cast<_IntType>(__u); +                    } +                } else if (__t_is_nan) { +                    return __t_is_negative ? strong_ordering::less : strong_ordering::greater; +                } else { +                    return __u_is_negative ? strong_ordering::greater : strong_ordering::less; +                } +            } +        } + +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) +            noexcept(noexcept(strong_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      strong_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          strong_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up> +        _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const +            noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()))) +            -> decltype(      __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>())) +            { return          __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<2>()); } +    }; +} // namespace __strong_order + +inline namespace __cpo { +    inline constexpr auto strong_order = __strong_order::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___COMPARE_STRONG_ORDER diff --git a/libcxx/include/__compare/weak_order.h b/libcxx/include/__compare/weak_order.h new file mode 100644 index 000000000000..f67416ed3ebe --- /dev/null +++ b/libcxx/include/__compare/weak_order.h @@ -0,0 +1,100 @@ +//===----------------------------------------------------------------------===// +// +// 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___COMPARE_WEAK_ORDER +#define _LIBCPP___COMPARE_WEAK_ORDER + +#include <__compare/compare_three_way.h> +#include <__compare/ordering.h> +#include <__compare/strong_order.h> +#include <__config> +#include <__utility/forward.h> +#include <__utility/priority_tag.h> +#include <cmath> +#include <type_traits> + +#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +// [cmp.alg] +namespace __weak_order { +    struct __fn { +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<3>) +            noexcept(noexcept(weak_ordering(weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      weak_ordering(weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          weak_ordering(weak_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up, class _Dp = decay_t<_Tp>> +            requires is_same_v<_Dp, decay_t<_Up>> && is_floating_point_v<_Dp> +        _LIBCPP_HIDE_FROM_ABI static constexpr weak_ordering +        __go(_Tp&& __t, _Up&& __u, __priority_tag<2>) noexcept +        { +            std::partial_ordering __po = (__t <=> __u); +            if (__po == std::partial_ordering::less) { +                return std::weak_ordering::less; +            } else if (__po == std::partial_ordering::equivalent) { +                return std::weak_ordering::equivalent; +            } else if (__po == std::partial_ordering::greater) { +                return std::weak_ordering::greater; +            } else { +                // Otherwise, at least one of them is a NaN. +                bool __t_is_nan = _VSTD::isnan(__t); +                bool __u_is_nan = _VSTD::isnan(__u); +                bool __t_is_negative = _VSTD::signbit(__t); +                bool __u_is_negative = _VSTD::signbit(__u); +                if (__t_is_nan && __u_is_nan) { +                    return (__u_is_negative <=> __t_is_negative); +                } else if (__t_is_nan) { +                    return __t_is_negative ? weak_ordering::less : weak_ordering::greater; +                } else { +                    return __u_is_negative ? weak_ordering::greater : weak_ordering::less; +                } +            } +        } + +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<1>) +            noexcept(noexcept(weak_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      weak_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          weak_ordering(compare_three_way()(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up> +            requires is_same_v<decay_t<_Tp>, decay_t<_Up>> +        _LIBCPP_HIDE_FROM_ABI static constexpr auto +        __go(_Tp&& __t, _Up&& __u, __priority_tag<0>) +            noexcept(noexcept(weak_ordering(_VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))))) +            -> decltype(      weak_ordering(_VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u)))) +            { return          weak_ordering(_VSTD::strong_order(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u))); } + +        template<class _Tp, class _Up> +        _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __t, _Up&& __u) const +            noexcept(noexcept(__go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<3>()))) +            -> decltype(      __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<3>())) +            { return          __go(_VSTD::forward<_Tp>(__t), _VSTD::forward<_Up>(__u), __priority_tag<3>()); } +    }; +} // namespace __weak_order + +inline namespace __cpo { +    inline constexpr auto weak_order = __weak_order::__fn{}; +} // namespace __cpo + +#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___COMPARE_WEAK_ORDER diff --git a/libcxx/include/__config b/libcxx/include/__config index dbf4383cd6e3..da03e877f753 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -74,10 +74,6 @@  #  define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB  #  define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB  #  define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE -// Don't use a nullptr_t simulation type in C++03 instead using C++11 nullptr -// provided under the alternate keyword __nullptr, which changes the mangling -// of nullptr_t. This option is ABI incompatible with GCC in C++03 mode. -#  define _LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR  // Define a key function for `bad_function_call` in the library, to centralize  // its vtable and typeinfo to libc++ rather than having all other libraries  // using that class define their own copies. @@ -127,6 +123,23 @@  #  endif  #endif +// By default, don't use a nullptr_t emulation type in C++03. +// +// This is technically an ABI break from previous releases, however it is +// very unlikely to impact anyone. If a user is impacted by this break, +// they can return to using the C++03 nullptr emulation by defining +// _LIBCPP_ABI_USE_CXX03_NULLPTR_EMULATION. +// +// This switch will be removed entirely in favour of never providing a +// C++03 emulation after one release. +// +// IMPORTANT: IF YOU ARE READING THIS AND YOU TURN THIS MACRO ON, PLEASE LEAVE +//            A COMMENT ON https://reviews.llvm.org/D109459 OR YOU WILL BE BROKEN +//            IN THE FUTURE WHEN WE REMOVE THE ABILITY TO USE THE C++03 EMULATION. +#ifndef _LIBCPP_ABI_USE_CXX03_NULLPTR_EMULATION +# define _LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR +#endif +  #if defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2  // Enable additional explicit instantiations of iostreams components. This  // reduces the number of weak definitions generated in programs that use @@ -1056,12 +1069,6 @@ typedef unsigned int   char32_t;  #  define _LIBCPP_NODISCARD_AFTER_CXX17  #endif -#if !defined(_LIBCPP_DEBUG) && _LIBCPP_STD_VER > 11 -#   define _LIBCPP_CONSTEXPR_IF_NODEBUG constexpr -#else -#   define _LIBCPP_CONSTEXPR_IF_NODEBUG -#endif -  #if __has_attribute(no_destroy)  #  define _LIBCPP_NO_DESTROY __attribute__((__no_destroy__))  #else @@ -1376,10 +1383,12 @@ extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container(  #endif  #if defined(__GNUC__) || defined(__clang__) -#define _LIBCPP_FORMAT_PRINTF(a, b)                                            \ -  __attribute__((__format__(__printf__, a, b))) +  // The attribute uses 1-based indices for ordinary and static member functions. +  // The attribute uses 2-based indices for non-static member functions. +# define _LIBCPP_ATTRIBUTE_FORMAT(archetype, format_string_index, first_format_arg_index) \ +    __attribute__((__format__(archetype, format_string_index, first_format_arg_index)))  #else -#define _LIBCPP_FORMAT_PRINTF(a, b) +# define _LIBCPP_ATTRIBUTE_FORMAT(archetype, format_string_index, first_format_arg_index) /* nothing */  #endif  #endif // __cplusplus diff --git a/libcxx/include/__iterator/reverse_iterator.h b/libcxx/include/__iterator/reverse_iterator.h index f7a948950df2..d06859ee5f39 100644 --- a/libcxx/include/__iterator/reverse_iterator.h +++ b/libcxx/include/__iterator/reverse_iterator.h @@ -11,6 +11,8 @@  #define _LIBCPP___ITERATOR_REVERSE_ITERATOR_H  #include <__config> +#include <__compare/compare_three_way_result.h> +#include <__compare/three_way_comparable.h>  #include <__iterator/iterator.h>  #include <__iterator/iterator_traits.h>  #include <__memory/addressof.h> @@ -193,6 +195,16 @@ operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>&      return __x.base() >= __y.base();  } +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) +template <class _Iter1, three_way_comparable_with<_Iter1> _Iter2> +_LIBCPP_HIDE_FROM_ABI constexpr +compare_three_way_result_t<_Iter1, _Iter2> +operator<=>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) +{ +    return __y.base() <=> __x.base(); +} +#endif +  #ifndef _LIBCPP_CXX03_LANG  template <class _Iter1, class _Iter2>  inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 diff --git a/libcxx/include/__iterator/wrap_iter.h b/libcxx/include/__iterator/wrap_iter.h index 28872f9fa41a..cfcc9857b3fc 100644 --- a/libcxx/include/__iterator/wrap_iter.h +++ b/libcxx/include/__iterator/wrap_iter.h @@ -40,120 +40,129 @@ public:  private:      iterator_type __i;  public: -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter() _NOEXCEPT -#if _LIBCPP_STD_VER > 11 -                : __i{} -#endif +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter() _NOEXCEPT +                : __i()      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          __get_db()->__insert_i(this);  #endif      } -    template <class _Up> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +    template <class _Up> _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11          __wrap_iter(const __wrap_iter<_Up>& __u,              typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = nullptr) _NOEXCEPT              : __i(__u.base())      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          __get_db()->__iterator_copy(this, _VSTD::addressof(__u));  #endif      }  #if _LIBCPP_DEBUG_LEVEL == 2 -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11      __wrap_iter(const __wrap_iter& __x)          : __i(__x.base())      { +      if (!__libcpp_is_constant_evaluated())          __get_db()->__iterator_copy(this, _VSTD::addressof(__x));      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11      __wrap_iter& operator=(const __wrap_iter& __x)      { -        if (this != _VSTD::addressof(__x)) +        if (this != _VSTD::addressof(__x) && !__libcpp_is_constant_evaluated())          {              __get_db()->__iterator_copy(this, _VSTD::addressof(__x));              __i = __x.__i;          }          return *this;      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17      ~__wrap_iter()      { +      if (!__libcpp_is_constant_evaluated())          __get_db()->__erase_i(this);      }  #endif -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference operator*() const _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 reference operator*() const _NOEXCEPT      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),                         "Attempted to dereference a non-dereferenceable iterator");  #endif          return *__i;      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG pointer  operator->() const _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 pointer operator->() const _NOEXCEPT      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),                         "Attempted to dereference a non-dereferenceable iterator");  #endif          return _VSTD::__to_address(__i);      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator++() _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter& operator++() _NOEXCEPT      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),                         "Attempted to increment a non-incrementable iterator");  #endif          ++__i;          return *this;      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator++(int) _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter  operator++(int) _NOEXCEPT          {__wrap_iter __tmp(*this); ++(*this); return __tmp;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator--() _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter& operator--() _NOEXCEPT      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),                         "Attempted to decrement a non-decrementable iterator");  #endif          --__i;          return *this;      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator--(int) _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter  operator--(int) _NOEXCEPT          {__wrap_iter __tmp(*this); --(*this); return __tmp;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator+ (difference_type __n) const _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter  operator+ (difference_type __n) const _NOEXCEPT          {__wrap_iter __w(*this); __w += __n; return __w;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator+=(difference_type __n) _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter& operator+=(difference_type __n) _NOEXCEPT      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          _LIBCPP_ASSERT(__get_const_db()->__addable(this, __n),                     "Attempted to add/subtract an iterator outside its valid range");  #endif          __i += __n;          return *this;      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter  operator- (difference_type __n) const _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter  operator- (difference_type __n) const _NOEXCEPT          {return *this + (-__n);} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator-=(difference_type __n) _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter& operator-=(difference_type __n) _NOEXCEPT          {*this += -__n; return *this;} -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference    operator[](difference_type __n) const _NOEXCEPT +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 reference    operator[](difference_type __n) const _NOEXCEPT      {  #if _LIBCPP_DEBUG_LEVEL == 2 +      if (!__libcpp_is_constant_evaluated())          _LIBCPP_ASSERT(__get_const_db()->__subscriptable(this, __n),                     "Attempted to subscript an iterator outside its valid range");  #endif          return __i[__n];      } -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG iterator_type base() const _NOEXCEPT {return __i;} +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 iterator_type base() const _NOEXCEPT {return __i;}  private:  #if _LIBCPP_DEBUG_LEVEL == 2 -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(const void* __p, iterator_type __x) : __i(__x) +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter(const void* __p, iterator_type __x) : __i(__x)      { +      if (!__libcpp_is_constant_evaluated())          __get_db()->__insert_ic(this, __p);      }  #else -    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {} +    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {}  #endif      template <class _Up> friend class __wrap_iter; @@ -163,24 +172,25 @@ private:  };  template <class _Iter1> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT  {      return __x.base() == __y.base();  }  template <class _Iter1, class _Iter2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT  {      return __x.base() == __y.base();  }  template <class _Iter1> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11  bool operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT  {  #if _LIBCPP_DEBUG_LEVEL == 2 +  if (!__libcpp_is_constant_evaluated())      _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(_VSTD::addressof(__x), _VSTD::addressof(__y)),                     "Attempted to compare incomparable iterators");  #endif @@ -188,10 +198,11 @@ bool operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _  }  template <class _Iter1, class _Iter2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11  bool operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT  {  #if _LIBCPP_DEBUG_LEVEL == 2 +  if (!__libcpp_is_constant_evaluated())      _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y),                     "Attempted to compare incomparable iterators");  #endif @@ -199,63 +210,63 @@ bool operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _  }  template <class _Iter1> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT  {      return !(__x == __y);  }  template <class _Iter1, class _Iter2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT  {      return !(__x == __y);  }  template <class _Iter1> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT  {      return __y < __x;  }  template <class _Iter1, class _Iter2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT  {      return __y < __x;  }  template <class _Iter1> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT  {      return !(__x < __y);  }  template <class _Iter1, class _Iter2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT  {      return !(__x < __y);  }  template <class _Iter1> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT  {      return !(__y < __x);  }  template <class _Iter1, class _Iter2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR  bool operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT  {      return !(__y < __x);  }  template <class _Iter1, class _Iter2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11  #ifndef _LIBCPP_CXX03_LANG  auto operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT      -> decltype(__x.base() - __y.base()) @@ -265,6 +276,7 @@ operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXC  #endif // C++03  {  #if _LIBCPP_DEBUG_LEVEL == 2 +  if (!__libcpp_is_constant_evaluated())      _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(_VSTD::addressof(__x), _VSTD::addressof(__y)),                     "Attempted to subtract incompatible iterators");  #endif @@ -272,7 +284,7 @@ operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXC  }  template <class _Iter1> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11  __wrap_iter<_Iter1> operator+(typename __wrap_iter<_Iter1>::difference_type __n, __wrap_iter<_Iter1> __x) _NOEXCEPT  {      __x += __n; diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h index cc32352ae11c..f4c8fa02d650 100644 --- a/libcxx/include/__memory/allocator_traits.h +++ b/libcxx/include/__memory/allocator_traits.h @@ -349,14 +349,6 @@ struct _LIBCPP_TEMPLATE_VIS allocator_traits      }  }; -// A version of `allocator_traits` for internal usage that SFINAEs away if the -// given allocator doesn't have a nested `value_type`. This helps avoid hard -// errors when forming implicit deduction guides for a container that has an -// invalid Allocator type. See https://wg21.link/LWGXXXXX. -// TODO(varconst): use the actual link once available. -template <class _Alloc, class _ValueType = typename _Alloc::value_type> -struct _LIBCPP_TEMPLATE_VIS __allocator_traits : allocator_traits<_Alloc> {}; -  template <class _Traits, class _Tp>  struct __rebind_alloc_helper {  #ifndef _LIBCPP_CXX03_LANG diff --git a/libcxx/include/__memory/unique_ptr.h b/libcxx/include/__memory/unique_ptr.h index 838960269c97..433120394269 100644 --- a/libcxx/include/__memory/unique_ptr.h +++ b/libcxx/include/__memory/unique_ptr.h @@ -174,17 +174,17 @@ public:    template <bool _Dummy = true,              class = _EnableIfDeleterDefaultConstructible<_Dummy> >    _LIBCPP_INLINE_VISIBILITY -  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {} +  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}    template <bool _Dummy = true,              class = _EnableIfDeleterDefaultConstructible<_Dummy> >    _LIBCPP_INLINE_VISIBILITY -  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {} +  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}    template <bool _Dummy = true,              class = _EnableIfDeleterDefaultConstructible<_Dummy> >    _LIBCPP_INLINE_VISIBILITY -  explicit unique_ptr(pointer __p) _NOEXCEPT : __ptr_(__p, __default_init_tag()) {} +  explicit unique_ptr(pointer __p) _NOEXCEPT : __ptr_(__p, __value_init_tag()) {}    template <bool _Dummy = true,              class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> > > @@ -226,7 +226,7 @@ public:               typename enable_if<is_convertible<_Up*, _Tp*>::value &&                                      is_same<_Dp, default_delete<_Tp> >::value,                                  __nat>::type = __nat()) _NOEXCEPT -      : __ptr_(__p.release(), __default_init_tag()) {} +      : __ptr_(__p.release(), __value_init_tag()) {}  #endif    _LIBCPP_INLINE_VISIBILITY @@ -397,19 +397,19 @@ public:    template <bool _Dummy = true,              class = _EnableIfDeleterDefaultConstructible<_Dummy> >    _LIBCPP_INLINE_VISIBILITY -  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {} +  _LIBCPP_CONSTEXPR unique_ptr() _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}    template <bool _Dummy = true,              class = _EnableIfDeleterDefaultConstructible<_Dummy> >    _LIBCPP_INLINE_VISIBILITY -  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(pointer(), __default_init_tag()) {} +  _LIBCPP_CONSTEXPR unique_ptr(nullptr_t) _NOEXCEPT : __ptr_(__value_init_tag(), __value_init_tag()) {}    template <class _Pp, bool _Dummy = true,              class = _EnableIfDeleterDefaultConstructible<_Dummy>,              class = _EnableIfPointerConvertible<_Pp> >    _LIBCPP_INLINE_VISIBILITY    explicit unique_ptr(_Pp __p) _NOEXCEPT -      : __ptr_(__p, __default_init_tag()) {} +      : __ptr_(__p, __value_init_tag()) {}    template <class _Pp, bool _Dummy = true,              class = _EnableIfDeleterConstructible<_LValRefType<_Dummy> >, diff --git a/libcxx/include/__numeric/accumulate.h b/libcxx/include/__numeric/accumulate.h new file mode 100644 index 000000000000..fcdad58df141 --- /dev/null +++ b/libcxx/include/__numeric/accumulate.h @@ -0,0 +1,52 @@ +// -*- 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___NUMERIC_ACCUMULATE_H +#define _LIBCPP___NUMERIC_ACCUMULATE_H + +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _InputIterator, class _Tp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_Tp +accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) +{ +    for (; __first != __last; ++__first) +#if _LIBCPP_STD_VER > 17 +        __init = _VSTD::move(__init) + *__first; +#else +        __init = __init + *__first; +#endif +    return __init; +} + +template <class _InputIterator, class _Tp, class _BinaryOperation> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_Tp +accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) +{ +    for (; __first != __last; ++__first) +#if _LIBCPP_STD_VER > 17 +        __init = __binary_op(_VSTD::move(__init), *__first); +#else +        __init = __binary_op(__init, *__first); +#endif +    return __init; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_ACCUMULATE_H diff --git a/libcxx/include/__numeric/adjacent_difference.h b/libcxx/include/__numeric/adjacent_difference.h new file mode 100644 index 000000000000..5c712ecdf77d --- /dev/null +++ b/libcxx/include/__numeric/adjacent_difference.h @@ -0,0 +1,72 @@ +// -*- 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___NUMERIC_ADJACENT_DIFFERENCE_H +#define _LIBCPP___NUMERIC_ADJACENT_DIFFERENCE_H + +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _InputIterator, class _OutputIterator> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_OutputIterator +adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ +    if (__first != __last) +    { +        typename iterator_traits<_InputIterator>::value_type __acc(*__first); +        *__result = __acc; +        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) +        { +            typename iterator_traits<_InputIterator>::value_type __val(*__first); +#if _LIBCPP_STD_VER > 17 +            *__result = __val - _VSTD::move(__acc); +#else +            *__result = __val - __acc; +#endif +            __acc = _VSTD::move(__val); +        } +    } +    return __result; +} + +template <class _InputIterator, class _OutputIterator, class _BinaryOperation> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_OutputIterator +adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, +                      _BinaryOperation __binary_op) +{ +    if (__first != __last) +    { +        typename iterator_traits<_InputIterator>::value_type __acc(*__first); +        *__result = __acc; +        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) +        { +            typename iterator_traits<_InputIterator>::value_type __val(*__first); +#if _LIBCPP_STD_VER > 17 +            *__result = __binary_op(__val, _VSTD::move(__acc)); +#else +            *__result = __binary_op(__val, __acc); +#endif +            __acc = _VSTD::move(__val); +        } +    } +    return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_ADJACENT_DIFFERENCE_H diff --git a/libcxx/include/__numeric/exclusive_scan.h b/libcxx/include/__numeric/exclusive_scan.h new file mode 100644 index 000000000000..c0c89b38805d --- /dev/null +++ b/libcxx/include/__numeric/exclusive_scan.h @@ -0,0 +1,53 @@ +// -*- 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___NUMERIC_EXCLUSIVE_SCAN_H +#define _LIBCPP___NUMERIC_EXCLUSIVE_SCAN_H + +#include <__config> +#include <__functional/operations.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator +exclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp __init, _BinaryOp __b) { +  if (__first != __last) { +    _Tp __tmp(__b(__init, *__first)); +    while (true) { +      *__result = _VSTD::move(__init); +      ++__result; +      ++__first; +      if (__first == __last) +        break; +      __init = _VSTD::move(__tmp); +      __tmp = __b(__init, *__first); +    } +  } +  return __result; +} + +template <class _InputIterator, class _OutputIterator, class _Tp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator +exclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Tp __init) { +  return _VSTD::exclusive_scan(__first, __last, __result, __init, _VSTD::plus<>()); +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_EXCLUSIVE_SCAN_H diff --git a/libcxx/include/__numeric/gcd_lcm.h b/libcxx/include/__numeric/gcd_lcm.h new file mode 100644 index 000000000000..34c0e533c928 --- /dev/null +++ b/libcxx/include/__numeric/gcd_lcm.h @@ -0,0 +1,96 @@ +// -*- 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___NUMERIC_GCD_LCM_H +#define _LIBCPP___NUMERIC_GCD_LCM_H + +#include <__config> +#include <__debug> +#include <limits> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template <typename _Result, typename _Source, bool _IsSigned = is_signed<_Source>::value> struct __ct_abs; + +template <typename _Result, typename _Source> +struct __ct_abs<_Result, _Source, true> { +    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY +    _Result operator()(_Source __t) const noexcept +    { +        if (__t >= 0) return __t; +        if (__t == numeric_limits<_Source>::min()) return -static_cast<_Result>(__t); +        return -__t; +    } +}; + +template <typename _Result, typename _Source> +struct __ct_abs<_Result, _Source, false> { +    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY +    _Result operator()(_Source __t) const noexcept { return __t; } +}; + + +template<class _Tp> +_LIBCPP_CONSTEXPR _LIBCPP_HIDDEN +_Tp __gcd(_Tp __m, _Tp __n) +{ +    static_assert((!is_signed<_Tp>::value), ""); +    return __n == 0 ? __m : _VSTD::__gcd<_Tp>(__n, __m % __n); +} + +template<class _Tp, class _Up> +_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY +common_type_t<_Tp,_Up> +gcd(_Tp __m, _Up __n) +{ +    static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to gcd must be integer types"); +    static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to gcd cannot be bool" ); +    static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to gcd cannot be bool" ); +    using _Rp = common_type_t<_Tp,_Up>; +    using _Wp = make_unsigned_t<_Rp>; +    return static_cast<_Rp>(_VSTD::__gcd( +        static_cast<_Wp>(__ct_abs<_Rp, _Tp>()(__m)), +        static_cast<_Wp>(__ct_abs<_Rp, _Up>()(__n)))); +} + +template<class _Tp, class _Up> +_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY +common_type_t<_Tp,_Up> +lcm(_Tp __m, _Up __n) +{ +    static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to lcm must be integer types"); +    static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to lcm cannot be bool" ); +    static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to lcm cannot be bool" ); +    if (__m == 0 || __n == 0) +        return 0; + +    using _Rp = common_type_t<_Tp,_Up>; +    _Rp __val1 = __ct_abs<_Rp, _Tp>()(__m) / _VSTD::gcd(__m, __n); +    _Rp __val2 = __ct_abs<_Rp, _Up>()(__n); +    _LIBCPP_ASSERT((numeric_limits<_Rp>::max() / __val1 > __val2), "Overflow in lcm"); +    return __val1 * __val2; +} + +#endif // _LIBCPP_STD_VER + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___NUMERIC_GCD_LCM_H diff --git a/libcxx/include/__numeric/inclusive_scan.h b/libcxx/include/__numeric/inclusive_scan.h new file mode 100644 index 000000000000..a6b005075835 --- /dev/null +++ b/libcxx/include/__numeric/inclusive_scan.h @@ -0,0 +1,60 @@ +// -*- 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___NUMERIC_INCLUSIVE_SCAN_H +#define _LIBCPP___NUMERIC_INCLUSIVE_SCAN_H + +#include <__config> +#include <__functional/operations.h> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator +inclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryOp __b, _Tp __init) { +  for (; __first != __last; ++__first, (void)++__result) { +    __init = __b(__init, *__first); +    *__result = __init; +  } +  return __result; +} + +template <class _InputIterator, class _OutputIterator, class _BinaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator +inclusive_scan(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryOp __b) { +  if (__first != __last) { +    typename iterator_traits<_InputIterator>::value_type __init = *__first; +    *__result++ = __init; +    if (++__first != __last) +      return _VSTD::inclusive_scan(__first, __last, __result, __b, __init); +  } + +  return __result; +} + +template <class _InputIterator, class _OutputIterator> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _OutputIterator inclusive_scan(_InputIterator __first, +                                                                                       _InputIterator __last, +                                                                                       _OutputIterator __result) { +  return _VSTD::inclusive_scan(__first, __last, __result, _VSTD::plus<>()); +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_INCLUSIVE_SCAN_H diff --git a/libcxx/include/__numeric/inner_product.h b/libcxx/include/__numeric/inner_product.h new file mode 100644 index 000000000000..004acdde6a0c --- /dev/null +++ b/libcxx/include/__numeric/inner_product.h @@ -0,0 +1,53 @@ +// -*- 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___NUMERIC_INNER_PRODUCT_H +#define _LIBCPP___NUMERIC_INNER_PRODUCT_H + +#include <__config> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _InputIterator1, class _InputIterator2, class _Tp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_Tp +inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) +{ +    for (; __first1 != __last1; ++__first1, (void) ++__first2) +#if _LIBCPP_STD_VER > 17 +        __init = _VSTD::move(__init) + *__first1 * *__first2; +#else +        __init = __init + *__first1 * *__first2; +#endif +    return __init; +} + +template <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_Tp +inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, +              _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) +{ +    for (; __first1 != __last1; ++__first1, (void) ++__first2) +#if _LIBCPP_STD_VER > 17 +        __init = __binary_op1(_VSTD::move(__init), __binary_op2(*__first1, *__first2)); +#else +        __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); +#endif +    return __init; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_INNER_PRODUCT_H diff --git a/libcxx/include/__numeric/iota.h b/libcxx/include/__numeric/iota.h new file mode 100644 index 000000000000..b30e0e0a5484 --- /dev/null +++ b/libcxx/include/__numeric/iota.h @@ -0,0 +1,32 @@ +// -*- 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___NUMERIC_IOTA_H +#define _LIBCPP___NUMERIC_IOTA_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _ForwardIterator, class _Tp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +void +iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_) +{ +    for (; __first != __last; ++__first, (void) ++__value_) +        *__first = __value_; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_IOTA_H diff --git a/libcxx/include/__numeric/midpoint.h b/libcxx/include/__numeric/midpoint.h new file mode 100644 index 000000000000..668030c46bcb --- /dev/null +++ b/libcxx/include/__numeric/midpoint.h @@ -0,0 +1,85 @@ +// -*- 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___NUMERIC_MIDPOINT_H +#define _LIBCPP___NUMERIC_MIDPOINT_H + +#include <__config> +#include <limits> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 +template <class _Tp> +_LIBCPP_INLINE_VISIBILITY constexpr +enable_if_t<is_integral_v<_Tp> && !is_same_v<bool, _Tp> && !is_null_pointer_v<_Tp>, _Tp> +midpoint(_Tp __a, _Tp __b) noexcept +_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK +{ +    using _Up = make_unsigned_t<_Tp>; +    constexpr _Up __bitshift = numeric_limits<_Up>::digits - 1; + +    _Up __diff = _Up(__b) - _Up(__a); +    _Up __sign_bit = __b < __a; + +    _Up __half_diff = (__diff / 2) + (__sign_bit << __bitshift) + (__sign_bit & __diff); + +    return __a + __half_diff; +} + + +template <class _TPtr> +_LIBCPP_INLINE_VISIBILITY constexpr +enable_if_t<is_pointer_v<_TPtr> +             && is_object_v<remove_pointer_t<_TPtr>> +             && ! is_void_v<remove_pointer_t<_TPtr>> +             && (sizeof(remove_pointer_t<_TPtr>) > 0), _TPtr> +midpoint(_TPtr __a, _TPtr __b) noexcept +{ +    return __a + _VSTD::midpoint(ptrdiff_t(0), __b - __a); +} + + +template <typename _Tp> +constexpr int __sign(_Tp __val) { +    return (_Tp(0) < __val) - (__val < _Tp(0)); +} + +template <typename _Fp> +constexpr _Fp __fp_abs(_Fp __f) { return __f >= 0 ? __f : -__f; } + +template <class _Fp> +_LIBCPP_INLINE_VISIBILITY constexpr +enable_if_t<is_floating_point_v<_Fp>, _Fp> +midpoint(_Fp __a, _Fp __b) noexcept +{ +    constexpr _Fp __lo = numeric_limits<_Fp>::min()*2; +    constexpr _Fp __hi = numeric_limits<_Fp>::max()/2; +    return __fp_abs(__a) <= __hi && __fp_abs(__b) <= __hi ?  // typical case: overflow is impossible +      (__a + __b)/2 :                                        // always correctly rounded +      __fp_abs(__a) < __lo ? __a + __b/2 :                   // not safe to halve a +      __fp_abs(__b) < __lo ? __a/2 + __b :                   // not safe to halve b +      __a/2 + __b/2;                                         // otherwise correctly rounded +} + +#endif // _LIBCPP_STD_VER > 17 + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___NUMERIC_MIDPOINT_H diff --git a/libcxx/include/__numeric/partial_sum.h b/libcxx/include/__numeric/partial_sum.h new file mode 100644 index 000000000000..9acee3afc2b0 --- /dev/null +++ b/libcxx/include/__numeric/partial_sum.h @@ -0,0 +1,70 @@ +// -*- 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___NUMERIC_PARTIAL_SUM_H +#define _LIBCPP___NUMERIC_PARTIAL_SUM_H + +#include <__config> +#include <__iterator/iterator_traits.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _InputIterator, class _OutputIterator> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_OutputIterator +partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) +{ +    if (__first != __last) +    { +        typename iterator_traits<_InputIterator>::value_type __t(*__first); +        *__result = __t; +        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) +        { +#if _LIBCPP_STD_VER > 17 +            __t = _VSTD::move(__t) + *__first; +#else +            __t = __t + *__first; +#endif +            *__result = __t; +        } +    } +    return __result; +} + +template <class _InputIterator, class _OutputIterator, class _BinaryOperation> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_OutputIterator +partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, +              _BinaryOperation __binary_op) +{ +    if (__first != __last) +    { +        typename iterator_traits<_InputIterator>::value_type __t(*__first); +        *__result = __t; +        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) +        { +#if _LIBCPP_STD_VER > 17 +            __t = __binary_op(_VSTD::move(__t), *__first); +#else +            __t = __binary_op(__t, *__first); +#endif +            *__result = __t; +        } +    } +    return __result; +} + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_PARTIAL_SUM_H diff --git a/libcxx/include/__numeric/reduce.h b/libcxx/include/__numeric/reduce.h new file mode 100644 index 000000000000..90e4d238d868 --- /dev/null +++ b/libcxx/include/__numeric/reduce.h @@ -0,0 +1,47 @@ +// -*- 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___NUMERIC_REDUCE_H +#define _LIBCPP___NUMERIC_REDUCE_H + +#include <__config> +#include <__functional/operations.h> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 +template <class _InputIterator, class _Tp, class _BinaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _Tp reduce(_InputIterator __first, _InputIterator __last, +                                                                   _Tp __init, _BinaryOp __b) { +  for (; __first != __last; ++__first) +    __init = __b(__init, *__first); +  return __init; +} + +template <class _InputIterator, class _Tp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _Tp reduce(_InputIterator __first, _InputIterator __last, +                                                                   _Tp __init) { +  return _VSTD::reduce(__first, __last, __init, _VSTD::plus<>()); +} + +template <class _InputIterator> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 typename iterator_traits<_InputIterator>::value_type +reduce(_InputIterator __first, _InputIterator __last) { +  return _VSTD::reduce(__first, __last, typename iterator_traits<_InputIterator>::value_type{}); +} +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_REDUCE_H diff --git a/libcxx/include/__numeric/transform_exclusive_scan.h b/libcxx/include/__numeric/transform_exclusive_scan.h new file mode 100644 index 000000000000..45b3077f6649 --- /dev/null +++ b/libcxx/include/__numeric/transform_exclusive_scan.h @@ -0,0 +1,49 @@ +// -*- 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___NUMERIC_TRANSFORM_EXCLUSIVE_SCAN_H +#define _LIBCPP___NUMERIC_TRANSFORM_EXCLUSIVE_SCAN_H + +#include <__config> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template <class _InputIterator, class _OutputIterator, class _Tp, +          class _BinaryOp, class _UnaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_OutputIterator +transform_exclusive_scan(_InputIterator __first, _InputIterator __last, +                           _OutputIterator __result, _Tp __init, +                           _BinaryOp __b, _UnaryOp __u) +{ +    if (__first != __last) +    { +        _Tp __saved = __init; +        do +        { +            __init = __b(__init, __u(*__first)); +            *__result = __saved; +            __saved = __init; +            ++__result; +        } while (++__first != __last); +    } +    return __result; +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_TRANSFORM_EXCLUSIVE_SCAN_H diff --git a/libcxx/include/__numeric/transform_inclusive_scan.h b/libcxx/include/__numeric/transform_inclusive_scan.h new file mode 100644 index 000000000000..b0d4ab5a88fd --- /dev/null +++ b/libcxx/include/__numeric/transform_inclusive_scan.h @@ -0,0 +1,58 @@ +// -*- 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___NUMERIC_TRANSFORM_INCLUSIVE_SCAN_H +#define _LIBCPP___NUMERIC_TRANSFORM_INCLUSIVE_SCAN_H + +#include <__config> +#include <__iterator/iterator_traits.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 + +template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp, class _UnaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_OutputIterator +transform_inclusive_scan(_InputIterator __first, _InputIterator __last, +                           _OutputIterator __result, _BinaryOp __b, _UnaryOp __u, _Tp __init) +{ +    for (; __first != __last; ++__first, (void) ++__result) { +        __init = __b(__init, __u(*__first)); +        *__result = __init; +        } + +    return __result; +} + +template <class _InputIterator, class _OutputIterator, class _BinaryOp, class _UnaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 +_OutputIterator +transform_inclusive_scan(_InputIterator __first, _InputIterator __last, +                               _OutputIterator __result, _BinaryOp __b, _UnaryOp __u) +{ +    if (__first != __last) { +        typename iterator_traits<_InputIterator>::value_type __init = __u(*__first); +        *__result++ = __init; +        if (++__first != __last) +            return _VSTD::transform_inclusive_scan(__first, __last, __result, __b, __u, __init); +    } + +    return __result; +} + +#endif // _LIBCPP_STD_VER > 14 + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_TRANSFORM_INCLUSIVE_SCAN_H diff --git a/libcxx/include/__numeric/transform_reduce.h b/libcxx/include/__numeric/transform_reduce.h new file mode 100644 index 000000000000..da5a77988c38 --- /dev/null +++ b/libcxx/include/__numeric/transform_reduce.h @@ -0,0 +1,54 @@ +// -*- 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___NUMERIC_TRANSFORM_REDUCE_H +#define _LIBCPP___NUMERIC_TRANSFORM_REDUCE_H + +#include <__config> +#include <__functional/operations.h> +#include <__utility/move.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 14 +template <class _InputIterator, class _Tp, class _BinaryOp, class _UnaryOp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _Tp transform_reduce(_InputIterator __first, +                                                                             _InputIterator __last, _Tp __init, +                                                                             _BinaryOp __b, _UnaryOp __u) { +  for (; __first != __last; ++__first) +    __init = __b(__init, __u(*__first)); +  return __init; +} + +template <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOp1, class _BinaryOp2> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _Tp transform_reduce(_InputIterator1 __first1, +                                                                             _InputIterator1 __last1, +                                                                             _InputIterator2 __first2, _Tp __init, +                                                                             _BinaryOp1 __b1, _BinaryOp2 __b2) { +  for (; __first1 != __last1; ++__first1, (void)++__first2) +    __init = __b1(__init, __b2(*__first1, *__first2)); +  return __init; +} + +template <class _InputIterator1, class _InputIterator2, class _Tp> +_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 _Tp transform_reduce(_InputIterator1 __first1, +                                                                             _InputIterator1 __last1, +                                                                             _InputIterator2 __first2, _Tp __init) { +  return _VSTD::transform_reduce(__first1, __last1, __first2, _VSTD::move(__init), _VSTD::plus<>(), +                                 _VSTD::multiplies<>()); +} +#endif + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___NUMERIC_TRANSFORM_REDUCE_H diff --git a/libcxx/include/__random/bernoulli_distribution.h b/libcxx/include/__random/bernoulli_distribution.h new file mode 100644 index 000000000000..60ae5eae7033 --- /dev/null +++ b/libcxx/include/__random/bernoulli_distribution.h @@ -0,0 +1,143 @@ +//===----------------------------------------------------------------------===// +// +// 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_BERNOULLI_DISTRIBUTION_H +#define _LIBCPP___RANDOM_BERNOULLI_DISTRIBUTION_H + +#include <__config> +#include <__random/uniform_real_distribution.h> +#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 + +class _LIBCPP_TEMPLATE_VIS bernoulli_distribution +{ +public: +    // types +    typedef bool result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        double __p_; +    public: +        typedef bernoulli_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(double __p = 0.5) : __p_(__p) {} + +        _LIBCPP_INLINE_VISIBILITY +        double p() const {return __p_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__p_ == __y.__p_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    bernoulli_distribution() : bernoulli_distribution(0.5) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit bernoulli_distribution(double __p) : __p_(param_type(__p)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit bernoulli_distribution(double __p = 0.5) : __p_(param_type(__p)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    double p() const {return __p_.p();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return false;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return true;} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const bernoulli_distribution& __x, +                        const bernoulli_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const bernoulli_distribution& __x, +                        const bernoulli_distribution& __y) +        {return !(__x == __y);} +}; + +template<class _URNG> +inline +bernoulli_distribution::result_type +bernoulli_distribution::operator()(_URNG& __g, const param_type& __p) +{ +    uniform_real_distribution<double> __gen; +    return __gen(__g) < __p.p(); +} + +template <class _CharT, class _Traits> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    return __os << __x.p(); +} + +template <class _CharT, class _Traits> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x) +{ +    typedef bernoulli_distribution _Eng; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    double __p; +    __is >> __p; +    if (!__is.fail()) +        __x.param(param_type(__p)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_BERNOULLI_DISTRIBUTION_H diff --git a/libcxx/include/__random/binomial_distribution.h b/libcxx/include/__random/binomial_distribution.h new file mode 100644 index 000000000000..9662de8befd9 --- /dev/null +++ b/libcxx/include/__random/binomial_distribution.h @@ -0,0 +1,225 @@ +//===----------------------------------------------------------------------===// +// +// 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_BINOMIAL_DISTRIBUTION_H +#define _LIBCPP___RANDOM_BINOMIAL_DISTRIBUTION_H + +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <cmath> +#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 + +template<class _IntType = int> +class _LIBCPP_TEMPLATE_VIS binomial_distribution +{ +public: +    // types +    typedef _IntType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __t_; +        double __p_; +        double __pr_; +        double __odds_ratio_; +        result_type __r0_; +    public: +        typedef binomial_distribution distribution_type; + +        explicit param_type(result_type __t = 1, double __p = 0.5); + +        _LIBCPP_INLINE_VISIBILITY +        result_type t() const {return __t_;} +        _LIBCPP_INLINE_VISIBILITY +        double p() const {return __p_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} + +        friend class binomial_distribution; +    }; + +private: +    param_type __p_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    binomial_distribution() : binomial_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit binomial_distribution(result_type __t, double __p = 0.5) +        : __p_(param_type(__t, __p)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit binomial_distribution(result_type __t = 1, double __p = 0.5) +        : __p_(param_type(__t, __p)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit binomial_distribution(const param_type& __p) : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type t() const {return __p_.t();} +    _LIBCPP_INLINE_VISIBILITY +    double p() const {return __p_.p();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return t();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const binomial_distribution& __x, +                        const binomial_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const binomial_distribution& __x, +                        const binomial_distribution& __y) +        {return !(__x == __y);} +}; + +#ifndef _LIBCPP_MSVCRT_LIKE +extern "C" double lgamma_r(double, int *); +#endif + +inline _LIBCPP_INLINE_VISIBILITY double __libcpp_lgamma(double __d) { +#if defined(_LIBCPP_MSVCRT_LIKE) +  return lgamma(__d); +#else +  int __sign; +  return lgamma_r(__d, &__sign); +#endif +} + +template<class _IntType> +binomial_distribution<_IntType>::param_type::param_type(result_type __t, double __p) +    : __t_(__t), __p_(__p) +{ +    if (0 < __p_ && __p_ < 1) +    { +        __r0_ = static_cast<result_type>((__t_ + 1) * __p_); +        __pr_ = _VSTD::exp(__libcpp_lgamma(__t_ + 1.) - +                           __libcpp_lgamma(__r0_ + 1.) - +                           __libcpp_lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) + +                           (__t_ - __r0_) * _VSTD::log(1 - __p_)); +        __odds_ratio_ = __p_ / (1 - __p_); +    } +} + +// Reference: Kemp, C.D. (1986). `A modal method for generating binomial +//           variables', Commun. Statist. - Theor. Meth. 15(3), 805-813. +template<class _IntType> +template<class _URNG> +_IntType +binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr) +{ +    if (__pr.__t_ == 0 || __pr.__p_ == 0) +        return 0; +    if (__pr.__p_ == 1) +        return __pr.__t_; +    uniform_real_distribution<double> __gen; +    double __u = __gen(__g) - __pr.__pr_; +    if (__u < 0) +        return __pr.__r0_; +    double __pu = __pr.__pr_; +    double __pd = __pu; +    result_type __ru = __pr.__r0_; +    result_type __rd = __ru; +    while (true) +    { +        bool __break = true; +        if (__rd >= 1) +        { +            __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1)); +            __u -= __pd; +            __break = false; +            if (__u < 0) +                return __rd - 1; +        } +        if ( __rd != 0 ) +            --__rd; +        ++__ru; +        if (__ru <= __pr.__t_) +        { +            __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru; +            __u -= __pu; +            __break = false; +            if (__u < 0) +                return __ru; +        } +        if (__break) +            return 0; +    } +} + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const binomial_distribution<_IntType>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    return __os << __x.t() << __sp << __x.p(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           binomial_distribution<_IntType>& __x) +{ +    typedef binomial_distribution<_IntType> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __t; +    double __p; +    __is >> __t >> __p; +    if (!__is.fail()) +        __x.param(param_type(__t, __p)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_BINOMIAL_DISTRIBUTION_H diff --git a/libcxx/include/__random/cauchy_distribution.h b/libcxx/include/__random/cauchy_distribution.h new file mode 100644 index 000000000000..6661e00bf939 --- /dev/null +++ b/libcxx/include/__random/cauchy_distribution.h @@ -0,0 +1,162 @@ +//===----------------------------------------------------------------------===// +// +// 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_CAUCHY_DISTRIBUTION_H +#define _LIBCPP___RANDOM_CAUCHY_DISTRIBUTION_H + +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS cauchy_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __a_; +        result_type __b_; +    public: +        typedef cauchy_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __a = 0, result_type __b = 1) +            : __a_(__a), __b_(__b) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type a() const {return __a_;} +        _LIBCPP_INLINE_VISIBILITY +        result_type b() const {return __b_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    cauchy_distribution() : cauchy_distribution(0) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit cauchy_distribution(result_type __a, result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit cauchy_distribution(result_type __a = 0, result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit cauchy_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type a() const {return __p_.a();} +    _LIBCPP_INLINE_VISIBILITY +    result_type b() const {return __p_.b();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return -numeric_limits<result_type>::infinity();} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const cauchy_distribution& __x, +                        const cauchy_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const cauchy_distribution& __x, +                        const cauchy_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +inline +_RealType +cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    uniform_real_distribution<result_type> __gen; +    // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite +    return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g)); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const cauchy_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.a() << __sp << __x.b(); +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           cauchy_distribution<_RT>& __x) +{ +    typedef cauchy_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __a; +    result_type __b; +    __is >> __a >> __b; +    if (!__is.fail()) +        __x.param(param_type(__a, __b)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_CAUCHY_DISTRIBUTION_H diff --git a/libcxx/include/__random/chi_squared_distribution.h b/libcxx/include/__random/chi_squared_distribution.h new file mode 100644 index 000000000000..9cf38971bdde --- /dev/null +++ b/libcxx/include/__random/chi_squared_distribution.h @@ -0,0 +1,144 @@ +//===----------------------------------------------------------------------===// +// +// 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_CHI_SQUARED_DISTRIBUTION_H +#define _LIBCPP___RANDOM_CHI_SQUARED_DISTRIBUTION_H + +#include <__config> +#include <__random/gamma_distribution.h> +#include <limits> +#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 + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS chi_squared_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __n_; +    public: +        typedef chi_squared_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __n = 1) : __n_(__n) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type n() const {return __n_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__n_ == __y.__n_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    chi_squared_distribution() : chi_squared_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit chi_squared_distribution(result_type __n) +        : __p_(param_type(__n)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit chi_squared_distribution(result_type __n = 1) +        : __p_(param_type(__n)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit chi_squared_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g, const param_type& __p) +        {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);} + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type n() const {return __p_.n();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const chi_squared_distribution& __x, +                        const chi_squared_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const chi_squared_distribution& __x, +                        const chi_squared_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const chi_squared_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    __os << __x.n(); +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           chi_squared_distribution<_RT>& __x) +{ +    typedef chi_squared_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __n; +    __is >> __n; +    if (!__is.fail()) +        __x.param(param_type(__n)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_CHI_SQUARED_DISTRIBUTION_H diff --git a/libcxx/include/__random/default_random_engine.h b/libcxx/include/__random/default_random_engine.h new file mode 100644 index 000000000000..61c5cf9c7142 --- /dev/null +++ b/libcxx/include/__random/default_random_engine.h @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// 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_DEFAULT_RANDOM_ENGINE_H +#define _LIBCPP___RANDOM_DEFAULT_RANDOM_ENGINE_H + +#include <__config> +#include <__random/linear_congruential_engine.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +typedef minstd_rand default_random_engine; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___RANDOM_DEFAULT_RANDOM_ENGINE_H diff --git a/libcxx/include/__random/discard_block_engine.h b/libcxx/include/__random/discard_block_engine.h new file mode 100644 index 000000000000..335715211884 --- /dev/null +++ b/libcxx/include/__random/discard_block_engine.h @@ -0,0 +1,203 @@ +//===----------------------------------------------------------------------===// +// +// 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_DISCARD_BLOCK_ENGINE_H +#define _LIBCPP___RANDOM_DISCARD_BLOCK_ENGINE_H + +#include <__config> +#include <__random/is_seed_sequence.h> +#include <__utility/move.h> +#include <climits> +#include <iosfwd> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _Engine, size_t __p, size_t __r> +class _LIBCPP_TEMPLATE_VIS discard_block_engine +{ +    _Engine __e_; +    int     __n_; + +    static_assert(  0 <  __r, "discard_block_engine invalid parameters"); +    static_assert(__r <= __p, "discard_block_engine invalid parameters"); +    static_assert(__r <= INT_MAX, "discard_block_engine invalid parameters"); +public: +    // types +    typedef typename _Engine::result_type result_type; + +    // engine characteristics +    static _LIBCPP_CONSTEXPR const size_t block_size = __p; +    static _LIBCPP_CONSTEXPR const size_t used_block = __r; + +#ifdef _LIBCPP_CXX03_LANG +    static const result_type _Min = _Engine::_Min; +    static const result_type _Max = _Engine::_Max; +#else +    static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); +    static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); +#endif + +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); } +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); } + +    // constructors and seeding functions +    _LIBCPP_INLINE_VISIBILITY +    discard_block_engine() : __n_(0) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit discard_block_engine(const _Engine& __e) +        : __e_(__e), __n_(0) {} +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    explicit discard_block_engine(_Engine&& __e) +        : __e_(_VSTD::move(__e)), __n_(0) {} +#endif // _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        explicit discard_block_engine(_Sseq& __q, +        typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value && +                           !is_convertible<_Sseq, _Engine>::value>::type* = 0) +        : __e_(__q), __n_(0) {} +    _LIBCPP_INLINE_VISIBILITY +    void seed() {__e_.seed(); __n_ = 0;} +    _LIBCPP_INLINE_VISIBILITY +    void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            __is_seed_sequence<_Sseq, discard_block_engine>::value, +            void +        >::type +        seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;} + +    // generating functions +    result_type operator()(); +    _LIBCPP_INLINE_VISIBILITY +    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    const _Engine& base() const _NOEXCEPT {return __e_;} + +    template<class _Eng, size_t _Pp, size_t _Rp> +    friend +    bool +    operator==( +        const discard_block_engine<_Eng, _Pp, _Rp>& __x, +        const discard_block_engine<_Eng, _Pp, _Rp>& __y); + +    template<class _Eng, size_t _Pp, size_t _Rp> +    friend +    bool +    operator!=( +        const discard_block_engine<_Eng, _Pp, _Rp>& __x, +        const discard_block_engine<_Eng, _Pp, _Rp>& __y); + +    template <class _CharT, class _Traits, +              class _Eng, size_t _Pp, size_t _Rp> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const discard_block_engine<_Eng, _Pp, _Rp>& __x); + +    template <class _CharT, class _Traits, +              class _Eng, size_t _Pp, size_t _Rp> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               discard_block_engine<_Eng, _Pp, _Rp>& __x); +}; + +template<class _Engine, size_t __p, size_t __r> +    _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size; + +template<class _Engine, size_t __p, size_t __r> +    _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block; + +template<class _Engine, size_t __p, size_t __r> +typename discard_block_engine<_Engine, __p, __r>::result_type +discard_block_engine<_Engine, __p, __r>::operator()() +{ +    if (__n_ >= static_cast<int>(__r)) +    { +        __e_.discard(__p - __r); +        __n_ = 0; +    } +    ++__n_; +    return __e_(); +} + +template<class _Eng, size_t _Pp, size_t _Rp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, +           const discard_block_engine<_Eng, _Pp, _Rp>& __y) +{ +    return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_; +} + +template<class _Eng, size_t _Pp, size_t _Rp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, +           const discard_block_engine<_Eng, _Pp, _Rp>& __y) +{ +    return !(__x == __y); +} + +template <class _CharT, class _Traits, +          class _Eng, size_t _Pp, size_t _Rp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const discard_block_engine<_Eng, _Pp, _Rp>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _Ostream; +    __os.flags(_Ostream::dec | _Ostream::left); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    return __os << __x.__e_ << __sp << __x.__n_; +} + +template <class _CharT, class _Traits, +          class _Eng, size_t _Pp, size_t _Rp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           discard_block_engine<_Eng, _Pp, _Rp>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    _Eng __e; +    int __n; +    __is >> __e >> __n; +    if (!__is.fail()) +    { +        __x.__e_ = __e; +        __x.__n_ = __n; +    } +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_DISCARD_BLOCK_ENGINE_H diff --git a/libcxx/include/__random/discrete_distribution.h b/libcxx/include/__random/discrete_distribution.h new file mode 100644 index 000000000000..dc9881a92c38 --- /dev/null +++ b/libcxx/include/__random/discrete_distribution.h @@ -0,0 +1,260 @@ +//===----------------------------------------------------------------------===// +// +// 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_DISCRETE_DISTRIBUTION_H +#define _LIBCPP___RANDOM_DISCRETE_DISTRIBUTION_H + +#include <__algorithm/upper_bound.h> +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <cstddef> +#include <iosfwd> +#include <numeric> +#include <vector> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _IntType = int> +class _LIBCPP_TEMPLATE_VIS discrete_distribution +{ +public: +    // types +    typedef _IntType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        vector<double> __p_; +    public: +        typedef discrete_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        param_type() {} +        template<class _InputIterator> +            _LIBCPP_INLINE_VISIBILITY +            param_type(_InputIterator __f, _InputIterator __l) +            : __p_(__f, __l) {__init();} +#ifndef _LIBCPP_CXX03_LANG +        _LIBCPP_INLINE_VISIBILITY +        param_type(initializer_list<double> __wl) +            : __p_(__wl.begin(), __wl.end()) {__init();} +#endif // _LIBCPP_CXX03_LANG +        template<class _UnaryOperation> +            param_type(size_t __nw, double __xmin, double __xmax, +                       _UnaryOperation __fw); + +        vector<double> probabilities() const; + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__p_ == __y.__p_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} + +    private: +        void __init(); + +        friend class discrete_distribution; + +        template <class _CharT, class _Traits, class _IT> +        friend +        basic_ostream<_CharT, _Traits>& +        operator<<(basic_ostream<_CharT, _Traits>& __os, +                   const discrete_distribution<_IT>& __x); + +        template <class _CharT, class _Traits, class _IT> +        friend +        basic_istream<_CharT, _Traits>& +        operator>>(basic_istream<_CharT, _Traits>& __is, +                   discrete_distribution<_IT>& __x); +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +    _LIBCPP_INLINE_VISIBILITY +    discrete_distribution() {} +    template<class _InputIterator> +        _LIBCPP_INLINE_VISIBILITY +        discrete_distribution(_InputIterator __f, _InputIterator __l) +            : __p_(__f, __l) {} +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    discrete_distribution(initializer_list<double> __wl) +        : __p_(__wl) {} +#endif // _LIBCPP_CXX03_LANG +    template<class _UnaryOperation> +        _LIBCPP_INLINE_VISIBILITY +        discrete_distribution(size_t __nw, double __xmin, double __xmax, +                              _UnaryOperation __fw) +        : __p_(__nw, __xmin, __xmax, __fw) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit discrete_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    vector<double> probabilities() const {return __p_.probabilities();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return __p_.__p_.size();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const discrete_distribution& __x, +                        const discrete_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const discrete_distribution& __x, +                        const discrete_distribution& __y) +        {return !(__x == __y);} + +    template <class _CharT, class _Traits, class _IT> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const discrete_distribution<_IT>& __x); + +    template <class _CharT, class _Traits, class _IT> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               discrete_distribution<_IT>& __x); +}; + +template<class _IntType> +template<class _UnaryOperation> +discrete_distribution<_IntType>::param_type::param_type(size_t __nw, +                                                        double __xmin, +                                                        double __xmax, +                                                        _UnaryOperation __fw) +{ +    if (__nw > 1) +    { +        __p_.reserve(__nw - 1); +        double __d = (__xmax - __xmin) / __nw; +        double __d2 = __d / 2; +        for (size_t __k = 0; __k < __nw; ++__k) +            __p_.push_back(__fw(__xmin + __k * __d + __d2)); +        __init(); +    } +} + +template<class _IntType> +void +discrete_distribution<_IntType>::param_type::__init() +{ +    if (!__p_.empty()) +    { +        if (__p_.size() > 1) +        { +            double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0); +            for (vector<double>::iterator __i = __p_.begin(), __e = __p_.end(); __i < __e; ++__i) +                *__i /= __s; +            vector<double> __t(__p_.size() - 1); +            _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin()); +            swap(__p_, __t); +        } +        else +        { +            __p_.clear(); +            __p_.shrink_to_fit(); +        } +    } +} + +template<class _IntType> +vector<double> +discrete_distribution<_IntType>::param_type::probabilities() const +{ +    size_t __n = __p_.size(); +    vector<double> __p(__n+1); +    _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin()); +    if (__n > 0) +        __p[__n] = 1 - __p_[__n-1]; +    else +        __p[0] = 1; +    return __p; +} + +template<class _IntType> +template<class _URNG> +_IntType +discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p) +{ +    uniform_real_distribution<double> __gen; +    return static_cast<_IntType>( +           _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) - +                                                              __p.__p_.begin()); +} + +template <class _CharT, class _Traits, class _IT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const discrete_distribution<_IT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    size_t __n = __x.__p_.__p_.size(); +    __os << __n; +    for (size_t __i = 0; __i < __n; ++__i) +        __os << __sp << __x.__p_.__p_[__i]; +    return __os; +} + +template <class _CharT, class _Traits, class _IT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           discrete_distribution<_IT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    size_t __n; +    __is >> __n; +    vector<double> __p(__n); +    for (size_t __i = 0; __i < __n; ++__i) +        __is >> __p[__i]; +    if (!__is.fail()) +        swap(__x.__p_.__p_, __p); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_DISCRETE_DISTRIBUTION_H diff --git a/libcxx/include/__random/exponential_distribution.h b/libcxx/include/__random/exponential_distribution.h new file mode 100644 index 000000000000..9e555f0c1075 --- /dev/null +++ b/libcxx/include/__random/exponential_distribution.h @@ -0,0 +1,155 @@ +//===----------------------------------------------------------------------===// +// +// 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_EXPONENTIAL_DISTRIBUTION_H +#define _LIBCPP___RANDOM_EXPONENTIAL_DISTRIBUTION_H + +#include <__config> +#include <__random/generate_canonical.h> +#include <__random/uniform_real_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS exponential_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __lambda_; +    public: +        typedef exponential_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type lambda() const {return __lambda_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__lambda_ == __y.__lambda_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    exponential_distribution() : exponential_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit exponential_distribution(result_type __lambda) +        : __p_(param_type(__lambda)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit exponential_distribution(result_type __lambda = 1) +        : __p_(param_type(__lambda)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit exponential_distribution(const param_type& __p) : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type lambda() const {return __p_.lambda();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const exponential_distribution& __x, +                        const exponential_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const exponential_distribution& __x, +                        const exponential_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    return -_VSTD::log +                  ( +                      result_type(1) - +                      _VSTD::generate_canonical<result_type, +                                       numeric_limits<result_type>::digits>(__g) +                  ) +                  / __p.lambda(); +} + +template <class _CharT, class _Traits, class _RealType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const exponential_distribution<_RealType>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    return __os << __x.lambda(); +} + +template <class _CharT, class _Traits, class _RealType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           exponential_distribution<_RealType>& __x) +{ +    typedef exponential_distribution<_RealType> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __lambda; +    __is >> __lambda; +    if (!__is.fail()) +        __x.param(param_type(__lambda)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_EXPONENTIAL_DISTRIBUTION_H diff --git a/libcxx/include/__random/extreme_value_distribution.h b/libcxx/include/__random/extreme_value_distribution.h new file mode 100644 index 000000000000..0e200f91d7ff --- /dev/null +++ b/libcxx/include/__random/extreme_value_distribution.h @@ -0,0 +1,161 @@ +//===----------------------------------------------------------------------===// +// +// 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_EXTREME_VALUE_DISTRIBUTION_H +#define _LIBCPP___RANDOM_EXTREME_VALUE_DISTRIBUTION_H + +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS extreme_value_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __a_; +        result_type __b_; +    public: +        typedef extreme_value_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __a = 0, result_type __b = 1) +            : __a_(__a), __b_(__b) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type a() const {return __a_;} +        _LIBCPP_INLINE_VISIBILITY +        result_type b() const {return __b_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    extreme_value_distribution() : extreme_value_distribution(0) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit extreme_value_distribution(result_type __a, result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit extreme_value_distribution(result_type __a = 0, +                                        result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit extreme_value_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type a() const {return __p_.a();} +    _LIBCPP_INLINE_VISIBILITY +    result_type b() const {return __p_.b();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return -numeric_limits<result_type>::infinity();} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const extreme_value_distribution& __x, +                        const extreme_value_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const extreme_value_distribution& __x, +                        const extreme_value_distribution& __y) +        {return !(__x == __y);} +}; + +template<class _RealType> +template<class _URNG> +_RealType +extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    return __p.a() - __p.b() * +         _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g))); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const extreme_value_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.a() << __sp << __x.b(); +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           extreme_value_distribution<_RT>& __x) +{ +    typedef extreme_value_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __a; +    result_type __b; +    __is >> __a >> __b; +    if (!__is.fail()) +        __x.param(param_type(__a, __b)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_EXTREME_VALUE_DISTRIBUTION_H diff --git a/libcxx/include/__random/fisher_f_distribution.h b/libcxx/include/__random/fisher_f_distribution.h new file mode 100644 index 000000000000..bf64d33a645a --- /dev/null +++ b/libcxx/include/__random/fisher_f_distribution.h @@ -0,0 +1,160 @@ +//===----------------------------------------------------------------------===// +// +// 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_FISHER_F_DISTRIBUTION_H +#define _LIBCPP___RANDOM_FISHER_F_DISTRIBUTION_H + +#include <__config> +#include <__random/gamma_distribution.h> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS fisher_f_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __m_; +        result_type __n_; +    public: +        typedef fisher_f_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __m = 1, result_type __n = 1) +            : __m_(__m), __n_(__n) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type m() const {return __m_;} +        _LIBCPP_INLINE_VISIBILITY +        result_type n() const {return __n_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    fisher_f_distribution() : fisher_f_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit fisher_f_distribution(result_type __m, result_type __n = 1) +        : __p_(param_type(__m, __n)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1) +        : __p_(param_type(__m, __n)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit fisher_f_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type m() const {return __p_.m();} +    _LIBCPP_INLINE_VISIBILITY +    result_type n() const {return __p_.n();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const fisher_f_distribution& __x, +                        const fisher_f_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const fisher_f_distribution& __x, +                        const fisher_f_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    gamma_distribution<result_type> __gdm(__p.m() * result_type(.5)); +    gamma_distribution<result_type> __gdn(__p.n() * result_type(.5)); +    return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g)); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const fisher_f_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.m() << __sp << __x.n(); +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           fisher_f_distribution<_RT>& __x) +{ +    typedef fisher_f_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __m; +    result_type __n; +    __is >> __m >> __n; +    if (!__is.fail()) +        __x.param(param_type(__m, __n)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_FISHER_F_DISTRIBUTION_H diff --git a/libcxx/include/__random/gamma_distribution.h b/libcxx/include/__random/gamma_distribution.h new file mode 100644 index 000000000000..49d024eafea2 --- /dev/null +++ b/libcxx/include/__random/gamma_distribution.h @@ -0,0 +1,213 @@ +//===----------------------------------------------------------------------===// +// +// 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_GAMMA_DISTRIBUTION_H +#define _LIBCPP___RANDOM_GAMMA_DISTRIBUTION_H + +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <__random/exponential_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS gamma_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __alpha_; +        result_type __beta_; +    public: +        typedef gamma_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __alpha = 1, result_type __beta = 1) +            : __alpha_(__alpha), __beta_(__beta) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type alpha() const {return __alpha_;} +        _LIBCPP_INLINE_VISIBILITY +        result_type beta() const {return __beta_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    gamma_distribution() : gamma_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit gamma_distribution(result_type __alpha, result_type __beta = 1) +        : __p_(param_type(__alpha, __beta)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit gamma_distribution(result_type __alpha = 1, +                                result_type __beta = 1) +        : __p_(param_type(__alpha, __beta)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit gamma_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type alpha() const {return __p_.alpha();} +    _LIBCPP_INLINE_VISIBILITY +    result_type beta() const {return __p_.beta();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const gamma_distribution& __x, +                        const gamma_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const gamma_distribution& __x, +                        const gamma_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    result_type __a = __p.alpha(); +    uniform_real_distribution<result_type> __gen(0, 1); +    exponential_distribution<result_type> __egen; +    result_type __x; +    if (__a == 1) +        __x = __egen(__g); +    else if (__a > 1) +    { +        const result_type __b = __a - 1; +        const result_type __c = 3 * __a - result_type(0.75); +        while (true) +        { +            const result_type __u = __gen(__g); +            const result_type __v = __gen(__g); +            const result_type __w = __u * (1 - __u); +            if (__w != 0) +            { +                const result_type __y = _VSTD::sqrt(__c / __w) * +                                        (__u - result_type(0.5)); +                __x = __b + __y; +                if (__x >= 0) +                { +                    const result_type __z = 64 * __w * __w * __w * __v * __v; +                    if (__z <= 1 - 2 * __y * __y / __x) +                        break; +                    if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y)) +                        break; +                } +            } +        } +    } +    else  // __a < 1 +    { +        while (true) +        { +            const result_type __u = __gen(__g); +            const result_type __es = __egen(__g); +            if (__u <= 1 - __a) +            { +                __x = _VSTD::pow(__u, 1 / __a); +                if (__x <= __es) +                    break; +            } +            else +            { +                const result_type __e = -_VSTD::log((1-__u)/__a); +                __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a); +                if (__x <= __e + __es) +                    break; +            } +        } +    } +    return __x * __p.beta(); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const gamma_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.alpha() << __sp << __x.beta(); +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           gamma_distribution<_RT>& __x) +{ +    typedef gamma_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __alpha; +    result_type __beta; +    __is >> __alpha >> __beta; +    if (!__is.fail()) +        __x.param(param_type(__alpha, __beta)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_GAMMA_DISTRIBUTION_H diff --git a/libcxx/include/__random/generate_canonical.h b/libcxx/include/__random/generate_canonical.h new file mode 100644 index 000000000000..46c3b2980952 --- /dev/null +++ b/libcxx/include/__random/generate_canonical.h @@ -0,0 +1,53 @@ +//===----------------------------------------------------------------------===// +// +// 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_GENERATE_CANONICAL_H +#define _LIBCPP___RANDOM_GENERATE_CANONICAL_H + +#include <__config> +#include <__random/log2.h> +#include <cstdint> +#include <initializer_list> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +// generate_canonical + +template<class _RealType, size_t __bits, class _URNG> +_RealType +generate_canonical(_URNG& __g) +{ +    const size_t _Dt = numeric_limits<_RealType>::digits; +    const size_t __b = _Dt < __bits ? _Dt : __bits; +#ifdef _LIBCPP_CXX03_LANG +    const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value; +#else +    const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value; +#endif +    const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0); +    const _RealType _Rp = static_cast<_RealType>(_URNG::max() - _URNG::min()) + _RealType(1); +    _RealType __base = _Rp; +    _RealType _Sp = __g() - _URNG::min(); +    for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp) +        _Sp += (__g() - _URNG::min()) * __base; +    return _Sp / __base; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_GENERATE_CANONICAL_H diff --git a/libcxx/include/__random/geometric_distribution.h b/libcxx/include/__random/geometric_distribution.h new file mode 100644 index 000000000000..174914eaed2e --- /dev/null +++ b/libcxx/include/__random/geometric_distribution.h @@ -0,0 +1,141 @@ +//===----------------------------------------------------------------------===// +// +// 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_GEOMETRIC_DISTRIBUTION_H +#define _LIBCPP___RANDOM_GEOMETRIC_DISTRIBUTION_H + +#include <__config> +#include <__random/negative_binomial_distribution.h> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _IntType = int> +class _LIBCPP_TEMPLATE_VIS geometric_distribution +{ +public: +    // types +    typedef _IntType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        double __p_; +    public: +        typedef geometric_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(double __p = 0.5) : __p_(__p) {} + +        _LIBCPP_INLINE_VISIBILITY +        double p() const {return __p_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__p_ == __y.__p_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    geometric_distribution() : geometric_distribution(0.5) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit geometric_distribution(double __p) +        : __p_(__p) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit geometric_distribution(double __p = 0.5) +        : __p_(__p) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit geometric_distribution(const param_type& __p) : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g, const param_type& __p) +        {return negative_binomial_distribution<result_type>(1, __p.p())(__g);} + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    double p() const {return __p_.p();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::max();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const geometric_distribution& __x, +                        const geometric_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const geometric_distribution& __x, +                        const geometric_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const geometric_distribution<_IntType>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    return __os << __x.p(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           geometric_distribution<_IntType>& __x) +{ +    typedef geometric_distribution<_IntType> _Eng; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    double __p; +    __is >> __p; +    if (!__is.fail()) +        __x.param(param_type(__p)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_GEOMETRIC_DISTRIBUTION_H diff --git a/libcxx/include/__random/independent_bits_engine.h b/libcxx/include/__random/independent_bits_engine.h new file mode 100644 index 000000000000..f0e8c654246b --- /dev/null +++ b/libcxx/include/__random/independent_bits_engine.h @@ -0,0 +1,271 @@ +//===----------------------------------------------------------------------===// +// +// 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_INDEPENDENT_BITS_ENGINE_H +#define _LIBCPP___RANDOM_INDEPENDENT_BITS_ENGINE_H + +#include <__config> +#include <__random/is_seed_sequence.h> +#include <__random/log2.h> +#include <__utility/move.h> +#include <iosfwd> +#include <limits> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _Engine, size_t __w, class _UIntType> +class _LIBCPP_TEMPLATE_VIS independent_bits_engine +{ +    template <class _UInt, _UInt _R0, size_t _Wp, size_t _Mp> +    class __get_n +    { +        static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UInt>::digits; +        static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); +        static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np; +        static _LIBCPP_CONSTEXPR const _UInt _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; +    public: +        static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; +    }; +public: +    // types +    typedef _UIntType result_type; + +private: +    _Engine __e_; + +    static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; +    static_assert(  0 <  __w, "independent_bits_engine invalid parameters"); +    static_assert(__w <= _Dt, "independent_bits_engine invalid parameters"); + +    typedef typename _Engine::result_type _Engine_result_type; +    typedef typename conditional +        < +            sizeof(_Engine_result_type) <= sizeof(result_type), +                result_type, +                _Engine_result_type +        >::type _Working_result_type; +#ifdef _LIBCPP_CXX03_LANG +    static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min +                                          + _Working_result_type(1); +#else +    static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min() +                                                            + _Working_result_type(1); +#endif +    static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value; +    static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; +    static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n; +    static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n; +    static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits; +    static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits; +    static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 : +                                                               (_Rp >> __w0) << __w0; +    static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : +                                                               (_Rp >> (__w0+1)) << (__w0+1); +    static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ? +                                _Engine_result_type(~0) >> (_EDt - __w0) : +                                _Engine_result_type(0); +    static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? +                                _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) : +                                _Engine_result_type(~0); +public: +    static _LIBCPP_CONSTEXPR const result_type _Min = 0; +    static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : +                                                      (result_type(1) << __w) - result_type(1); +    static_assert(_Min < _Max, "independent_bits_engine invalid parameters"); + +    // engine characteristics +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } + +    // constructors and seeding functions +    _LIBCPP_INLINE_VISIBILITY +    independent_bits_engine() {} +    _LIBCPP_INLINE_VISIBILITY +    explicit independent_bits_engine(const _Engine& __e) +        : __e_(__e) {} +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    explicit independent_bits_engine(_Engine&& __e) +        : __e_(_VSTD::move(__e)) {} +#endif // _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    explicit independent_bits_engine(result_type __sd) : __e_(__sd) {} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        explicit independent_bits_engine(_Sseq& __q, +        typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value && +                           !is_convertible<_Sseq, _Engine>::value>::type* = 0) +         : __e_(__q) {} +    _LIBCPP_INLINE_VISIBILITY +    void seed() {__e_.seed();} +    _LIBCPP_INLINE_VISIBILITY +    void seed(result_type __sd) {__e_.seed(__sd);} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            __is_seed_sequence<_Sseq, independent_bits_engine>::value, +            void +        >::type +        seed(_Sseq& __q) {__e_.seed(__q);} + +    // generating functions +    _LIBCPP_INLINE_VISIBILITY +    result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} +    _LIBCPP_INLINE_VISIBILITY +    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    const _Engine& base() const _NOEXCEPT {return __e_;} + +    template<class _Eng, size_t _Wp, class _UInt> +    friend +    bool +    operator==( +        const independent_bits_engine<_Eng, _Wp, _UInt>& __x, +        const independent_bits_engine<_Eng, _Wp, _UInt>& __y); + +    template<class _Eng, size_t _Wp, class _UInt> +    friend +    bool +    operator!=( +        const independent_bits_engine<_Eng, _Wp, _UInt>& __x, +        const independent_bits_engine<_Eng, _Wp, _UInt>& __y); + +    template <class _CharT, class _Traits, +              class _Eng, size_t _Wp, class _UInt> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const independent_bits_engine<_Eng, _Wp, _UInt>& __x); + +    template <class _CharT, class _Traits, +              class _Eng, size_t _Wp, class _UInt> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               independent_bits_engine<_Eng, _Wp, _UInt>& __x); + +private: +    _LIBCPP_INLINE_VISIBILITY +    result_type __eval(false_type); +    result_type __eval(true_type); + +    template <size_t __count> +        _LIBCPP_INLINE_VISIBILITY +        static +        typename enable_if +        < +            __count < _Dt, +            result_type +        >::type +        __lshift(result_type __x) {return __x << __count;} + +    template <size_t __count> +        _LIBCPP_INLINE_VISIBILITY +        static +        typename enable_if +        < +            (__count >= _Dt), +            result_type +        >::type +        __lshift(result_type) {return result_type(0);} +}; + +template<class _Engine, size_t __w, class _UIntType> +inline +_UIntType +independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type) +{ +    return static_cast<result_type>(__e_() & __mask0); +} + +template<class _Engine, size_t __w, class _UIntType> +_UIntType +independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type) +{ +    result_type _Sp = 0; +    for (size_t __k = 0; __k < __n0; ++__k) +    { +        _Engine_result_type __u; +        do +        { +            __u = __e_() - _Engine::min(); +        } while (__u >= __y0); +        _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0)); +    } +    for (size_t __k = __n0; __k < __n; ++__k) +    { +        _Engine_result_type __u; +        do +        { +            __u = __e_() - _Engine::min(); +        } while (__u >= __y1); +        _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1)); +    } +    return _Sp; +} + +template<class _Eng, size_t _Wp, class _UInt> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator==( +    const independent_bits_engine<_Eng, _Wp, _UInt>& __x, +    const independent_bits_engine<_Eng, _Wp, _UInt>& __y) +{ +    return __x.base() == __y.base(); +} + +template<class _Eng, size_t _Wp, class _UInt> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=( +    const independent_bits_engine<_Eng, _Wp, _UInt>& __x, +    const independent_bits_engine<_Eng, _Wp, _UInt>& __y) +{ +    return !(__x == __y); +} + +template <class _CharT, class _Traits, +          class _Eng, size_t _Wp, class _UInt> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const independent_bits_engine<_Eng, _Wp, _UInt>& __x) +{ +    return __os << __x.base(); +} + +template <class _CharT, class _Traits, +          class _Eng, size_t _Wp, class _UInt> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           independent_bits_engine<_Eng, _Wp, _UInt>& __x) +{ +    _Eng __e; +    __is >> __e; +    if (!__is.fail()) +        __x.__e_ = __e; +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_INDEPENDENT_BITS_ENGINE_H diff --git a/libcxx/include/__random/is_seed_sequence.h b/libcxx/include/__random/is_seed_sequence.h new file mode 100644 index 000000000000..46b1d719ddfb --- /dev/null +++ b/libcxx/include/__random/is_seed_sequence.h @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// 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_IS_SEED_SEQUENCE_H +#define _LIBCPP___RANDOM_IS_SEED_SEQUENCE_H + +#include <__config> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _Sseq, class _Engine> +struct __is_seed_sequence +{ +    static _LIBCPP_CONSTEXPR const bool value = +              !is_convertible<_Sseq, typename _Engine::result_type>::value && +              !is_same<typename remove_cv<_Sseq>::type, _Engine>::value; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___RANDOM_IS_SEED_SEQUENCE_H diff --git a/libcxx/include/__random/knuth_b.h b/libcxx/include/__random/knuth_b.h new file mode 100644 index 000000000000..ade853884dd3 --- /dev/null +++ b/libcxx/include/__random/knuth_b.h @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// 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_KNUTH_B_H +#define _LIBCPP___RANDOM_KNUTH_B_H + +#include <__config> +#include <__random/linear_congruential_engine.h> +#include <__random/shuffle_order_engine.h> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +typedef shuffle_order_engine<minstd_rand0, 256> knuth_b; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___RANDOM_KNUTH_B_H diff --git a/libcxx/include/__random/linear_congruential_engine.h b/libcxx/include/__random/linear_congruential_engine.h new file mode 100644 index 000000000000..64c9f584114c --- /dev/null +++ b/libcxx/include/__random/linear_congruential_engine.h @@ -0,0 +1,398 @@ +//===----------------------------------------------------------------------===// +// +// 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_LINEAR_CONGRUENTIAL_ENGINE_H +#define _LIBCPP___RANDOM_LINEAR_CONGRUENTIAL_ENGINE_H + +#include <__config> +#include <__random/is_seed_sequence.h> +#include <cstdint> +#include <iosfwd> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <unsigned long long __a, unsigned long long __c, +          unsigned long long __m, unsigned long long _Mp, +          bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a), +          bool _OverflowOK = ((__m | (__m-1)) > __m), // m = 2^n +          bool _SchrageOK = (__a != 0 && __m != 0 && __m % __a <= __m / __a)> // r <= q +struct __lce_alg_picker +{ +    static_assert(__a != 0 || __m != 0 || !_MightOverflow || _OverflowOK || _SchrageOK, +                  "The current values of a, c, and m cannot generate a number " +                  "within bounds of linear_congruential_engine."); + +    static _LIBCPP_CONSTEXPR const bool __use_schrage = _MightOverflow && +                                                        !_OverflowOK && +                                                        _SchrageOK; +}; + +template <unsigned long long __a, unsigned long long __c, +          unsigned long long __m, unsigned long long _Mp, +          bool _UseSchrage = __lce_alg_picker<__a, __c, __m, _Mp>::__use_schrage> +struct __lce_ta; + +// 64 + +template <unsigned long long __a, unsigned long long __c, unsigned long long __m> +struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true> +{ +    typedef unsigned long long result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        // Schrage's algorithm +        const result_type __q = __m / __a; +        const result_type __r = __m % __a; +        const result_type __t0 = __a * (__x % __q); +        const result_type __t1 = __r * (__x / __q); +        __x = __t0 + (__t0 < __t1) * __m - __t1; +        __x += __c - (__x >= __m - __c) * __m; +        return __x; +    } +}; + +template <unsigned long long __a, unsigned long long __m> +struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true> +{ +    typedef unsigned long long result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        // Schrage's algorithm +        const result_type __q = __m / __a; +        const result_type __r = __m % __a; +        const result_type __t0 = __a * (__x % __q); +        const result_type __t1 = __r * (__x / __q); +        __x = __t0 + (__t0 < __t1) * __m - __t1; +        return __x; +    } +}; + +template <unsigned long long __a, unsigned long long __c, unsigned long long __m> +struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false> +{ +    typedef unsigned long long result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        return (__a * __x + __c) % __m; +    } +}; + +template <unsigned long long __a, unsigned long long __c> +struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false> +{ +    typedef unsigned long long result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        return __a * __x + __c; +    } +}; + +// 32 + +template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> +struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true> +{ +    typedef unsigned result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        const result_type __a = static_cast<result_type>(_Ap); +        const result_type __c = static_cast<result_type>(_Cp); +        const result_type __m = static_cast<result_type>(_Mp); +        // Schrage's algorithm +        const result_type __q = __m / __a; +        const result_type __r = __m % __a; +        const result_type __t0 = __a * (__x % __q); +        const result_type __t1 = __r * (__x / __q); +        __x = __t0 + (__t0 < __t1) * __m - __t1; +        __x += __c - (__x >= __m - __c) * __m; +        return __x; +    } +}; + +template <unsigned long long _Ap, unsigned long long _Mp> +struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true> +{ +    typedef unsigned result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        const result_type __a = static_cast<result_type>(_Ap); +        const result_type __m = static_cast<result_type>(_Mp); +        // Schrage's algorithm +        const result_type __q = __m / __a; +        const result_type __r = __m % __a; +        const result_type __t0 = __a * (__x % __q); +        const result_type __t1 = __r * (__x / __q); +        __x = __t0 + (__t0 < __t1) * __m - __t1; +        return __x; +    } +}; + +template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> +struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false> +{ +    typedef unsigned result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        const result_type __a = static_cast<result_type>(_Ap); +        const result_type __c = static_cast<result_type>(_Cp); +        const result_type __m = static_cast<result_type>(_Mp); +        return (__a * __x + __c) % __m; +    } +}; + +template <unsigned long long _Ap, unsigned long long _Cp> +struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false> +{ +    typedef unsigned result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        const result_type __a = static_cast<result_type>(_Ap); +        const result_type __c = static_cast<result_type>(_Cp); +        return __a * __x + __c; +    } +}; + +// 16 + +template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b> +struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b> +{ +    typedef unsigned short result_type; +    _LIBCPP_INLINE_VISIBILITY +    static result_type next(result_type __x) +    { +        return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x)); +    } +}; + +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_INLINE_VISIBILITY +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> +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 +{ +public: +    // types +    typedef _UIntType result_type; + +private: +    result_type __x_; + +    static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0); + +    static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters"); +    static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters"); +    static_assert(is_unsigned<_UIntType>::value, "_UIntType must be unsigned type"); +public: +    static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u; +    static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u; +    static_assert(_Min < _Max,           "linear_congruential_engine invalid parameters"); + +    // engine characteristics +    static _LIBCPP_CONSTEXPR const result_type multiplier = __a; +    static _LIBCPP_CONSTEXPR const result_type increment = __c; +    static _LIBCPP_CONSTEXPR const result_type modulus = __m; +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type min() {return _Min;} +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type max() {return _Max;} +    static _LIBCPP_CONSTEXPR const result_type default_seed = 1u; + +    // constructors and seeding functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    linear_congruential_engine() : linear_congruential_engine(default_seed) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit linear_congruential_engine(result_type __s) { seed(__s); } +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit linear_congruential_engine(result_type __s = default_seed) { +      seed(__s); +    } +#endif +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        explicit linear_congruential_engine(_Sseq& __q, +        typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0) +        {seed(__q);} +    _LIBCPP_INLINE_VISIBILITY +    void seed(result_type __s = default_seed) +        {seed(integral_constant<bool, __m == 0>(), +              integral_constant<bool, __c == 0>(), __s);} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            __is_seed_sequence<_Sseq, linear_congruential_engine>::value, +            void +        >::type +        seed(_Sseq& __q) +            {__seed(__q, integral_constant<unsigned, +                1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32 +                             :  (__m > 0x100000000ull))>());} + +    // generating functions +    _LIBCPP_INLINE_VISIBILITY +    result_type operator()() +        {return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));} +    _LIBCPP_INLINE_VISIBILITY +    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + +    friend _LIBCPP_INLINE_VISIBILITY +    bool operator==(const linear_congruential_engine& __x, +                    const linear_congruential_engine& __y) +        {return __x.__x_ == __y.__x_;} +    friend _LIBCPP_INLINE_VISIBILITY +    bool operator!=(const linear_congruential_engine& __x, +                    const linear_congruential_engine& __y) +        {return !(__x == __y);} + +private: + +    _LIBCPP_INLINE_VISIBILITY +    void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;} +    _LIBCPP_INLINE_VISIBILITY +    void seed(true_type, false_type, result_type __s) {__x_ = __s;} +    _LIBCPP_INLINE_VISIBILITY +    void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ? +                                                                 1 : __s % __m;} +    _LIBCPP_INLINE_VISIBILITY +    void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;} + +    template<class _Sseq> +        void __seed(_Sseq& __q, integral_constant<unsigned, 1>); +    template<class _Sseq> +        void __seed(_Sseq& __q, integral_constant<unsigned, 2>); + +    template <class _CharT, class _Traits, +              class _Up, _Up _Ap, _Up _Cp, _Up _Np> +    friend +    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> +    friend +    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> +    _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>) +{ +    const unsigned __k = 1; +    uint32_t __ar[__k+3]; +    __q.generate(__ar, __ar + __k + 3); +    result_type __s = static_cast<result_type>(__ar[3] % __m); +    __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; +} + +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>) +{ +    const unsigned __k = 2; +    uint32_t __ar[__k+3]; +    __q.generate(__ar, __ar + __k + 3); +    result_type __s = static_cast<result_type>((__ar[3] + +                                              ((uint64_t)__ar[4] << 32)) % __m); +    __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; +} + +template <class _CharT, class _Traits, +          class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const linear_congruential_engine<_UIntType, __a, __c, __m>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _Ostream; +    __os.flags(_Ostream::dec | _Ostream::left); +    __os.fill(__os.widen(' ')); +    return __os << __x.__x_; +} + +template <class _CharT, class _Traits, +          class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           linear_congruential_engine<_UIntType, __a, __c, __m>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    _UIntType __t; +    __is >> __t; +    if (!__is.fail()) +        __x.__x_ = __t; +    return __is; +} + +typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> +                                                                   minstd_rand0; +typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> +                                                                    minstd_rand; + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_LINEAR_CONGRUENTIAL_ENGINE_H diff --git a/libcxx/include/__random/log2.h b/libcxx/include/__random/log2.h new file mode 100644 index 000000000000..3d9640c1f787 --- /dev/null +++ b/libcxx/include/__random/log2.h @@ -0,0 +1,74 @@ +//===----------------------------------------------------------------------===// +// +// 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_LOG2_H +#define _LIBCPP___RANDOM_LOG2_H + +#include <__config> +#include <cstddef> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _UIntType, _UIntType _Xp, size_t _Rp> +struct __log2_imp; + +template <unsigned long long _Xp, size_t _Rp> +struct __log2_imp<unsigned long long, _Xp, _Rp> +{ +    static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp +                                           : __log2_imp<unsigned long long, _Xp, _Rp - 1>::value; +}; + +template <unsigned long long _Xp> +struct __log2_imp<unsigned long long, _Xp, 0> +{ +    static const size_t value = 0; +}; + +template <size_t _Rp> +struct __log2_imp<unsigned long long, 0, _Rp> +{ +    static const size_t value = _Rp + 1; +}; + +#ifndef _LIBCPP_HAS_NO_INT128 + +template <__uint128_t _Xp, size_t _Rp> +struct __log2_imp<__uint128_t, _Xp, _Rp> +{ +    static const size_t value = (_Xp >> 64) +        ? (64 + __log2_imp<unsigned long long, (_Xp >> 64), 63>::value) +        : __log2_imp<unsigned long long, _Xp, 63>::value; +}; + +#endif // _LIBCPP_HAS_NO_INT128 + +template <class _UIntType, _UIntType _Xp> +struct __log2 +{ +    static const size_t value = __log2_imp< +#ifndef _LIBCPP_HAS_NO_INT128 +        typename conditional< +                sizeof(_UIntType) <= sizeof(unsigned long long), +                    unsigned long long, +                    __uint128_t +            >::type, +#else +        unsigned long long, +#endif // _LIBCPP_HAS_NO_INT128 +        _Xp, sizeof(_UIntType) * __CHAR_BIT__ - 1>::value; +}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___RANDOM_LOG2_H diff --git a/libcxx/include/__random/lognormal_distribution.h b/libcxx/include/__random/lognormal_distribution.h new file mode 100644 index 000000000000..752861c3de0c --- /dev/null +++ b/libcxx/include/__random/lognormal_distribution.h @@ -0,0 +1,163 @@ +//===----------------------------------------------------------------------===// +// +// 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_LOGNORMAL_DISTRIBUTION_H +#define _LIBCPP___RANDOM_LOGNORMAL_DISTRIBUTION_H + +#include <__config> +#include <__random/normal_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS lognormal_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        normal_distribution<result_type> __nd_; +    public: +        typedef lognormal_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __m = 0, result_type __s = 1) +            : __nd_(__m, __s) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type m() const {return __nd_.mean();} +        _LIBCPP_INLINE_VISIBILITY +        result_type s() const {return __nd_.stddev();} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__nd_ == __y.__nd_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +        friend class lognormal_distribution; + +        template <class _CharT, class _Traits, class _RT> +        friend +        basic_ostream<_CharT, _Traits>& +        operator<<(basic_ostream<_CharT, _Traits>& __os, +                   const lognormal_distribution<_RT>& __x); + +        template <class _CharT, class _Traits, class _RT> +        friend +        basic_istream<_CharT, _Traits>& +        operator>>(basic_istream<_CharT, _Traits>& __is, +                   lognormal_distribution<_RT>& __x); +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    lognormal_distribution() : lognormal_distribution(0) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit lognormal_distribution(result_type __m, result_type __s = 1) +        : __p_(param_type(__m, __s)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit lognormal_distribution(result_type __m = 0, +                                    result_type __s = 1) +        : __p_(param_type(__m, __s)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit lognormal_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {__p_.__nd_.reset();} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g, const param_type& __p) +        {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));} + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type m() const {return __p_.m();} +    _LIBCPP_INLINE_VISIBILITY +    result_type s() const {return __p_.s();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const lognormal_distribution& __x, +                        const lognormal_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const lognormal_distribution& __x, +                        const lognormal_distribution& __y) +        {return !(__x == __y);} + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const lognormal_distribution<_RT>& __x); + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               lognormal_distribution<_RT>& __x); +}; + +template <class _CharT, class _Traits, class _RT> +inline _LIBCPP_INLINE_VISIBILITY +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const lognormal_distribution<_RT>& __x) +{ +    return __os << __x.__p_.__nd_; +} + +template <class _CharT, class _Traits, class _RT> +inline _LIBCPP_INLINE_VISIBILITY +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           lognormal_distribution<_RT>& __x) +{ +    return __is >> __x.__p_.__nd_; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_LOGNORMAL_DISTRIBUTION_H diff --git a/libcxx/include/__random/mersenne_twister_engine.h b/libcxx/include/__random/mersenne_twister_engine.h new file mode 100644 index 000000000000..121ffae37ec0 --- /dev/null +++ b/libcxx/include/__random/mersenne_twister_engine.h @@ -0,0 +1,534 @@ +//===----------------------------------------------------------------------===// +// +// 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_MERSENNE_TWISTER_ENGINE_H +#define _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H + +#include <__algorithm/equal.h> +#include <__algorithm/min.h> +#include <__config> +#include <__random/is_seed_sequence.h> +#include <cstddef> +#include <cstdint> +#include <iosfwd> +#include <limits> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine; + +template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +bool +operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, +           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + +template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +_LIBCPP_INLINE_VISIBILITY +bool +operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, +           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x); + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                   _Bp, _Tp, _Cp, _Lp, _Fp>& __x); + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine +{ +public: +    // types +    typedef _UIntType result_type; + +private: +    result_type __x_[__n]; +    size_t      __i_; + +    static_assert(  0 <  __m, "mersenne_twister_engine invalid parameters"); +    static_assert(__m <= __n, "mersenne_twister_engine invalid parameters"); +    static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; +    static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters"); +    static_assert(  2 <= __w, "mersenne_twister_engine invalid parameters"); +    static_assert(__r <= __w, "mersenne_twister_engine invalid parameters"); +    static_assert(__u <= __w, "mersenne_twister_engine invalid parameters"); +    static_assert(__s <= __w, "mersenne_twister_engine invalid parameters"); +    static_assert(__t <= __w, "mersenne_twister_engine invalid parameters"); +    static_assert(__l <= __w, "mersenne_twister_engine invalid parameters"); +public: +    static _LIBCPP_CONSTEXPR const result_type _Min = 0; +    static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : +                                                      (result_type(1) << __w) - result_type(1); +    static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters"); +    static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters"); +    static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters"); +    static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters"); +    static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters"); +    static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters"); + +    // engine characteristics +    static _LIBCPP_CONSTEXPR const size_t word_size = __w; +    static _LIBCPP_CONSTEXPR const size_t state_size = __n; +    static _LIBCPP_CONSTEXPR const size_t shift_size = __m; +    static _LIBCPP_CONSTEXPR const size_t mask_bits = __r; +    static _LIBCPP_CONSTEXPR const result_type xor_mask = __a; +    static _LIBCPP_CONSTEXPR const size_t tempering_u = __u; +    static _LIBCPP_CONSTEXPR const result_type tempering_d = __d; +    static _LIBCPP_CONSTEXPR const size_t tempering_s = __s; +    static _LIBCPP_CONSTEXPR const result_type tempering_b = __b; +    static _LIBCPP_CONSTEXPR const size_t tempering_t = __t; +    static _LIBCPP_CONSTEXPR const result_type tempering_c = __c; +    static _LIBCPP_CONSTEXPR const size_t tempering_l = __l; +    static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f; +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } +    static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u; + +    // constructors and seeding functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    mersenne_twister_engine() : mersenne_twister_engine(default_seed) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit mersenne_twister_engine(result_type __sd) { seed(__sd); } +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit mersenne_twister_engine(result_type __sd = default_seed) { +      seed(__sd); +    } +#endif +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        explicit mersenne_twister_engine(_Sseq& __q, +        typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0) +        {seed(__q);} +    void seed(result_type __sd = default_seed); +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            __is_seed_sequence<_Sseq, mersenne_twister_engine>::value, +            void +        >::type +        seed(_Sseq& __q) +            {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} + +    // generating functions +    result_type operator()(); +    _LIBCPP_INLINE_VISIBILITY +    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + +    template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +    friend +    bool +    operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __x, +               const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + +    template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +    friend +    bool +    operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __x, +               const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __y); + +    template <class _CharT, class _Traits, +              class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __x); + +    template <class _CharT, class _Traits, +              class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                       _Bp, _Tp, _Cp, _Lp, _Fp>& __x); +private: + +    template<class _Sseq> +        void __seed(_Sseq& __q, integral_constant<unsigned, 1>); +    template<class _Sseq> +        void __seed(_Sseq& __q, integral_constant<unsigned, 2>); + +    template <size_t __count> +        _LIBCPP_INLINE_VISIBILITY +        static +        typename enable_if +        < +            __count < __w, +            result_type +        >::type +        __lshift(result_type __x) {return (__x << __count) & _Max;} + +    template <size_t __count> +        _LIBCPP_INLINE_VISIBILITY +        static +        typename enable_if +        < +            (__count >= __w), +            result_type +        >::type +        __lshift(result_type) {return result_type(0);} + +    template <size_t __count> +        _LIBCPP_INLINE_VISIBILITY +        static +        typename enable_if +        < +            __count < _Dt, +            result_type +        >::type +        __rshift(result_type __x) {return __x >> __count;} + +    template <size_t __count> +        _LIBCPP_INLINE_VISIBILITY +        static +        typename enable_if +        < +            (__count >= _Dt), +            result_type +        >::type +        __rshift(result_type) {return result_type(0);} +}; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const size_t +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type +    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed; + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +void +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, +    __t, __c, __l, __f>::seed(result_type __sd) +    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK +{   // __w >= 2 +    __x_[0] = __sd & _Max; +    for (size_t __i = 1; __i < __n; ++__i) +        __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max; +    __i_ = 0; +} + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +template<class _Sseq> +void +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, +    __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>) +{ +    const unsigned __k = 1; +    uint32_t __ar[__n * __k]; +    __q.generate(__ar, __ar + __n * __k); +    for (size_t __i = 0; __i < __n; ++__i) +        __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); +    const result_type __mask = __r == _Dt ? result_type(~0) : +                                       (result_type(1) << __r) - result_type(1); +    __i_ = 0; +    if ((__x_[0] & ~__mask) == 0) +    { +        for (size_t __i = 1; __i < __n; ++__i) +            if (__x_[__i] != 0) +                return; +        __x_[0] = result_type(1) << (__w - 1); +    } +} + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +template<class _Sseq> +void +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, +    __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>) +{ +    const unsigned __k = 2; +    uint32_t __ar[__n * __k]; +    __q.generate(__ar, __ar + __n * __k); +    for (size_t __i = 0; __i < __n; ++__i) +        __x_[__i] = static_cast<result_type>( +            (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); +    const result_type __mask = __r == _Dt ? result_type(~0) : +                                       (result_type(1) << __r) - result_type(1); +    __i_ = 0; +    if ((__x_[0] & ~__mask) == 0) +    { +        for (size_t __i = 1; __i < __n; ++__i) +            if (__x_[__i] != 0) +                return; +        __x_[0] = result_type(1) << (__w - 1); +    } +} + +template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, +          _UIntType __a, size_t __u, _UIntType __d, size_t __s, +          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> +_UIntType +mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, +    __t, __c, __l, __f>::operator()() +{ +    const size_t __j = (__i_ + 1) % __n; +    const result_type __mask = __r == _Dt ? result_type(~0) : +                                       (result_type(1) << __r) - result_type(1); +    const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask); +    const size_t __k = (__i_ + __m) % __n; +    __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1)); +    result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d); +    __i_ = __j; +    __z ^= __lshift<__s>(__z) & __b; +    __z ^= __lshift<__t>(__z) & __c; +    return __z ^ __rshift<__l>(__z); +} + +template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +bool +operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, +           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y) +{ +    if (__x.__i_ == __y.__i_) +        return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_); +    if (__x.__i_ == 0 || __y.__i_ == 0) +    { +        size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_); +        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, +                         __y.__x_ + __y.__i_)) +            return false; +        if (__x.__i_ == 0) +            return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_); +        return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j); +    } +    if (__x.__i_ < __y.__i_) +    { +        size_t __j = _Np - __y.__i_; +        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), +                         __y.__x_ + __y.__i_)) +            return false; +        if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, +                         __y.__x_)) +            return false; +        return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, +                           __y.__x_ + (_Np - (__x.__i_ + __j))); +    } +    size_t __j = _Np - __x.__i_; +    if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), +                     __x.__x_ + __x.__i_)) +        return false; +    if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, +                     __x.__x_)) +        return false; +    return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, +                       __x.__x_ + (_Np - (__y.__i_ + __j))); +} + +template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, +           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y) +{ +    return !(__x == __y); +} + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _Ostream; +    __os.flags(_Ostream::dec | _Ostream::left); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.__x_[__x.__i_]; +    for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j) +        __os << __sp << __x.__x_[__j]; +    for (size_t __j = 0; __j < __x.__i_; ++__j) +        __os << __sp << __x.__x_[__j]; +    return __os; +} + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, +          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, +          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, +                                   _Bp, _Tp, _Cp, _Lp, _Fp>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    _UInt __t[_Np]; +    for (size_t __i = 0; __i < _Np; ++__i) +        __is >> __t[__i]; +    if (!__is.fail()) +    { +        for (size_t __i = 0; __i < _Np; ++__i) +            __x.__x_[__i] = __t[__i]; +        __x.__i_ = 0; +    } +    return __is; +} + +typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, +                                0x9908b0df, 11, 0xffffffff, +                                7,  0x9d2c5680, +                                15, 0xefc60000, +                                18, 1812433253>                         mt19937; +typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, +                                0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL, +                                17, 0x71d67fffeda60000ULL, +                                37, 0xfff7eee000000000ULL, +                                43, 6364136223846793005ULL>          mt19937_64; + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_MERSENNE_TWISTER_ENGINE_H diff --git a/libcxx/include/__random/negative_binomial_distribution.h b/libcxx/include/__random/negative_binomial_distribution.h new file mode 100644 index 000000000000..7329bac2ff85 --- /dev/null +++ b/libcxx/include/__random/negative_binomial_distribution.h @@ -0,0 +1,176 @@ +//===----------------------------------------------------------------------===// +// +// 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_NEGATIVE_BINOMIAL_DISTRIBUTION_H +#define _LIBCPP___RANDOM_NEGATIVE_BINOMIAL_DISTRIBUTION_H + +#include <__config> +#include <__random/bernoulli_distribution.h> +#include <__random/gamma_distribution.h> +#include <__random/poisson_distribution.h> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _IntType = int> +class _LIBCPP_TEMPLATE_VIS negative_binomial_distribution +{ +public: +    // types +    typedef _IntType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __k_; +        double __p_; +    public: +        typedef negative_binomial_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __k = 1, double __p = 0.5) +            : __k_(__k), __p_(__p) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type k() const {return __k_;} +        _LIBCPP_INLINE_VISIBILITY +        double p() const {return __p_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    negative_binomial_distribution() : negative_binomial_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit negative_binomial_distribution(result_type __k, double __p = 0.5) +        : __p_(__k, __p) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit negative_binomial_distribution(result_type __k = 1, +                                            double __p = 0.5) +        : __p_(__k, __p) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type k() const {return __p_.k();} +    _LIBCPP_INLINE_VISIBILITY +    double p() const {return __p_.p();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::max();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const negative_binomial_distribution& __x, +                        const negative_binomial_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const negative_binomial_distribution& __x, +                        const negative_binomial_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _IntType> +template<class _URNG> +_IntType +negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) +{ +    result_type __k = __pr.k(); +    double __p = __pr.p(); +    if (__k <= 21 * __p) +    { +        bernoulli_distribution __gen(__p); +        result_type __f = 0; +        result_type __s = 0; +        while (__s < __k) +        { +            if (__gen(__urng)) +                ++__s; +            else +                ++__f; +        } +        return __f; +    } +    return poisson_distribution<result_type>(gamma_distribution<double> +                                            (__k, (1-__p)/__p)(__urng))(__urng); +} + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const negative_binomial_distribution<_IntType>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    return __os << __x.k() << __sp << __x.p(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           negative_binomial_distribution<_IntType>& __x) +{ +    typedef negative_binomial_distribution<_IntType> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __k; +    double __p; +    __is >> __k >> __p; +    if (!__is.fail()) +        __x.param(param_type(__k, __p)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_NEGATIVE_BINOMIAL_DISTRIBUTION_H diff --git a/libcxx/include/__random/normal_distribution.h b/libcxx/include/__random/normal_distribution.h new file mode 100644 index 000000000000..b460ffb7ea9d --- /dev/null +++ b/libcxx/include/__random/normal_distribution.h @@ -0,0 +1,208 @@ +//===----------------------------------------------------------------------===// +// +// 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_NORMAL_DISTRIBUTION_H +#define _LIBCPP___RANDOM_NORMAL_DISTRIBUTION_H + +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS normal_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __mean_; +        result_type __stddev_; +    public: +        typedef normal_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __mean = 0, result_type __stddev = 1) +            : __mean_(__mean), __stddev_(__stddev) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type mean() const {return __mean_;} +        _LIBCPP_INLINE_VISIBILITY +        result_type stddev() const {return __stddev_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; +    result_type _V_; +    bool _V_hot_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    normal_distribution() : normal_distribution(0) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit normal_distribution(result_type __mean, result_type __stddev = 1) +        : __p_(param_type(__mean, __stddev)), _V_hot_(false) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit normal_distribution(result_type __mean = 0, +                                 result_type __stddev = 1) +        : __p_(param_type(__mean, __stddev)), _V_hot_(false) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit normal_distribution(const param_type& __p) +        : __p_(__p), _V_hot_(false) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {_V_hot_ = false;} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type mean() const {return __p_.mean();} +    _LIBCPP_INLINE_VISIBILITY +    result_type stddev() const {return __p_.stddev();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return -numeric_limits<result_type>::infinity();} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const normal_distribution& __x, +                        const normal_distribution& __y) +        {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ && +                (!__x._V_hot_ || __x._V_ == __y._V_);} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const normal_distribution& __x, +                        const normal_distribution& __y) +        {return !(__x == __y);} + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const normal_distribution<_RT>& __x); + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               normal_distribution<_RT>& __x); +}; + +template <class _RealType> +template<class _URNG> +_RealType +normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    result_type _Up; +    if (_V_hot_) +    { +        _V_hot_ = false; +        _Up = _V_; +    } +    else +    { +        uniform_real_distribution<result_type> _Uni(-1, 1); +        result_type __u; +        result_type __v; +        result_type __s; +        do +        { +            __u = _Uni(__g); +            __v = _Uni(__g); +            __s = __u * __u + __v * __v; +        } while (__s > 1 || __s == 0); +        result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s); +        _V_ = __v * _Fp; +        _V_hot_ = true; +        _Up = __u * _Fp; +    } +    return _Up * __p.stddev() + __p.mean(); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const normal_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_; +    if (__x._V_hot_) +        __os << __sp << __x._V_; +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           normal_distribution<_RT>& __x) +{ +    typedef normal_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __mean; +    result_type __stddev; +    result_type _Vp = 0; +    bool _V_hot = false; +    __is >> __mean >> __stddev >> _V_hot; +    if (_V_hot) +        __is >> _Vp; +    if (!__is.fail()) +    { +        __x.param(param_type(__mean, __stddev)); +        __x._V_hot_ = _V_hot; +        __x._V_ = _Vp; +    } +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_NORMAL_DISTRIBUTION_H diff --git a/libcxx/include/__random/piecewise_constant_distribution.h b/libcxx/include/__random/piecewise_constant_distribution.h new file mode 100644 index 000000000000..ece20d1a1d6e --- /dev/null +++ b/libcxx/include/__random/piecewise_constant_distribution.h @@ -0,0 +1,356 @@ +//===----------------------------------------------------------------------===// +// +// 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_PIECEWISE_CONSTANT_DISTRIBUTION_H +#define _LIBCPP___RANDOM_PIECEWISE_CONSTANT_DISTRIBUTION_H + +#include <__algorithm/upper_bound.h> +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <iosfwd> +#include <numeric> +#include <vector> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS piecewise_constant_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        vector<result_type> __b_; +        vector<result_type> __densities_; +        vector<result_type> __areas_; +    public: +        typedef piecewise_constant_distribution distribution_type; + +        param_type(); +        template<class _InputIteratorB, class _InputIteratorW> +            param_type(_InputIteratorB __fB, _InputIteratorB __lB, +                       _InputIteratorW __fW); +#ifndef _LIBCPP_CXX03_LANG +        template<class _UnaryOperation> +            param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); +#endif // _LIBCPP_CXX03_LANG +        template<class _UnaryOperation> +            param_type(size_t __nw, result_type __xmin, result_type __xmax, +                       _UnaryOperation __fw); +        param_type(param_type const&) = default; +        param_type & operator=(const param_type& __rhs); + +        _LIBCPP_INLINE_VISIBILITY +        vector<result_type> intervals() const {return __b_;} +        _LIBCPP_INLINE_VISIBILITY +        vector<result_type> densities() const {return __densities_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} + +    private: +        void __init(); + +        friend class piecewise_constant_distribution; + +        template <class _CharT, class _Traits, class _RT> +        friend +        basic_ostream<_CharT, _Traits>& +        operator<<(basic_ostream<_CharT, _Traits>& __os, +                   const piecewise_constant_distribution<_RT>& __x); + +        template <class _CharT, class _Traits, class _RT> +        friend +        basic_istream<_CharT, _Traits>& +        operator>>(basic_istream<_CharT, _Traits>& __is, +                   piecewise_constant_distribution<_RT>& __x); +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +    _LIBCPP_INLINE_VISIBILITY +    piecewise_constant_distribution() {} +    template<class _InputIteratorB, class _InputIteratorW> +        _LIBCPP_INLINE_VISIBILITY +        piecewise_constant_distribution(_InputIteratorB __fB, +                                        _InputIteratorB __lB, +                                        _InputIteratorW __fW) +        : __p_(__fB, __lB, __fW) {} + +#ifndef _LIBCPP_CXX03_LANG +    template<class _UnaryOperation> +        _LIBCPP_INLINE_VISIBILITY +        piecewise_constant_distribution(initializer_list<result_type> __bl, +                                        _UnaryOperation __fw) +        : __p_(__bl, __fw) {} +#endif // _LIBCPP_CXX03_LANG + +    template<class _UnaryOperation> +        _LIBCPP_INLINE_VISIBILITY +        piecewise_constant_distribution(size_t __nw, result_type __xmin, +                                        result_type __xmax, _UnaryOperation __fw) +        : __p_(__nw, __xmin, __xmax, __fw) {} + +    _LIBCPP_INLINE_VISIBILITY +    explicit piecewise_constant_distribution(const param_type& __p) +        : __p_(__p) {} + +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    vector<result_type> intervals() const {return __p_.intervals();} +    _LIBCPP_INLINE_VISIBILITY +    vector<result_type> densities() const {return __p_.densities();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return __p_.__b_.front();} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return __p_.__b_.back();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const piecewise_constant_distribution& __x, +                        const piecewise_constant_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const piecewise_constant_distribution& __x, +                           const piecewise_constant_distribution& __y) +        {return !(__x == __y);} + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const piecewise_constant_distribution<_RT>& __x); + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               piecewise_constant_distribution<_RT>& __x); +}; + +template<class _RealType> +typename piecewise_constant_distribution<_RealType>::param_type & +piecewise_constant_distribution<_RealType>::param_type::operator= +                                                       (const param_type& __rhs) +{ +//  These can throw +    __b_.reserve        (__rhs.__b_.size ()); +    __densities_.reserve(__rhs.__densities_.size()); +    __areas_.reserve    (__rhs.__areas_.size()); + +//  These can not throw +    __b_         = __rhs.__b_; +    __densities_ = __rhs.__densities_; +    __areas_     =  __rhs.__areas_; +    return *this; +} + +template<class _RealType> +void +piecewise_constant_distribution<_RealType>::param_type::__init() +{ +    // __densities_ contains non-normalized areas +    result_type __total_area = _VSTD::accumulate(__densities_.begin(), +                                                __densities_.end(), +                                                result_type()); +    for (size_t __i = 0; __i < __densities_.size(); ++__i) +        __densities_[__i] /= __total_area; +    // __densities_ contains normalized areas +    __areas_.assign(__densities_.size(), result_type()); +    _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1, +                                                          __areas_.begin() + 1); +    // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1] +    __densities_.back() = 1 - __areas_.back();  // correct round off error +    for (size_t __i = 0; __i < __densities_.size(); ++__i) +        __densities_[__i] /= (__b_[__i+1] - __b_[__i]); +    // __densities_ now contains __densities_ +} + +template<class _RealType> +piecewise_constant_distribution<_RealType>::param_type::param_type() +    : __b_(2), +      __densities_(1, 1.0), +      __areas_(1, 0.0) +{ +    __b_[1] = 1; +} + +template<class _RealType> +template<class _InputIteratorB, class _InputIteratorW> +piecewise_constant_distribution<_RealType>::param_type::param_type( +        _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) +    : __b_(__fB, __lB) +{ +    if (__b_.size() < 2) +    { +        __b_.resize(2); +        __b_[0] = 0; +        __b_[1] = 1; +        __densities_.assign(1, 1.0); +        __areas_.assign(1, 0.0); +    } +    else +    { +        __densities_.reserve(__b_.size() - 1); +        for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW) +            __densities_.push_back(*__fW); +        __init(); +    } +} + +#ifndef _LIBCPP_CXX03_LANG + +template<class _RealType> +template<class _UnaryOperation> +piecewise_constant_distribution<_RealType>::param_type::param_type( +        initializer_list<result_type> __bl, _UnaryOperation __fw) +    : __b_(__bl.begin(), __bl.end()) +{ +    if (__b_.size() < 2) +    { +        __b_.resize(2); +        __b_[0] = 0; +        __b_[1] = 1; +        __densities_.assign(1, 1.0); +        __areas_.assign(1, 0.0); +    } +    else +    { +        __densities_.reserve(__b_.size() - 1); +        for (size_t __i = 0; __i < __b_.size() - 1; ++__i) +            __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5)); +        __init(); +    } +} + +#endif // _LIBCPP_CXX03_LANG + +template<class _RealType> +template<class _UnaryOperation> +piecewise_constant_distribution<_RealType>::param_type::param_type( +        size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) +    : __b_(__nw == 0 ? 2 : __nw + 1) +{ +    size_t __n = __b_.size() - 1; +    result_type __d = (__xmax - __xmin) / __n; +    __densities_.reserve(__n); +    for (size_t __i = 0; __i < __n; ++__i) +    { +        __b_[__i] = __xmin + __i * __d; +        __densities_.push_back(__fw(__b_[__i] + __d*.5)); +    } +    __b_[__n] = __xmax; +    __init(); +} + +template<class _RealType> +template<class _URNG> +_RealType +piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    typedef uniform_real_distribution<result_type> _Gen; +    result_type __u = _Gen()(__g); +    ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), +                                      __u) - __p.__areas_.begin() - 1; +    return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k]; +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const piecewise_constant_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    size_t __n = __x.__p_.__b_.size(); +    __os << __n; +    for (size_t __i = 0; __i < __n; ++__i) +        __os << __sp << __x.__p_.__b_[__i]; +    __n = __x.__p_.__densities_.size(); +    __os << __sp << __n; +    for (size_t __i = 0; __i < __n; ++__i) +        __os << __sp << __x.__p_.__densities_[__i]; +    __n = __x.__p_.__areas_.size(); +    __os << __sp << __n; +    for (size_t __i = 0; __i < __n; ++__i) +        __os << __sp << __x.__p_.__areas_[__i]; +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           piecewise_constant_distribution<_RT>& __x) +{ +    typedef piecewise_constant_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    size_t __n; +    __is >> __n; +    vector<result_type> __b(__n); +    for (size_t __i = 0; __i < __n; ++__i) +        __is >> __b[__i]; +    __is >> __n; +    vector<result_type> __densities(__n); +    for (size_t __i = 0; __i < __n; ++__i) +        __is >> __densities[__i]; +    __is >> __n; +    vector<result_type> __areas(__n); +    for (size_t __i = 0; __i < __n; ++__i) +        __is >> __areas[__i]; +    if (!__is.fail()) +    { +        swap(__x.__p_.__b_, __b); +        swap(__x.__p_.__densities_, __densities); +        swap(__x.__p_.__areas_, __areas); +    } +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_PIECEWISE_CONSTANT_DISTRIBUTION_H diff --git a/libcxx/include/__random/piecewise_linear_distribution.h b/libcxx/include/__random/piecewise_linear_distribution.h new file mode 100644 index 000000000000..b2ba164d0707 --- /dev/null +++ b/libcxx/include/__random/piecewise_linear_distribution.h @@ -0,0 +1,372 @@ +//===----------------------------------------------------------------------===// +// +// 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_PIECEWISE_LINEAR_DISTRIBUTION_H +#define _LIBCPP___RANDOM_PIECEWISE_LINEAR_DISTRIBUTION_H + +#include <__algorithm/upper_bound.h> +#include <__config> +#include <__random/uniform_real_distribution.h> +#include <iosfwd> +#include <numeric> +#include <vector> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS piecewise_linear_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        vector<result_type> __b_; +        vector<result_type> __densities_; +        vector<result_type> __areas_; +    public: +        typedef piecewise_linear_distribution distribution_type; + +        param_type(); +        template<class _InputIteratorB, class _InputIteratorW> +            param_type(_InputIteratorB __fB, _InputIteratorB __lB, +                       _InputIteratorW __fW); +#ifndef _LIBCPP_CXX03_LANG +        template<class _UnaryOperation> +            param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); +#endif // _LIBCPP_CXX03_LANG +        template<class _UnaryOperation> +            param_type(size_t __nw, result_type __xmin, result_type __xmax, +                       _UnaryOperation __fw); +        param_type(param_type const&) = default; +        param_type & operator=(const param_type& __rhs); + +        _LIBCPP_INLINE_VISIBILITY +        vector<result_type> intervals() const {return __b_;} +        _LIBCPP_INLINE_VISIBILITY +        vector<result_type> densities() const {return __densities_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} + +    private: +        void __init(); + +        friend class piecewise_linear_distribution; + +        template <class _CharT, class _Traits, class _RT> +        friend +        basic_ostream<_CharT, _Traits>& +        operator<<(basic_ostream<_CharT, _Traits>& __os, +                   const piecewise_linear_distribution<_RT>& __x); + +        template <class _CharT, class _Traits, class _RT> +        friend +        basic_istream<_CharT, _Traits>& +        operator>>(basic_istream<_CharT, _Traits>& __is, +                   piecewise_linear_distribution<_RT>& __x); +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +    _LIBCPP_INLINE_VISIBILITY +    piecewise_linear_distribution() {} +    template<class _InputIteratorB, class _InputIteratorW> +        _LIBCPP_INLINE_VISIBILITY +        piecewise_linear_distribution(_InputIteratorB __fB, +                                      _InputIteratorB __lB, +                                      _InputIteratorW __fW) +        : __p_(__fB, __lB, __fW) {} + +#ifndef _LIBCPP_CXX03_LANG +    template<class _UnaryOperation> +        _LIBCPP_INLINE_VISIBILITY +        piecewise_linear_distribution(initializer_list<result_type> __bl, +                                      _UnaryOperation __fw) +        : __p_(__bl, __fw) {} +#endif // _LIBCPP_CXX03_LANG + +    template<class _UnaryOperation> +        _LIBCPP_INLINE_VISIBILITY +        piecewise_linear_distribution(size_t __nw, result_type __xmin, +                                      result_type __xmax, _UnaryOperation __fw) +        : __p_(__nw, __xmin, __xmax, __fw) {} + +    _LIBCPP_INLINE_VISIBILITY +    explicit piecewise_linear_distribution(const param_type& __p) +        : __p_(__p) {} + +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    vector<result_type> intervals() const {return __p_.intervals();} +    _LIBCPP_INLINE_VISIBILITY +    vector<result_type> densities() const {return __p_.densities();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return __p_.__b_.front();} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return __p_.__b_.back();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const piecewise_linear_distribution& __x, +                        const piecewise_linear_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const piecewise_linear_distribution& __x, +                        const piecewise_linear_distribution& __y) +        {return !(__x == __y);} + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const piecewise_linear_distribution<_RT>& __x); + +    template <class _CharT, class _Traits, class _RT> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               piecewise_linear_distribution<_RT>& __x); +}; + +template<class _RealType> +typename piecewise_linear_distribution<_RealType>::param_type & +piecewise_linear_distribution<_RealType>::param_type::operator= +                                                       (const param_type& __rhs) +{ +//  These can throw +    __b_.reserve        (__rhs.__b_.size ()); +    __densities_.reserve(__rhs.__densities_.size()); +    __areas_.reserve    (__rhs.__areas_.size()); + +//  These can not throw +    __b_         = __rhs.__b_; +    __densities_ = __rhs.__densities_; +    __areas_     =  __rhs.__areas_; +    return *this; +} + + +template<class _RealType> +void +piecewise_linear_distribution<_RealType>::param_type::__init() +{ +    __areas_.assign(__densities_.size() - 1, result_type()); +    result_type _Sp = 0; +    for (size_t __i = 0; __i < __areas_.size(); ++__i) +    { +        __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) * +                        (__b_[__i+1] - __b_[__i]) * .5; +        _Sp += __areas_[__i]; +    } +    for (size_t __i = __areas_.size(); __i > 1;) +    { +        --__i; +        __areas_[__i] = __areas_[__i-1] / _Sp; +    } +    __areas_[0] = 0; +    for (size_t __i = 1; __i < __areas_.size(); ++__i) +        __areas_[__i] += __areas_[__i-1]; +    for (size_t __i = 0; __i < __densities_.size(); ++__i) +        __densities_[__i] /= _Sp; +} + +template<class _RealType> +piecewise_linear_distribution<_RealType>::param_type::param_type() +    : __b_(2), +      __densities_(2, 1.0), +      __areas_(1, 0.0) +{ +    __b_[1] = 1; +} + +template<class _RealType> +template<class _InputIteratorB, class _InputIteratorW> +piecewise_linear_distribution<_RealType>::param_type::param_type( +        _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) +    : __b_(__fB, __lB) +{ +    if (__b_.size() < 2) +    { +        __b_.resize(2); +        __b_[0] = 0; +        __b_[1] = 1; +        __densities_.assign(2, 1.0); +        __areas_.assign(1, 0.0); +    } +    else +    { +        __densities_.reserve(__b_.size()); +        for (size_t __i = 0; __i < __b_.size(); ++__i, ++__fW) +            __densities_.push_back(*__fW); +        __init(); +    } +} + +#ifndef _LIBCPP_CXX03_LANG + +template<class _RealType> +template<class _UnaryOperation> +piecewise_linear_distribution<_RealType>::param_type::param_type( +        initializer_list<result_type> __bl, _UnaryOperation __fw) +    : __b_(__bl.begin(), __bl.end()) +{ +    if (__b_.size() < 2) +    { +        __b_.resize(2); +        __b_[0] = 0; +        __b_[1] = 1; +        __densities_.assign(2, 1.0); +        __areas_.assign(1, 0.0); +    } +    else +    { +        __densities_.reserve(__b_.size()); +        for (size_t __i = 0; __i < __b_.size(); ++__i) +            __densities_.push_back(__fw(__b_[__i])); +        __init(); +    } +} + +#endif // _LIBCPP_CXX03_LANG + +template<class _RealType> +template<class _UnaryOperation> +piecewise_linear_distribution<_RealType>::param_type::param_type( +        size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) +    : __b_(__nw == 0 ? 2 : __nw + 1) +{ +    size_t __n = __b_.size() - 1; +    result_type __d = (__xmax - __xmin) / __n; +    __densities_.reserve(__b_.size()); +    for (size_t __i = 0; __i < __n; ++__i) +    { +        __b_[__i] = __xmin + __i * __d; +        __densities_.push_back(__fw(__b_[__i])); +    } +    __b_[__n] = __xmax; +    __densities_.push_back(__fw(__b_[__n])); +    __init(); +} + +template<class _RealType> +template<class _URNG> +_RealType +piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    typedef uniform_real_distribution<result_type> _Gen; +    result_type __u = _Gen()(__g); +    ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), +                                      __u) - __p.__areas_.begin() - 1; +    __u -= __p.__areas_[__k]; +    const result_type __dk = __p.__densities_[__k]; +    const result_type __dk1 = __p.__densities_[__k+1]; +    const result_type __deltad = __dk1 - __dk; +    const result_type __bk = __p.__b_[__k]; +    if (__deltad == 0) +        return __u / __dk + __bk; +    const result_type __bk1 = __p.__b_[__k+1]; +    const result_type __deltab = __bk1 - __bk; +    return (__bk * __dk1 - __bk1 * __dk + +        _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) / +        __deltad; +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const piecewise_linear_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    size_t __n = __x.__p_.__b_.size(); +    __os << __n; +    for (size_t __i = 0; __i < __n; ++__i) +        __os << __sp << __x.__p_.__b_[__i]; +    __n = __x.__p_.__densities_.size(); +    __os << __sp << __n; +    for (size_t __i = 0; __i < __n; ++__i) +        __os << __sp << __x.__p_.__densities_[__i]; +    __n = __x.__p_.__areas_.size(); +    __os << __sp << __n; +    for (size_t __i = 0; __i < __n; ++__i) +        __os << __sp << __x.__p_.__areas_[__i]; +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           piecewise_linear_distribution<_RT>& __x) +{ +    typedef piecewise_linear_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    size_t __n; +    __is >> __n; +    vector<result_type> __b(__n); +    for (size_t __i = 0; __i < __n; ++__i) +        __is >> __b[__i]; +    __is >> __n; +    vector<result_type> __densities(__n); +    for (size_t __i = 0; __i < __n; ++__i) +        __is >> __densities[__i]; +    __is >> __n; +    vector<result_type> __areas(__n); +    for (size_t __i = 0; __i < __n; ++__i) +        __is >> __areas[__i]; +    if (!__is.fail()) +    { +        swap(__x.__p_.__b_, __b); +        swap(__x.__p_.__densities_, __densities); +        swap(__x.__p_.__areas_, __areas); +    } +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_PIECEWISE_LINEAR_DISTRIBUTION_H diff --git a/libcxx/include/__random/poisson_distribution.h b/libcxx/include/__random/poisson_distribution.h new file mode 100644 index 000000000000..fb213b0103ad --- /dev/null +++ b/libcxx/include/__random/poisson_distribution.h @@ -0,0 +1,276 @@ +//===----------------------------------------------------------------------===// +// +// 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_POISSON_DISTRIBUTION_H +#define _LIBCPP___RANDOM_POISSON_DISTRIBUTION_H + +#include <__config> +#include <__random/exponential_distribution.h> +#include <__random/normal_distribution.h> +#include <__random/uniform_real_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _IntType = int> +class _LIBCPP_TEMPLATE_VIS poisson_distribution +{ +public: +    // types +    typedef _IntType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        double __mean_; +        double __s_; +        double __d_; +        double __l_; +        double __omega_; +        double __c0_; +        double __c1_; +        double __c2_; +        double __c3_; +        double __c_; + +    public: +        typedef poisson_distribution distribution_type; + +        explicit param_type(double __mean = 1.0); + +        _LIBCPP_INLINE_VISIBILITY +        double mean() const {return __mean_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__mean_ == __y.__mean_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} + +        friend class poisson_distribution; +    }; + +private: +    param_type __p_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    poisson_distribution() : poisson_distribution(1.0) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit poisson_distribution(double __mean) +        : __p_(__mean) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit poisson_distribution(double __mean = 1.0) +        : __p_(__mean) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit poisson_distribution(const param_type& __p) : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    double mean() const {return __p_.mean();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::max();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const poisson_distribution& __x, +                        const poisson_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const poisson_distribution& __x, +                        const poisson_distribution& __y) +        {return !(__x == __y);} +}; + +template<class _IntType> +poisson_distribution<_IntType>::param_type::param_type(double __mean) +    // According to the standard `inf` is a valid input, but it causes the +    // distribution to hang, so we replace it with the maximum representable +    // mean. +    : __mean_(isinf(__mean) ? numeric_limits<double>::max() : __mean) +{ +    if (__mean_ < 10) +    { +        __s_ = 0; +        __d_ = 0; +        __l_ = _VSTD::exp(-__mean_); +        __omega_ = 0; +        __c3_ = 0; +        __c2_ = 0; +        __c1_ = 0; +        __c0_ = 0; +        __c_ = 0; +    } +    else +    { +        __s_ = _VSTD::sqrt(__mean_); +        __d_ = 6 * __mean_ * __mean_; +        __l_ = _VSTD::trunc(__mean_ - 1.1484); +        __omega_ = .3989423 / __s_; +        double __b1_ = .4166667E-1 / __mean_; +        double __b2_ = .3 * __b1_ * __b1_; +        __c3_ = .1428571 * __b1_ * __b2_; +        __c2_ = __b2_ - 15. * __c3_; +        __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_; +        __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_; +        __c_ = .1069 / __mean_; +    } +} + +template <class _IntType> +template<class _URNG> +_IntType +poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) +{ +    double __tx; +    uniform_real_distribution<double> __urd; +    if (__pr.__mean_ < 10) +    { +         __tx = 0; +        for (double __p = __urd(__urng); __p > __pr.__l_; ++__tx) +            __p *= __urd(__urng); +    } +    else +    { +        double __difmuk; +        double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng); +        double __u; +        if (__g > 0) +        { +            __tx = _VSTD::trunc(__g); +            if (__tx >= __pr.__l_) +                return _VSTD::__clamp_to_integral<result_type>(__tx); +            __difmuk = __pr.__mean_ - __tx; +            __u = __urd(__urng); +            if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk) +                return _VSTD::__clamp_to_integral<result_type>(__tx); +        } +        exponential_distribution<double> __edist; +        for (bool __using_exp_dist = false; true; __using_exp_dist = true) +        { +            double __e; +            if (__using_exp_dist || __g <= 0) +            { +                double __t; +                do +                { +                    __e = __edist(__urng); +                    __u = __urd(__urng); +                    __u += __u - 1; +                    __t = 1.8 + (__u < 0 ? -__e : __e); +                } while (__t <= -.6744); +                __tx = _VSTD::trunc(__pr.__mean_ + __pr.__s_ * __t); +                __difmuk = __pr.__mean_ - __tx; +                __using_exp_dist = true; +            } +            double __px; +            double __py; +            if (__tx < 10 && __tx >= 0) +            { +                const double __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, +                                             40320, 362880}; +                __px = -__pr.__mean_; +                __py = _VSTD::pow(__pr.__mean_, (double)__tx) / __fac[static_cast<int>(__tx)]; +            } +            else +            { +                double __del = .8333333E-1 / __tx; +                __del -= 4.8 * __del * __del * __del; +                double __v = __difmuk / __tx; +                if (_VSTD::abs(__v) > 0.25) +                    __px = __tx * _VSTD::log(1 + __v) - __difmuk - __del; +                else +                    __px = __tx * __v * __v * (((((((.1250060 * __v + -.1384794) * +                           __v + .1421878) * __v + -.1661269) * __v + .2000118) * +                           __v + -.2500068) * __v + .3333333) * __v + -.5) - __del; +                __py = .3989423 / _VSTD::sqrt(__tx); +            } +            double __r = (0.5 - __difmuk) / __pr.__s_; +            double __r2 = __r * __r; +            double __fx = -0.5 * __r2; +            double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) * +                                        __r2 + __pr.__c1_) * __r2 + __pr.__c0_); +            if (__using_exp_dist) +            { +                if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) - +                                                   __fy * _VSTD::exp(__fx + __e)) +                    break; +            } +            else +            { +                if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx)) +                    break; +            } +        } +    } +    return _VSTD::__clamp_to_integral<result_type>(__tx); +} + +template <class _CharT, class _Traits, class _IntType> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const poisson_distribution<_IntType>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    return __os << __x.mean(); +} + +template <class _CharT, class _Traits, class _IntType> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           poisson_distribution<_IntType>& __x) +{ +    typedef poisson_distribution<_IntType> _Eng; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    double __mean; +    __is >> __mean; +    if (!__is.fail()) +        __x.param(param_type(__mean)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_POISSON_DISTRIBUTION_H diff --git a/libcxx/include/__random/random_device.h b/libcxx/include/__random/random_device.h new file mode 100644 index 000000000000..f62f7a3d269b --- /dev/null +++ b/libcxx/include/__random/random_device.h @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// 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_; +#endif // defined(_LIBCPP_USING_DEV_RANDOM) +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; + +private: +    // no copy functions +    random_device(const random_device&); // = delete; +    random_device& operator=(const random_device&); // = delete; +}; + +#endif // !_LIBCPP_HAS_NO_RANDOM_DEVICE + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_RANDOM_DEVICE_H diff --git a/libcxx/include/__random/ranlux.h b/libcxx/include/__random/ranlux.h new file mode 100644 index 000000000000..0b415928df4d --- /dev/null +++ b/libcxx/include/__random/ranlux.h @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// 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_RANLUX_H +#define _LIBCPP___RANDOM_RANLUX_H + +#include <__config> +#include <__random/discard_block_engine.h> +#include <__random/subtract_with_carry_engine.h> +#include <cstdint> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24> ranlux24_base; +typedef subtract_with_carry_engine<uint_fast64_t, 48,  5, 12> ranlux48_base; + +typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; +typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___RANDOM_RANLUX_H diff --git a/libcxx/include/__random/seed_seq.h b/libcxx/include/__random/seed_seq.h new file mode 100644 index 000000000000..97bc88d0d4d1 --- /dev/null +++ b/libcxx/include/__random/seed_seq.h @@ -0,0 +1,150 @@ +//===----------------------------------------------------------------------===// +// +// 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_SEED_SEQ_H +#define _LIBCPP___RANDOM_SEED_SEQ_H + +#include <__algorithm/copy.h> +#include <__algorithm/fill.h> +#include <__algorithm/max.h> +#include <__config> +#include <initializer_list> +#include <vector> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +class _LIBCPP_TEMPLATE_VIS seed_seq +{ +public: +    // types +    typedef uint32_t result_type; + +private: +    vector<result_type> __v_; + +    template<class _InputIterator> +        void init(_InputIterator __first, _InputIterator __last); +public: +    // constructors +    _LIBCPP_INLINE_VISIBILITY +    seed_seq() _NOEXCEPT {} +#ifndef _LIBCPP_CXX03_LANG +    template<class _Tp> +        _LIBCPP_INLINE_VISIBILITY +        seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());} +#endif // _LIBCPP_CXX03_LANG + +    template<class _InputIterator> +        _LIBCPP_INLINE_VISIBILITY +        seed_seq(_InputIterator __first, _InputIterator __last) +             {init(__first, __last);} + +    // generating functions +    template<class _RandomAccessIterator> +        void generate(_RandomAccessIterator __first, _RandomAccessIterator __last); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    size_t size() const _NOEXCEPT {return __v_.size();} +    template<class _OutputIterator> +        _LIBCPP_INLINE_VISIBILITY +        void param(_OutputIterator __dest) const +            {_VSTD::copy(__v_.begin(), __v_.end(), __dest);} + +private: +    // no copy functions +    seed_seq(const seed_seq&); // = delete; +    void operator=(const seed_seq&); // = delete; + +    _LIBCPP_INLINE_VISIBILITY +    static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);} +}; + +template<class _InputIterator> +void +seed_seq::init(_InputIterator __first, _InputIterator __last) +{ +    for (_InputIterator __s = __first; __s != __last; ++__s) +        __v_.push_back(*__s & 0xFFFFFFFF); +} + +template<class _RandomAccessIterator> +void +seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last) +{ +    if (__first != __last) +    { +        _VSTD::fill(__first, __last, 0x8b8b8b8b); +        const size_t __n = static_cast<size_t>(__last - __first); +        const size_t __s = __v_.size(); +        const size_t __t = (__n >= 623) ? 11 +                         : (__n >= 68) ? 7 +                         : (__n >= 39) ? 5 +                         : (__n >= 7)  ? 3 +                         : (__n - 1) / 2; +        const size_t __p = (__n - __t) / 2; +        const size_t __q = __p + __t; +        const size_t __m = _VSTD::max(__s + 1, __n); +        // __k = 0; +        { +            result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p] +                                                      ^  __first[__n - 1]); +            __first[__p] += __r; +            __r += __s; +            __first[__q] += __r; +            __first[0] = __r; +        } +        for (size_t __k = 1; __k <= __s; ++__k) +        { +            const size_t __kmodn = __k % __n; +            const size_t __kpmodn = (__k + __p) % __n; +            result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] +                                           ^ __first[(__k - 1) % __n]); +            __first[__kpmodn] += __r; +            __r +=  __kmodn + __v_[__k-1]; +            __first[(__k + __q) % __n] += __r; +            __first[__kmodn] = __r; +        } +        for (size_t __k = __s + 1; __k < __m; ++__k) +        { +            const size_t __kmodn = __k % __n; +            const size_t __kpmodn = (__k + __p) % __n; +            result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] +                                           ^ __first[(__k - 1) % __n]); +            __first[__kpmodn] += __r; +            __r +=  __kmodn; +            __first[(__k + __q) % __n] += __r; +            __first[__kmodn] = __r; +        } +        for (size_t __k = __m; __k < __m + __n; ++__k) +        { +            const size_t __kmodn = __k % __n; +            const size_t __kpmodn = (__k + __p) % __n; +            result_type __r = 1566083941 * _Tp(__first[__kmodn] + +                                              __first[__kpmodn] + +                                              __first[(__k - 1) % __n]); +            __first[__kpmodn] ^= __r; +            __r -= __kmodn; +            __first[(__k + __q) % __n] ^= __r; +            __first[__kmodn] = __r; +        } +    } +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_SEED_SEQ_H diff --git a/libcxx/include/__random/shuffle_order_engine.h b/libcxx/include/__random/shuffle_order_engine.h new file mode 100644 index 000000000000..7a5735dd7933 --- /dev/null +++ b/libcxx/include/__random/shuffle_order_engine.h @@ -0,0 +1,283 @@ +//===----------------------------------------------------------------------===// +// +// 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_SHUFFLE_ORDER_ENGINE_H +#define _LIBCPP___RANDOM_SHUFFLE_ORDER_ENGINE_H + +#include <__algorithm/equal.h> +#include <__config> +#include <__random/is_seed_sequence.h> +#include <__utility/move.h> +#include <cstdint> +#include <iosfwd> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template <uint64_t _Xp, uint64_t _Yp> +struct __ugcd +{ +    static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value; +}; + +template <uint64_t _Xp> +struct __ugcd<_Xp, 0> +{ +    static _LIBCPP_CONSTEXPR const uint64_t value = _Xp; +}; + +template <uint64_t _Np, uint64_t _Dp> +class __uratio +{ +    static_assert(_Dp != 0, "__uratio divide by 0"); +    static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value; +public: +    static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd; +    static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd; + +    typedef __uratio<num, den> type; +}; + +template<class _Engine, size_t __k> +class _LIBCPP_TEMPLATE_VIS shuffle_order_engine +{ +    static_assert(0 < __k, "shuffle_order_engine invalid parameters"); +public: +    // types +    typedef typename _Engine::result_type result_type; + +private: +    _Engine __e_; +    result_type _V_[__k]; +    result_type _Y_; + +public: +    // engine characteristics +    static _LIBCPP_CONSTEXPR const size_t table_size = __k; + +#ifdef _LIBCPP_CXX03_LANG +    static const result_type _Min = _Engine::_Min; +    static const result_type _Max = _Engine::_Max; +#else +    static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); +    static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); +#endif +    static_assert(_Min < _Max, "shuffle_order_engine invalid parameters"); +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } + +    static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull; + +    // constructors and seeding functions +    _LIBCPP_INLINE_VISIBILITY +    shuffle_order_engine() {__init();} +    _LIBCPP_INLINE_VISIBILITY +    explicit shuffle_order_engine(const _Engine& __e) +        : __e_(__e) {__init();} +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    explicit shuffle_order_engine(_Engine&& __e) +        : __e_(_VSTD::move(__e)) {__init();} +#endif // _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        explicit shuffle_order_engine(_Sseq& __q, +        typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value && +                           !is_convertible<_Sseq, _Engine>::value>::type* = 0) +         : __e_(__q) {__init();} +    _LIBCPP_INLINE_VISIBILITY +    void seed() {__e_.seed(); __init();} +    _LIBCPP_INLINE_VISIBILITY +    void seed(result_type __sd) {__e_.seed(__sd); __init();} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            __is_seed_sequence<_Sseq, shuffle_order_engine>::value, +            void +        >::type +        seed(_Sseq& __q) {__e_.seed(__q); __init();} + +    // generating functions +    _LIBCPP_INLINE_VISIBILITY +    result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} +    _LIBCPP_INLINE_VISIBILITY +    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    const _Engine& base() const _NOEXCEPT {return __e_;} + +private: +    template<class _Eng, size_t _Kp> +    friend +    bool +    operator==( +        const shuffle_order_engine<_Eng, _Kp>& __x, +        const shuffle_order_engine<_Eng, _Kp>& __y); + +    template<class _Eng, size_t _Kp> +    friend +    bool +    operator!=( +        const shuffle_order_engine<_Eng, _Kp>& __x, +        const shuffle_order_engine<_Eng, _Kp>& __y); + +    template <class _CharT, class _Traits, +              class _Eng, size_t _Kp> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const shuffle_order_engine<_Eng, _Kp>& __x); + +    template <class _CharT, class _Traits, +              class _Eng, size_t _Kp> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               shuffle_order_engine<_Eng, _Kp>& __x); + +    _LIBCPP_INLINE_VISIBILITY +    void __init() +    { +        for (size_t __i = 0; __i < __k; ++__i) +            _V_[__i] = __e_(); +        _Y_ = __e_(); +    } + +    _LIBCPP_INLINE_VISIBILITY +    result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());} +    _LIBCPP_INLINE_VISIBILITY +    result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());} + +    _LIBCPP_INLINE_VISIBILITY +    result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());} +    _LIBCPP_INLINE_VISIBILITY +    result_type __eval2(true_type) {return __evalf<__k, 0>();} + +    template <uint64_t _Np, uint64_t _Dp> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)), +            result_type +        >::type +        __eval(__uratio<_Np, _Dp>) +            {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();} + +    template <uint64_t _Np, uint64_t _Dp> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min), +            result_type +        >::type +        __eval(__uratio<_Np, _Dp>) +        { +            const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min) +                                                   / __uratio<_Np, _Dp>::den); +            _Y_ = _V_[__j]; +            _V_[__j] = __e_(); +            return _Y_; +        } + +    template <uint64_t __n, uint64_t __d> +        _LIBCPP_INLINE_VISIBILITY +        result_type __evalf() +        { +            const double _Fp = __d == 0 ? +                __n / (2. * 0x8000000000000000ull) : +                __n / (double)__d; +            const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min)); +            _Y_ = _V_[__j]; +            _V_[__j] = __e_(); +            return _Y_; +        } +}; + +template<class _Engine, size_t __k> +    _LIBCPP_CONSTEXPR const size_t shuffle_order_engine<_Engine, __k>::table_size; + +template<class _Eng, size_t _Kp> +bool +operator==( +    const shuffle_order_engine<_Eng, _Kp>& __x, +    const shuffle_order_engine<_Eng, _Kp>& __y) +{ +    return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) && +           __x.__e_ == __y.__e_; +} + +template<class _Eng, size_t _Kp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=( +    const shuffle_order_engine<_Eng, _Kp>& __x, +    const shuffle_order_engine<_Eng, _Kp>& __y) +{ +    return !(__x == __y); +} + +template <class _CharT, class _Traits, +          class _Eng, size_t _Kp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const shuffle_order_engine<_Eng, _Kp>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _Ostream; +    __os.flags(_Ostream::dec | _Ostream::left); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.__e_ << __sp << __x._V_[0]; +    for (size_t __i = 1; __i < _Kp; ++__i) +        __os << __sp << __x._V_[__i]; +    return __os << __sp << __x._Y_; +} + +template <class _CharT, class _Traits, +          class _Eng, size_t _Kp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           shuffle_order_engine<_Eng, _Kp>& __x) +{ +    typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    _Eng __e; +    result_type _Vp[_Kp+1]; +    __is >> __e; +    for (size_t __i = 0; __i < _Kp+1; ++__i) +        __is >> _Vp[__i]; +    if (!__is.fail()) +    { +        __x.__e_ = __e; +        for (size_t __i = 0; __i < _Kp; ++__i) +            __x._V_[__i] = _Vp[__i]; +        __x._Y_ = _Vp[_Kp]; +    } +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_SHUFFLE_ORDER_ENGINE_H diff --git a/libcxx/include/__random/student_t_distribution.h b/libcxx/include/__random/student_t_distribution.h new file mode 100644 index 000000000000..0cf911e4cd76 --- /dev/null +++ b/libcxx/include/__random/student_t_distribution.h @@ -0,0 +1,153 @@ +//===----------------------------------------------------------------------===// +// +// 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_STUDENT_T_DISTRIBUTION_H +#define _LIBCPP___RANDOM_STUDENT_T_DISTRIBUTION_H + +#include <__config> +#include <__random/gamma_distribution.h> +#include <__random/normal_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS student_t_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __n_; +    public: +        typedef student_t_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __n = 1) : __n_(__n) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type n() const {return __n_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__n_ == __y.__n_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; +    normal_distribution<result_type> __nd_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    student_t_distribution() : student_t_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit student_t_distribution(result_type __n) +        : __p_(param_type(__n)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit student_t_distribution(result_type __n = 1) +        : __p_(param_type(__n)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit student_t_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {__nd_.reset();} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type n() const {return __p_.n();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return -numeric_limits<result_type>::infinity();} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const student_t_distribution& __x, +                        const student_t_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const student_t_distribution& __x, +                        const student_t_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _RealType> +template<class _URNG> +_RealType +student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    gamma_distribution<result_type> __gd(__p.n() * .5, 2); +    return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g)); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const student_t_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    __os << __x.n(); +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           student_t_distribution<_RT>& __x) +{ +    typedef student_t_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __n; +    __is >> __n; +    if (!__is.fail()) +        __x.param(param_type(__n)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_STUDENT_T_DISTRIBUTION_H diff --git a/libcxx/include/__random/subtract_with_carry_engine.h b/libcxx/include/__random/subtract_with_carry_engine.h new file mode 100644 index 000000000000..073f84dccff6 --- /dev/null +++ b/libcxx/include/__random/subtract_with_carry_engine.h @@ -0,0 +1,352 @@ +//===----------------------------------------------------------------------===// +// +// 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_SUBTRACT_WITH_CARRY_ENGINE_H +#define _LIBCPP___RANDOM_SUBTRACT_WITH_CARRY_ENGINE_H + +#include <__algorithm/equal.h> +#include <__algorithm/min.h> +#include <__config> +#include <__random/is_seed_sequence.h> +#include <__random/linear_congruential_engine.h> +#include <cstddef> +#include <cstdint> +#include <iosfwd> +#include <limits> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine; + +template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +bool +operator==( +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); + +template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +_LIBCPP_INLINE_VISIBILITY +bool +operator!=( +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine +{ +public: +    // types +    typedef _UIntType result_type; + +private: +    result_type __x_[__r]; +    result_type  __c_; +    size_t      __i_; + +    static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; +    static_assert(  0 <  __w, "subtract_with_carry_engine invalid parameters"); +    static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters"); +    static_assert(  0 <  __s, "subtract_with_carry_engine invalid parameters"); +    static_assert(__s <  __r, "subtract_with_carry_engine invalid parameters"); +public: +    static _LIBCPP_CONSTEXPR const result_type _Min = 0; +    static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : +                                                      (result_type(1) << __w) - result_type(1); +    static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters"); + +    // engine characteristics +    static _LIBCPP_CONSTEXPR const size_t word_size = __w; +    static _LIBCPP_CONSTEXPR const size_t short_lag = __s; +    static _LIBCPP_CONSTEXPR const size_t long_lag = __r; +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } +    _LIBCPP_INLINE_VISIBILITY +    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } +    static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u; + +    // constructors and seeding functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    subtract_with_carry_engine() : subtract_with_carry_engine(default_seed) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit subtract_with_carry_engine(result_type __sd) { seed(__sd); } +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit subtract_with_carry_engine(result_type __sd = default_seed) { +      seed(__sd); +    } +#endif +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        explicit subtract_with_carry_engine(_Sseq& __q, +        typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0) +        {seed(__q);} +    _LIBCPP_INLINE_VISIBILITY +    void seed(result_type __sd = default_seed) +        {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());} +    template<class _Sseq> +        _LIBCPP_INLINE_VISIBILITY +        typename enable_if +        < +            __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value, +            void +        >::type +        seed(_Sseq& __q) +            {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} + +    // generating functions +    result_type operator()(); +    _LIBCPP_INLINE_VISIBILITY +    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} + +    template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +    friend +    bool +    operator==( +        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, +        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); + +    template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +    friend +    bool +    operator!=( +        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, +        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); + +    template <class _CharT, class _Traits, +              class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +    friend +    basic_ostream<_CharT, _Traits>& +    operator<<(basic_ostream<_CharT, _Traits>& __os, +               const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); + +    template <class _CharT, class _Traits, +              class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +    friend +    basic_istream<_CharT, _Traits>& +    operator>>(basic_istream<_CharT, _Traits>& __is, +               subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); + +private: + +    void seed(result_type __sd, integral_constant<unsigned, 1>); +    void seed(result_type __sd, integral_constant<unsigned, 2>); +    template<class _Sseq> +        void __seed(_Sseq& __q, integral_constant<unsigned, 1>); +    template<class _Sseq> +        void __seed(_Sseq& __q, integral_constant<unsigned, 2>); +}; + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +    _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size; + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +    _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag; + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +    _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag; + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +    _LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type +    subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed; + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, +        integral_constant<unsigned, 1>) +{ +    linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> +        __e(__sd == 0u ? default_seed : __sd); +    for (size_t __i = 0; __i < __r; ++__i) +        __x_[__i] = static_cast<result_type>(__e() & _Max); +    __c_ = __x_[__r-1] == 0; +    __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, +        integral_constant<unsigned, 2>) +{ +    linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> +        __e(__sd == 0u ? default_seed : __sd); +    for (size_t __i = 0; __i < __r; ++__i) +    { +        result_type __e0 = __e(); +        __x_[__i] = static_cast<result_type>( +                                    (__e0 + ((uint64_t)__e() << 32)) & _Max); +    } +    __c_ = __x_[__r-1] == 0; +    __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +template<class _Sseq> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, +        integral_constant<unsigned, 1>) +{ +    const unsigned __k = 1; +    uint32_t __ar[__r * __k]; +    __q.generate(__ar, __ar + __r * __k); +    for (size_t __i = 0; __i < __r; ++__i) +        __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); +    __c_ = __x_[__r-1] == 0; +    __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +template<class _Sseq> +void +subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, +        integral_constant<unsigned, 2>) +{ +    const unsigned __k = 2; +    uint32_t __ar[__r * __k]; +    __q.generate(__ar, __ar + __r * __k); +    for (size_t __i = 0; __i < __r; ++__i) +        __x_[__i] = static_cast<result_type>( +                  (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); +    __c_ = __x_[__r-1] == 0; +    __i_ = 0; +} + +template<class _UIntType, size_t __w, size_t __s, size_t __r> +_UIntType +subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()() +{ +    const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r]; +    result_type& __xr = __x_[__i_]; +    result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1; +    __xr = (__xs - __xr - __c_) & _Max; +    __c_ = __new_c; +    __i_ = (__i_ + 1) % __r; +    return __xr; +} + +template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +bool +operator==( +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y) +{ +    if (__x.__c_ != __y.__c_) +        return false; +    if (__x.__i_ == __y.__i_) +        return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_); +    if (__x.__i_ == 0 || __y.__i_ == 0) +    { +        size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_); +        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, +                         __y.__x_ + __y.__i_)) +            return false; +        if (__x.__i_ == 0) +            return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_); +        return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j); +    } +    if (__x.__i_ < __y.__i_) +    { +        size_t __j = _Rp - __y.__i_; +        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), +                         __y.__x_ + __y.__i_)) +            return false; +        if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp, +                         __y.__x_)) +            return false; +        return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, +                           __y.__x_ + (_Rp - (__x.__i_ + __j))); +    } +    size_t __j = _Rp - __x.__i_; +    if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), +                     __x.__x_ + __x.__i_)) +        return false; +    if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp, +                     __x.__x_)) +        return false; +    return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, +                       __x.__x_ + (_Rp - (__y.__i_ + __j))); +} + +template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +inline _LIBCPP_INLINE_VISIBILITY +bool +operator!=( +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, +    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y) +{ +    return !(__x == __y); +} + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _Ostream; +    __os.flags(_Ostream::dec | _Ostream::left); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.__x_[__x.__i_]; +    for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j) +        __os << __sp << __x.__x_[__j]; +    for (size_t __j = 0; __j < __x.__i_; ++__j) +        __os << __sp << __x.__x_[__j]; +    __os << __sp << __x.__c_; +    return __os; +} + +template <class _CharT, class _Traits, +          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    _UInt __t[_Rp+1]; +    for (size_t __i = 0; __i < _Rp+1; ++__i) +        __is >> __t[__i]; +    if (!__is.fail()) +    { +        for (size_t __i = 0; __i < _Rp; ++__i) +            __x.__x_[__i] = __t[__i]; +        __x.__c_ = __t[_Rp]; +        __x.__i_ = 0; +    } +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_SUBTRACT_WITH_CARRY_ENGINE_H diff --git a/libcxx/include/__random/uniform_int_distribution.h b/libcxx/include/__random/uniform_int_distribution.h index a7cfa1ec7305..55b4761637f0 100644 --- a/libcxx/include/__random/uniform_int_distribution.h +++ b/libcxx/include/__random/uniform_int_distribution.h @@ -11,6 +11,8 @@  #include <__bits>  #include <__config> +#include <__random/log2.h> +#include <bit>  #include <cstddef>  #include <cstdint>  #include <iosfwd> @@ -26,34 +28,6 @@ _LIBCPP_PUSH_MACROS  _LIBCPP_BEGIN_NAMESPACE_STD -// __independent_bits_engine - -template <unsigned long long _Xp, size_t _Rp> -struct __log2_imp -{ -    static const size_t value = _Xp & ((unsigned long long)(1) << _Rp) ? _Rp -                                           : __log2_imp<_Xp, _Rp - 1>::value; -}; - -template <unsigned long long _Xp> -struct __log2_imp<_Xp, 0> -{ -    static const size_t value = 0; -}; - -template <size_t _Rp> -struct __log2_imp<0, _Rp> -{ -    static const size_t value = _Rp + 1; -}; - -template <class _UIntType, _UIntType _Xp> -struct __log2 -{ -    static const size_t value = __log2_imp<_Xp, -                                         sizeof(_UIntType) * __CHAR_BIT__ - 1>::value; -}; -  template<class _Engine, class _UIntType>  class __independent_bits_engine  { @@ -181,7 +155,7 @@ __independent_bits_engine<_Engine, _UIntType>::__eval(true_type)      return _Sp;  } -template<class _IntType = int> +template<class _IntType = int> // __int128_t is also supported as an extension here  class uniform_int_distribution  {  public: @@ -256,8 +230,8 @@ typename uniform_int_distribution<_IntType>::result_type  uniform_int_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p)  _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK  { -    typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t), -                                            uint32_t, uint64_t>::type _UIntType; +    typedef typename conditional<sizeof(result_type) <= sizeof(uint32_t), uint32_t, +                                 typename make_unsigned<result_type>::type>::type _UIntType;      const _UIntType _Rp = _UIntType(__p.b()) - _UIntType(__p.a()) + _UIntType(1);      if (_Rp == 1)          return __p.a(); @@ -265,7 +239,7 @@ _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK      typedef __independent_bits_engine<_URNG, _UIntType> _Eng;      if (_Rp == 0)          return static_cast<result_type>(_Eng(__g, _Dt)()); -    size_t __w = _Dt - __libcpp_clz(_Rp) - 1; +    size_t __w = _Dt - __countl_zero(_Rp) - 1;      if ((_Rp & (numeric_limits<_UIntType>::max() >> (_Dt - __w))) != 0)          ++__w;      _Eng __e(__g, __w); diff --git a/libcxx/include/__random/uniform_random_bit_generator.h b/libcxx/include/__random/uniform_random_bit_generator.h new file mode 100644 index 000000000000..7b2f0df868d7 --- /dev/null +++ b/libcxx/include/__random/uniform_random_bit_generator.h @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// 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_UNIFORM_RANDOM_BIT_GENERATOR_H +#define _LIBCPP___RANDOM_UNIFORM_RANDOM_BIT_GENERATOR_H + +#include <__concepts/arithmetic.h> +#include <__concepts/invocable.h> +#include <__concepts/same_as.h> +#include <__config> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +// [rand.req.urng] +template<class _Gen> +concept uniform_random_bit_generator = +  invocable<_Gen&> && unsigned_integral<invoke_result_t<_Gen&>> && +  requires { +    { _Gen::min() } -> same_as<invoke_result_t<_Gen&>>; +    { _Gen::max() } -> same_as<invoke_result_t<_Gen&>>; +    requires bool_constant<(_Gen::min() < _Gen::max())>::value; +  }; + +#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_UNIFORM_RANDOM_BIT_GENERATOR_H diff --git a/libcxx/include/__random/uniform_real_distribution.h b/libcxx/include/__random/uniform_real_distribution.h new file mode 100644 index 000000000000..967e4e26fd0c --- /dev/null +++ b/libcxx/include/__random/uniform_real_distribution.h @@ -0,0 +1,160 @@ +//===----------------------------------------------------------------------===// +// +// 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_UNIFORM_REAL_DISTRIBUTION_H +#define _LIBCPP___RANDOM_UNIFORM_REAL_DISTRIBUTION_H + +#include <__config> +#include <__random/generate_canonical.h> +#include <iosfwd> +#include <limits> +#include <type_traits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS uniform_real_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __a_; +        result_type __b_; +    public: +        typedef uniform_real_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __a = 0, +                            result_type __b = 1) +            : __a_(__a), __b_(__b) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type a() const {return __a_;} +        _LIBCPP_INLINE_VISIBILITY +        result_type b() const {return __b_;} + +        friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} +        friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructors and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    uniform_real_distribution() : uniform_real_distribution(0) {} +    explicit uniform_real_distribution(result_type __a, result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type a() const {return __p_.a();} +    _LIBCPP_INLINE_VISIBILITY +    result_type b() const {return __p_.b();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return a();} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return b();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const uniform_real_distribution& __x, +                        const uniform_real_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const uniform_real_distribution& __x, +                        const uniform_real_distribution& __y) +        {return !(__x == __y);} +}; + +template<class _RealType> +template<class _URNG> +inline +typename uniform_real_distribution<_RealType>::result_type +uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) +{ +    return (__p.b() - __p.a()) +        * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g) +        + __p.a(); +} + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const uniform_real_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    return __os << __x.a() << __sp << __x.b(); +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           uniform_real_distribution<_RT>& __x) +{ +    typedef uniform_real_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __a; +    result_type __b; +    __is >> __a >> __b; +    if (!__is.fail()) +        __x.param(param_type(__a, __b)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_UNIFORM_REAL_DISTRIBUTION_H diff --git a/libcxx/include/__random/weibull_distribution.h b/libcxx/include/__random/weibull_distribution.h new file mode 100644 index 000000000000..4c5e4e8fff1c --- /dev/null +++ b/libcxx/include/__random/weibull_distribution.h @@ -0,0 +1,155 @@ +//===----------------------------------------------------------------------===// +// +// 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_WEIBULL_DISTRIBUTION_H +#define _LIBCPP___RANDOM_WEIBULL_DISTRIBUTION_H + +#include <__config> +#include <__random/exponential_distribution.h> +#include <cmath> +#include <iosfwd> +#include <limits> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<class _RealType = double> +class _LIBCPP_TEMPLATE_VIS weibull_distribution +{ +public: +    // types +    typedef _RealType result_type; + +    class _LIBCPP_TEMPLATE_VIS param_type +    { +        result_type __a_; +        result_type __b_; +    public: +        typedef weibull_distribution distribution_type; + +        _LIBCPP_INLINE_VISIBILITY +        explicit param_type(result_type __a = 1, result_type __b = 1) +            : __a_(__a), __b_(__b) {} + +        _LIBCPP_INLINE_VISIBILITY +        result_type a() const {return __a_;} +        _LIBCPP_INLINE_VISIBILITY +        result_type b() const {return __b_;} + +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator==(const param_type& __x, const param_type& __y) +            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} +        friend _LIBCPP_INLINE_VISIBILITY +            bool operator!=(const param_type& __x, const param_type& __y) +            {return !(__x == __y);} +    }; + +private: +    param_type __p_; + +public: +    // constructor and reset functions +#ifndef _LIBCPP_CXX03_LANG +    _LIBCPP_INLINE_VISIBILITY +    weibull_distribution() : weibull_distribution(1) {} +    _LIBCPP_INLINE_VISIBILITY +    explicit weibull_distribution(result_type __a, result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#else +    _LIBCPP_INLINE_VISIBILITY +    explicit weibull_distribution(result_type __a = 1, result_type __b = 1) +        : __p_(param_type(__a, __b)) {} +#endif +    _LIBCPP_INLINE_VISIBILITY +    explicit weibull_distribution(const param_type& __p) +        : __p_(__p) {} +    _LIBCPP_INLINE_VISIBILITY +    void reset() {} + +    // generating functions +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g) +        {return (*this)(__g, __p_);} +    template<class _URNG> +        _LIBCPP_INLINE_VISIBILITY +        result_type operator()(_URNG& __g, const param_type& __p) +        {return __p.b() * +            _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());} + +    // property functions +    _LIBCPP_INLINE_VISIBILITY +    result_type a() const {return __p_.a();} +    _LIBCPP_INLINE_VISIBILITY +    result_type b() const {return __p_.b();} + +    _LIBCPP_INLINE_VISIBILITY +    param_type param() const {return __p_;} +    _LIBCPP_INLINE_VISIBILITY +    void param(const param_type& __p) {__p_ = __p;} + +    _LIBCPP_INLINE_VISIBILITY +    result_type min() const {return 0;} +    _LIBCPP_INLINE_VISIBILITY +    result_type max() const {return numeric_limits<result_type>::infinity();} + +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator==(const weibull_distribution& __x, +                        const weibull_distribution& __y) +        {return __x.__p_ == __y.__p_;} +    friend _LIBCPP_INLINE_VISIBILITY +        bool operator!=(const weibull_distribution& __x, +                        const weibull_distribution& __y) +        {return !(__x == __y);} +}; + +template <class _CharT, class _Traits, class _RT> +basic_ostream<_CharT, _Traits>& +operator<<(basic_ostream<_CharT, _Traits>& __os, +           const weibull_distribution<_RT>& __x) +{ +    __save_flags<_CharT, _Traits> __lx(__os); +    typedef basic_ostream<_CharT, _Traits> _OStream; +    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | +               _OStream::scientific); +    _CharT __sp = __os.widen(' '); +    __os.fill(__sp); +    __os << __x.a() << __sp << __x.b(); +    return __os; +} + +template <class _CharT, class _Traits, class _RT> +basic_istream<_CharT, _Traits>& +operator>>(basic_istream<_CharT, _Traits>& __is, +           weibull_distribution<_RT>& __x) +{ +    typedef weibull_distribution<_RT> _Eng; +    typedef typename _Eng::result_type result_type; +    typedef typename _Eng::param_type param_type; +    __save_flags<_CharT, _Traits> __lx(__is); +    typedef basic_istream<_CharT, _Traits> _Istream; +    __is.flags(_Istream::dec | _Istream::skipws); +    result_type __a; +    result_type __b; +    __is >> __a >> __b; +    if (!__is.fail()) +        __x.param(param_type(__a, __b)); +    return __is; +} + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP___RANDOM_WEIBULL_DISTRIBUTION_H diff --git a/libcxx/include/__ranges/concepts.h b/libcxx/include/__ranges/concepts.h index dc1cece33b8d..6a8364006beb 100644 --- a/libcxx/include/__ranges/concepts.h +++ b/libcxx/include/__ranges/concepts.h @@ -16,8 +16,8 @@  #include <__iterator/iterator_traits.h>  #include <__iterator/readable_traits.h>  #include <__ranges/access.h> -#include <__ranges/enable_borrowed_range.h>  #include <__ranges/data.h> +#include <__ranges/enable_borrowed_range.h>  #include <__ranges/enable_view.h>  #include <__ranges/size.h>  #include <concepts> diff --git a/libcxx/include/__utility/priority_tag.h b/libcxx/include/__utility/priority_tag.h new file mode 100644 index 000000000000..45d9e5ec4c8f --- /dev/null +++ b/libcxx/include/__utility/priority_tag.h @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// 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___UTILITY_PRIORITY_TAG_H +#define _LIBCPP___UTILITY_PRIORITY_TAG_H + +#include <__config> +#include <cstddef> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +template<size_t _Ip> struct __priority_tag : __priority_tag<_Ip - 1> {}; +template<> struct __priority_tag<0> {}; + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___UTILITY_PRIORITY_TAG_H diff --git a/libcxx/include/bit b/libcxx/include/bit index 634475b99879..0aab83e7a6eb 100644 --- a/libcxx/include/bit +++ b/libcxx/include/bit @@ -14,9 +14,13 @@      bit synopsis  namespace std { -    // [bit.cast], bit_cast -    template<class To, class From> -      constexpr To bit_cast(const From& from) noexcept; // C++20 +  // [bit.cast], bit_cast +  template<class To, class From> +    constexpr To bit_cast(const From& from) noexcept; // C++20 + +  // [bit.byteswap], byteswap +  template<class T> +    constexpr T byteswap(T value) noexcept;      // C++23    // [bit.pow.two], integral powers of 2    template <class T> @@ -51,13 +55,14 @@ namespace std {      little = see below,        // C++20      big = see below,           // C++20      native = see below         // C++20 -}; +  };  } // namespace std  */  #include <__bit/bit_cast.h> +#include <__bit/byteswap.h>  #include <__bits> // __libcpp_clz  #include <__config>  #include <__debug> diff --git a/libcxx/include/compare b/libcxx/include/compare index 8a2a82907062..5c4578da0b89 100644 --- a/libcxx/include/compare +++ b/libcxx/include/compare @@ -140,25 +140,10 @@ namespace std {  #include <__compare/compare_three_way_result.h>  #include <__compare/is_eq.h>  #include <__compare/ordering.h> +#include <__compare/partial_order.h> +#include <__compare/strong_order.h>  #include <__compare/three_way_comparable.h> +#include <__compare/weak_order.h>  #include <__config> -#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER -#pragma GCC system_header -#endif - -_LIBCPP_BEGIN_NAMESPACE_STD - -#if _LIBCPP_STD_VER > 17 - -// [cmp.alg], comparison algorithms -// TODO: unimplemented -template<class _Tp> constexpr strong_ordering strong_order(const _Tp& __lhs, const _Tp& __rhs); -template<class _Tp> constexpr weak_ordering weak_order(const _Tp& __lhs, const _Tp& __rhs); -template<class _Tp> constexpr partial_ordering partial_order(const _Tp& __lhs, const _Tp& __rhs); - -#endif // _LIBCPP_STD_VER > 17 - -_LIBCPP_END_NAMESPACE_STD -  #endif // _LIBCPP_COMPARE diff --git a/libcxx/include/deque b/libcxx/include/deque index 9ab6ea748d53..e45d780e274f 100644 --- a/libcxx/include/deque +++ b/libcxx/include/deque @@ -915,16 +915,16 @@ class __deque_base      __deque_base(const __deque_base& __c);      __deque_base& operator=(const __deque_base& __c);  public: -    typedef _Allocator                               allocator_type; -    typedef allocator_traits<allocator_type>         __alloc_traits; -    typedef typename __alloc_traits::size_type       size_type; +    typedef _Allocator                                allocator_type; +    typedef allocator_traits<allocator_type>          __alloc_traits; +    typedef typename __alloc_traits::size_type        size_type; -    typedef _Tp                                      value_type; -    typedef value_type&                              reference; -    typedef const value_type&                        const_reference; -    typedef typename __alloc_traits::difference_type difference_type; -    typedef typename __alloc_traits::pointer         pointer; -    typedef typename __alloc_traits::const_pointer   const_pointer; +    typedef _Tp                                       value_type; +    typedef value_type&                               reference; +    typedef const value_type&                         const_reference; +    typedef typename __alloc_traits::difference_type  difference_type; +    typedef typename __alloc_traits::pointer          pointer; +    typedef typename __alloc_traits::const_pointer    const_pointer;      static const difference_type __block_size; @@ -1259,20 +1259,20 @@ public:      static_assert((is_same<typename allocator_type::value_type, value_type>::value),                    "Allocator::value_type must be same type as value_type"); -    typedef __deque_base<value_type, allocator_type>                 __base; +    typedef __deque_base<value_type, allocator_type>      __base; -    typedef typename __base::__alloc_traits                          __alloc_traits; -    typedef typename __base::reference                               reference; -    typedef typename __base::const_reference                         const_reference; -    typedef typename __base::iterator                                iterator; -    typedef typename __base::const_iterator                          const_iterator; -    typedef typename __allocator_traits<allocator_type>::size_type   size_type; -    typedef typename __base::difference_type                         difference_type; +    typedef typename __base::__alloc_traits               __alloc_traits; +    typedef typename __base::reference                    reference; +    typedef typename __base::const_reference              const_reference; +    typedef typename __base::iterator                     iterator; +    typedef typename __base::const_iterator               const_iterator; +    typedef typename __base::size_type                    size_type; +    typedef typename __base::difference_type              difference_type; -    typedef typename __base::pointer                                 pointer; -    typedef typename __base::const_pointer                           const_pointer; -    typedef _VSTD::reverse_iterator<iterator>                        reverse_iterator; -    typedef _VSTD::reverse_iterator<const_iterator>                  const_reverse_iterator; +    typedef typename __base::pointer                      pointer; +    typedef typename __base::const_pointer                const_pointer; +    typedef _VSTD::reverse_iterator<iterator>             reverse_iterator; +    typedef _VSTD::reverse_iterator<const_iterator>       const_reverse_iterator;      using typename __base::__deque_range;      using typename __base::__deque_block_range; @@ -1289,7 +1289,14 @@ public:      explicit deque(size_type __n, const _Allocator& __a);  #endif      deque(size_type __n, const value_type& __v); -    deque(size_type __n, const value_type& __v, const allocator_type& __a); + +    template <class = __enable_if_t<__is_allocator<_Allocator>::value> > +    deque(size_type __n, const value_type& __v, const allocator_type& __a) : __base(__a) +    { +        if (__n > 0) +            __append(__n, __v); +    } +      template <class _InputIter>          deque(_InputIter __f, _InputIter __l,                typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type* = 0); @@ -1609,14 +1616,6 @@ deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v)  }  template <class _Tp, class _Allocator> -deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a) -    : __base(__a) -{ -    if (__n > 0) -        __append(__n, __v); -} - -template <class _Tp, class _Allocator>  template <class _InputIter>  deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l,                typename enable_if<__is_cpp17_input_iterator<_InputIter>::value>::type*) diff --git a/libcxx/include/filesystem b/libcxx/include/filesystem index dcbdbbae6985..39e8ca2e814b 100644 --- a/libcxx/include/filesystem +++ b/libcxx/include/filesystem @@ -1033,7 +1033,7 @@ public:      auto __p_root_name = __p.__root_name();      auto __p_root_name_size = __p_root_name.size();      if (__p.is_absolute() || -        (!__p_root_name.empty() && __p_root_name != root_name())) { +        (!__p_root_name.empty() && __p_root_name != __string_view(root_name().__pn_))) {        __pn_ = __p.__pn_;        return *this;      } @@ -1492,22 +1492,22 @@ public:  #endif // !_LIBCPP_HAS_NO_LOCALIZATION    friend _LIBCPP_INLINE_VISIBILITY bool operator==(const path& __lhs, const path& __rhs) noexcept { -    return __lhs.compare(__rhs) == 0; +    return __lhs.__compare(__rhs.__pn_) == 0;    }    friend _LIBCPP_INLINE_VISIBILITY bool operator!=(const path& __lhs, const path& __rhs) noexcept { -    return __lhs.compare(__rhs) != 0; +    return __lhs.__compare(__rhs.__pn_) != 0;    }    friend _LIBCPP_INLINE_VISIBILITY bool operator<(const path& __lhs, const path& __rhs) noexcept { -    return __lhs.compare(__rhs) < 0; +    return __lhs.__compare(__rhs.__pn_) < 0;    }    friend _LIBCPP_INLINE_VISIBILITY bool operator<=(const path& __lhs, const path& __rhs) noexcept { -    return __lhs.compare(__rhs) <= 0; +    return __lhs.__compare(__rhs.__pn_) <= 0;    }    friend _LIBCPP_INLINE_VISIBILITY bool operator>(const path& __lhs, const path& __rhs) noexcept { -    return __lhs.compare(__rhs) > 0; +    return __lhs.__compare(__rhs.__pn_) > 0;    }    friend _LIBCPP_INLINE_VISIBILITY bool operator>=(const path& __lhs, const path& __rhs) noexcept { -    return __lhs.compare(__rhs) >= 0; +    return __lhs.__compare(__rhs.__pn_) >= 0;    }    friend _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, @@ -3024,13 +3024,17 @@ _LIBCPP_END_NAMESPACE_FILESYSTEM  #if !defined(_LIBCPP_HAS_NO_RANGES)  template <> +_LIBCPP_AVAILABILITY_FILESYSTEM  inline constexpr bool _VSTD::ranges::enable_borrowed_range<_VSTD_FS::directory_iterator> = true;  template <> +_LIBCPP_AVAILABILITY_FILESYSTEM  inline constexpr bool _VSTD::ranges::enable_borrowed_range<_VSTD_FS::recursive_directory_iterator> = true;  template <> +_LIBCPP_AVAILABILITY_FILESYSTEM  inline constexpr bool _VSTD::ranges::enable_view<_VSTD_FS::directory_iterator> = true;  template <> +_LIBCPP_AVAILABILITY_FILESYSTEM  inline constexpr bool _VSTD::ranges::enable_view<_VSTD_FS::recursive_directory_iterator> = true;  #endif diff --git a/libcxx/include/format b/libcxx/include/format index e1d47c9f84dd..788b9c299abc 100644 --- a/libcxx/include/format +++ b/libcxx/include/format @@ -51,9 +51,6 @@ namespace std {    using wformat_args = basic_format_args<wformat_context>; -  template<class Out, class charT> -    using format_args_t = basic_format_args<basic_format_context<Out, charT>>; -    // [format.functions], formatting functions    template<class... Args>      string format(string_view fmt, const Args&... args); @@ -79,17 +76,15 @@ namespace std {      Out format_to(Out out, const locale& loc, wstring_view fmt, const Args&... args);    template<class Out> -    Out vformat_to(Out out, string_view fmt, -                   format_args_t<type_identity_t<Out>, char> args); +    Out vformat_to(Out out, string_view fmt, format_args args);    template<class Out> -    Out vformat_to(Out out, wstring_view fmt, -                   format_args_t<type_identity_t<Out>, wchar_t> args); +    Out vformat_to(Out out, wstring_view fmt, wformat_args args);    template<class Out>      Out vformat_to(Out out, const locale& loc, string_view fmt, -                   format_args_t<type_identity_t<Out>, char> args); +                   format_args char> args);    template<class Out>      Out vformat_to(Out out, const locale& loc, wstring_view fmt, -                   format_args_t<type_identity_t<Out>, wchar_t> args); +                   wformat_args args);    template<class Out> struct format_to_n_result {      Out out; @@ -325,9 +320,6 @@ using format_args = basic_format_args<format_context>;  using wformat_args = basic_format_args<wformat_context>;  #endif -template <class _OutIt, class _CharT> -using format_args_t = basic_format_args<basic_format_context<_OutIt, _CharT>>; -  template <class _Context, class... _Args>  struct _LIBCPP_TEMPLATE_VIS __format_arg_store {    // TODO FMT Use a built-in array. @@ -436,51 +428,55 @@ __vformat_to(_ParseCtx&& __parse_ctx, _Ctx&& __ctx) {  } // namespace __format -template <class _OutIt, class _CharT> +template <class _OutIt, class _CharT, class _FormatOutIt>  requires(output_iterator<_OutIt, const _CharT&>) _LIBCPP_HIDE_FROM_ABI _OutIt -    __vformat_to(_OutIt __out_it, basic_string_view<_CharT> __fmt, -                 format_args_t<type_identity_t<_OutIt>, _CharT> __args) { -  return __format::__vformat_to( -      basic_format_parse_context{__fmt, __args.__size()}, -      _VSTD::__format_context_create(_VSTD::move(__out_it), __args)); +    __vformat_to( +        _OutIt __out_it, basic_string_view<_CharT> __fmt, +        basic_format_args<basic_format_context<_FormatOutIt, _CharT>> __args) { +  if constexpr (same_as<_OutIt, _FormatOutIt>) +    return _VSTD::__format::__vformat_to( +        basic_format_parse_context{__fmt, __args.__size()}, +        _VSTD::__format_context_create(_VSTD::move(__out_it), __args)); +  else { +    basic_string<_CharT> __str; +    _VSTD::__format::__vformat_to( +        basic_format_parse_context{__fmt, __args.__size()}, +        _VSTD::__format_context_create(_VSTD::back_inserter(__str), __args)); +    return _VSTD::copy_n(__str.begin(), __str.size(), _VSTD::move(__out_it)); +  }  }  template <output_iterator<const char&> _OutIt> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt -vformat_to(_OutIt __out_it, string_view __fmt, -           format_args_t<type_identity_t<_OutIt>, char> __args) { +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +vformat_to(_OutIt __out_it, string_view __fmt, format_args __args) {    return _VSTD::__vformat_to(_VSTD::move(__out_it), __fmt, __args);  }  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS  template <output_iterator<const wchar_t&> _OutIt> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt -vformat_to(_OutIt __out_it, wstring_view __fmt, -           format_args_t<type_identity_t<_OutIt>, wchar_t> __args) { +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +vformat_to(_OutIt __out_it, wstring_view __fmt, wformat_args __args) {    return _VSTD::__vformat_to(_VSTD::move(__out_it), __fmt, __args);  }  #endif  template <output_iterator<const char&> _OutIt, class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt  format_to(_OutIt __out_it, string_view __fmt, const _Args&... __args) { -  return _VSTD::vformat_to( -      _VSTD::move(__out_it), __fmt, -      _VSTD::make_format_args<basic_format_context<_OutIt, char>>(__args...)); +  return _VSTD::vformat_to(_VSTD::move(__out_it), __fmt, +                           _VSTD::make_format_args(__args...));  }  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS  template <output_iterator<const wchar_t&> _OutIt, class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt  format_to(_OutIt __out_it, wstring_view __fmt, const _Args&... __args) { -  return _VSTD::vformat_to( -      _VSTD::move(__out_it), __fmt, -      _VSTD::make_format_args<basic_format_context<_OutIt, wchar_t>>( -          __args...)); +  return _VSTD::vformat_to(_VSTD::move(__out_it), __fmt, +                           _VSTD::make_wformat_args(__args...));  }  #endif -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string  vformat(string_view __fmt, format_args __args) {    string __res;    _VSTD::vformat_to(_VSTD::back_inserter(__res), __fmt, __args); @@ -488,7 +484,7 @@ vformat(string_view __fmt, format_args __args) {  }  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring  vformat(wstring_view __fmt, wformat_args __args) {    wstring __res;    _VSTD::vformat_to(_VSTD::back_inserter(__res), __fmt, __args); @@ -497,14 +493,14 @@ vformat(wstring_view __fmt, wformat_args __args) {  #endif  template <class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string  format(string_view __fmt, const _Args&... __args) {    return _VSTD::vformat(__fmt, _VSTD::make_format_args(__args...));  }  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS  template <class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring  format(wstring_view __fmt, const _Args&... __args) {    return _VSTD::vformat(__fmt, _VSTD::make_wformat_args(__args...));  } @@ -556,54 +552,59 @@ formatted_size(wstring_view __fmt, const _Args&... __args) {  #ifndef _LIBCPP_HAS_NO_LOCALIZATION -template <class _OutIt, class _CharT> +template <class _OutIt, class _CharT, class _FormatOutIt>  requires(output_iterator<_OutIt, const _CharT&>) _LIBCPP_HIDE_FROM_ABI _OutIt -    __vformat_to(_OutIt __out_it, locale __loc, basic_string_view<_CharT> __fmt, -                 format_args_t<type_identity_t<_OutIt>, _CharT> __args) { -  return __format::__vformat_to( -      basic_format_parse_context{__fmt, __args.__size()}, -      _VSTD::__format_context_create(_VSTD::move(__out_it), __args, -                                     _VSTD::move(__loc))); +    __vformat_to( +        _OutIt __out_it, locale __loc, basic_string_view<_CharT> __fmt, +        basic_format_args<basic_format_context<_FormatOutIt, _CharT>> __args) { +  if constexpr (same_as<_OutIt, _FormatOutIt>) +    return _VSTD::__format::__vformat_to( +        basic_format_parse_context{__fmt, __args.__size()}, +        _VSTD::__format_context_create(_VSTD::move(__out_it), __args, +                                       _VSTD::move(__loc))); +  else { +    basic_string<_CharT> __str; +    _VSTD::__format::__vformat_to( +        basic_format_parse_context{__fmt, __args.__size()}, +        _VSTD::__format_context_create(_VSTD::back_inserter(__str), __args, +                                       _VSTD::move(__loc))); +    return _VSTD::copy_n(__str.begin(), __str.size(), _VSTD::move(__out_it)); +  }  }  template <output_iterator<const char&> _OutIt> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt -vformat_to(_OutIt __out_it, locale __loc, string_view __fmt, -           format_args_t<type_identity_t<_OutIt>, char> __args) { +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt vformat_to( +    _OutIt __out_it, locale __loc, string_view __fmt, format_args __args) {    return _VSTD::__vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt,                               __args);  }  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS  template <output_iterator<const wchar_t&> _OutIt> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt -vformat_to(_OutIt __out_it, locale __loc, wstring_view __fmt, -           format_args_t<type_identity_t<_OutIt>, wchar_t> __args) { +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt vformat_to( +    _OutIt __out_it, locale __loc, wstring_view __fmt, wformat_args __args) {    return _VSTD::__vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt,                               __args);  }  #endif  template <output_iterator<const char&> _OutIt, class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt format_to( +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt format_to(      _OutIt __out_it, locale __loc, string_view __fmt, const _Args&... __args) { -  return _VSTD::vformat_to( -      _VSTD::move(__out_it), _VSTD::move(__loc), __fmt, -      _VSTD::make_format_args<basic_format_context<_OutIt, char>>(__args...)); +  return _VSTD::vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt, +                           _VSTD::make_format_args(__args...));  }  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS  template <output_iterator<const wchar_t&> _OutIt, class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt format_to( +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt format_to(      _OutIt __out_it, locale __loc, wstring_view __fmt, const _Args&... __args) { -  return _VSTD::vformat_to( -      _VSTD::move(__out_it), _VSTD::move(__loc), __fmt, -      _VSTD::make_format_args<basic_format_context<_OutIt, wchar_t>>( -          __args...)); +  return _VSTD::vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt, +                           _VSTD::make_wformat_args(__args...));  }  #endif -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string  vformat(locale __loc, string_view __fmt, format_args __args) {    string __res;    _VSTD::vformat_to(_VSTD::back_inserter(__res), _VSTD::move(__loc), __fmt, @@ -612,7 +613,7 @@ vformat(locale __loc, string_view __fmt, format_args __args) {  }  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +_LIBCPP_ALWAYS_INLINE inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring  vformat(locale __loc, wstring_view __fmt, wformat_args __args) {    wstring __res;    _VSTD::vformat_to(_VSTD::back_inserter(__res), _VSTD::move(__loc), __fmt, @@ -622,7 +623,7 @@ vformat(locale __loc, wstring_view __fmt, wformat_args __args) {  #endif  template <class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string  format(locale __loc, string_view __fmt, const _Args&... __args) {    return _VSTD::vformat(_VSTD::move(__loc), __fmt,                          _VSTD::make_format_args(__args...)); @@ -630,7 +631,7 @@ format(locale __loc, string_view __fmt, const _Args&... __args) {  #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS  template <class... _Args> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring +_LIBCPP_ALWAYS_INLINE _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring  format(locale __loc, wstring_view __fmt, const _Args&... __args) {    return _VSTD::vformat(_VSTD::move(__loc), __fmt,                          _VSTD::make_wformat_args(__args...)); diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list index 9d19e741f061..34168e88746e 100644 --- a/libcxx/include/forward_list +++ b/libcxx/include/forward_list @@ -186,6 +186,7 @@ template <class T, class Allocator, class Predicate>  #include <iterator>  #include <limits>  #include <memory> +#include <type_traits>  #include <version>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -643,12 +644,12 @@ public:      static_assert((is_same<typename allocator_type::value_type, value_type>::value),                    "Allocator::value_type must be same type as value_type"); -    typedef value_type&                                                reference; -    typedef const value_type&                                          const_reference; -    typedef typename allocator_traits<allocator_type>::pointer         pointer; -    typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer; -    typedef typename __allocator_traits<allocator_type>::size_type     size_type; -    typedef typename allocator_traits<allocator_type>::difference_type difference_type; +    typedef value_type&                                                 reference; +    typedef const value_type&                                           const_reference; +    typedef typename allocator_traits<allocator_type>::pointer          pointer; +    typedef typename allocator_traits<allocator_type>::const_pointer    const_pointer; +    typedef typename allocator_traits<allocator_type>::size_type        size_type; +    typedef typename allocator_traits<allocator_type>::difference_type  difference_type;      typedef typename base::iterator       iterator;      typedef typename base::const_iterator const_iterator; @@ -669,7 +670,13 @@ public:      explicit forward_list(size_type __n, const allocator_type& __a);  #endif      forward_list(size_type __n, const value_type& __v); -    forward_list(size_type __n, const value_type& __v, const allocator_type& __a); + +    template <class = __enable_if_t<__is_allocator<_Alloc>::value> > +    forward_list(size_type __n, const value_type& __v, const allocator_type& __a) : base(__a) +    { +        insert_after(cbefore_begin(), __n, __v); +    } +      template <class _InputIterator>          forward_list(_InputIterator __f, _InputIterator __l,                       typename enable_if< @@ -944,14 +951,6 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v)  }  template <class _Tp, class _Alloc> -forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v, -                                        const allocator_type& __a) -    : base(__a) -{ -    insert_after(cbefore_begin(), __n, __v); -} - -template <class _Tp, class _Alloc>  template <class _InputIterator>  forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l,                                          typename enable_if< diff --git a/libcxx/include/list b/libcxx/include/list index 6282983ad20a..c9c050a4f1f0 100644 --- a/libcxx/include/list +++ b/libcxx/include/list @@ -845,24 +845,24 @@ class _LIBCPP_TEMPLATE_VIS list      typedef typename base::__link_pointer __link_pointer;  public: -    typedef _Tp                                                      value_type; -    typedef _Alloc                                                   allocator_type; +    typedef _Tp                                            value_type; +    typedef _Alloc                                         allocator_type;      static_assert((is_same<value_type, typename allocator_type::value_type>::value),                    "Invalid allocator::value_type"); -    typedef value_type&                                              reference; -    typedef const value_type&                                        const_reference; -    typedef typename base::pointer                                   pointer; -    typedef typename base::const_pointer                             const_pointer; -    typedef typename __allocator_traits<allocator_type>::size_type   size_type; -    typedef typename base::difference_type                           difference_type; -    typedef typename base::iterator                                  iterator; -    typedef typename base::const_iterator                            const_iterator; -    typedef _VSTD::reverse_iterator<iterator>                        reverse_iterator; -    typedef _VSTD::reverse_iterator<const_iterator>                  const_reverse_iterator; +    typedef value_type&                                    reference; +    typedef const value_type&                              const_reference; +    typedef typename base::pointer                         pointer; +    typedef typename base::const_pointer                   const_pointer; +    typedef typename base::size_type                       size_type; +    typedef typename base::difference_type                 difference_type; +    typedef typename base::iterator                        iterator; +    typedef typename base::const_iterator                  const_iterator; +    typedef _VSTD::reverse_iterator<iterator>              reverse_iterator; +    typedef _VSTD::reverse_iterator<const_iterator>        const_reverse_iterator;  #if _LIBCPP_STD_VER > 17 -    typedef size_type                                                __remove_return_type; +    typedef size_type                                      __remove_return_type;  #else -    typedef void                                                     __remove_return_type; +    typedef void                                           __remove_return_type;  #endif      _LIBCPP_INLINE_VISIBILITY @@ -885,7 +885,16 @@ public:      explicit list(size_type __n, const allocator_type& __a);  #endif      list(size_type __n, const value_type& __x); -    list(size_type __n, const value_type& __x, const allocator_type& __a); +    template <class = __enable_if_t<__is_allocator<_Alloc>::value> > +    list(size_type __n, const value_type& __x, const allocator_type& __a) : base(__a) +    { +#if _LIBCPP_DEBUG_LEVEL == 2 +        __get_db()->__insert_c(this); +#endif +        for (; __n > 0; --__n) +            push_back(__x); +    } +      template <class _InpIter>          list(_InpIter __f, _InpIter __l,               typename enable_if<__is_cpp17_input_iterator<_InpIter>::value>::type* = 0); @@ -1242,17 +1251,6 @@ list<_Tp, _Alloc>::list(size_type __n, const value_type& __x)  }  template <class _Tp, class _Alloc> -list<_Tp, _Alloc>::list(size_type __n, const value_type& __x, const allocator_type& __a) -    : base(__a) -{ -#if _LIBCPP_DEBUG_LEVEL == 2 -    __get_db()->__insert_c(this); -#endif -    for (; __n > 0; --__n) -        push_back(__x); -} - -template <class _Tp, class _Alloc>  template <class _InpIter>  list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l,                          typename enable_if<__is_cpp17_input_iterator<_InpIter>::value>::type*) diff --git a/libcxx/include/module.modulemap b/libcxx/include/module.modulemap index f34442ed5c9a..a4a264bd9147 100644 --- a/libcxx/include/module.modulemap +++ b/libcxx/include/module.modulemap @@ -338,6 +338,7 @@ module std [system] {      module __bit {        module bit_cast { private header "__bit/bit_cast.h" } +      module byteswap { private header "__bit/byteswap.h" }      }    }    module bitset { @@ -376,8 +377,11 @@ module std [system] {        module compare_three_way_result   { private header "__compare/compare_three_way_result.h"   }        module is_eq                      { private header "__compare/is_eq.h"                      }        module ordering                   { private header "__compare/ordering.h"                   } +      module partial_order              { private header "__compare/partial_order.h"              } +      module strong_order               { private header "__compare/strong_order.h"               }        module synth_three_way            { private header "__compare/synth_three_way.h"            }        module three_way_comparable       { private header "__compare/three_way_comparable.h"       } +      module weak_order                 { private header "__compare/weak_order.h"                 }      }    }    module complex { @@ -658,6 +662,22 @@ module std [system] {    module numeric {      header "numeric"      export * + +    module __numeric { +      module accumulate               { private header "__numeric/accumulate.h" } +      module adjacent_difference      { private header "__numeric/adjacent_difference.h" } +      module exclusive_scan           { private header "__numeric/exclusive_scan.h" } +      module gcd_lcm                  { private header "__numeric/gcd_lcm.h" } +      module inclusive_scan           { private header "__numeric/inclusive_scan.h" } +      module inner_product            { private header "__numeric/inner_product.h" } +      module iota                     { private header "__numeric/iota.h" } +      module midpoint                 { private header "__numeric/midpoint.h" } +      module partial_sum              { private header "__numeric/partial_sum.h" } +      module reduce                   { private header "__numeric/reduce.h" } +      module transform_exclusive_scan { private header "__numeric/transform_exclusive_scan.h" } +      module transform_inclusive_scan { private header "__numeric/transform_inclusive_scan.h" } +      module transform_reduce         { private header "__numeric/transform_reduce.h" } +    }    }    module optional {      header "optional" @@ -679,7 +699,41 @@ module std [system] {      export *      module __random { -      module uniform_int_distribution { private header "__random/uniform_int_distribution.h" } +      module bernoulli_distribution          { private header "__random/bernoulli_distribution.h"          } +      module binomial_distribution           { private header "__random/binomial_distribution.h"           } +      module cauchy_distribution             { private header "__random/cauchy_distribution.h"             } +      module chi_squared_distribution        { private header "__random/chi_squared_distribution.h"        } +      module default_random_engine           { private header "__random/default_random_engine.h"           } +      module discard_block_engine            { private header "__random/discard_block_engine.h"            } +      module discrete_distribution           { private header "__random/discrete_distribution.h"           } +      module exponential_distribution        { private header "__random/exponential_distribution.h"        } +      module extreme_value_distribution      { private header "__random/extreme_value_distribution.h"      } +      module fisher_f_distribution           { private header "__random/fisher_f_distribution.h"           } +      module gamma_distribution              { private header "__random/gamma_distribution.h"              } +      module generate_canonical              { private header "__random/generate_canonical.h"              } +      module geometric_distribution          { private header "__random/geometric_distribution.h"          } +      module independent_bits_engine         { private header "__random/independent_bits_engine.h"         } +      module is_seed_sequence                { private header "__random/is_seed_sequence.h"                } +      module knuth_b                         { private header "__random/knuth_b.h"                         } +      module linear_congruential_engine      { private header "__random/linear_congruential_engine.h"      } +      module log2                            { private header "__random/log2.h"                            } +      module lognormal_distribution          { private header "__random/lognormal_distribution.h"          } +      module mersenne_twister_engine         { private header "__random/mersenne_twister_engine.h"         } +      module negative_binomial_distribution  { private header "__random/negative_binomial_distribution.h"  } +      module normal_distribution             { private header "__random/normal_distribution.h"             } +      module piecewise_constant_distribution { private header "__random/piecewise_constant_distribution.h" } +      module piecewise_linear_distribution   { private header "__random/piecewise_linear_distribution.h"   } +      module poisson_distribution            { private header "__random/poisson_distribution.h"            } +      module random_device                   { private header "__random/random_device.h"                   } +      module ranlux                          { private header "__random/ranlux.h"                          } +      module seed_seq                        { private header "__random/seed_seq.h"                        } +      module shuffle_order_engine            { private header "__random/shuffle_order_engine.h"            } +      module student_t_distribution          { private header "__random/student_t_distribution.h"          } +      module subtract_with_carry_engine      { private header "__random/subtract_with_carry_engine.h"      } +      module uniform_int_distribution        { private header "__random/uniform_int_distribution.h"        } +      module uniform_random_bit_generator    { private header "__random/uniform_random_bit_generator.h"    } +      module uniform_real_distribution       { private header "__random/uniform_real_distribution.h"       } +      module weibull_distribution            { private header "__random/weibull_distribution.h"            }      }    }    module ranges { @@ -848,6 +902,7 @@ module std [system] {        module move                { private header "__utility/move.h"                }        module pair                { private header "__utility/pair.h"                }        module piecewise_construct { private header "__utility/piecewise_construct.h" } +      module priority_tag        { private header "__utility/priority_tag.h"        }        module rel_ops             { private header "__utility/rel_ops.h"             }        module swap                { private header "__utility/swap.h"                }        module to_underlying       { private header "__utility/to_underlying.h"       } diff --git a/libcxx/include/numeric b/libcxx/include/numeric index fc44efff761d..09d15a6024de 100644 --- a/libcxx/include/numeric +++ b/libcxx/include/numeric @@ -145,490 +145,29 @@ template<class T>  */  #include <__config> -#include <__debug>  #include <cmath> // for isnormal  #include <functional>  #include <iterator> -#include <limits> // for numeric_limits  #include <version> +#include <__numeric/accumulate.h> +#include <__numeric/adjacent_difference.h> +#include <__numeric/exclusive_scan.h> +#include <__numeric/gcd_lcm.h> +#include <__numeric/inclusive_scan.h> +#include <__numeric/inner_product.h> +#include <__numeric/iota.h> +#include <__numeric/midpoint.h> +#include <__numeric/partial_sum.h> +#include <__numeric/reduce.h> +#include <__numeric/transform_exclusive_scan.h> +#include <__numeric/transform_inclusive_scan.h> +#include <__numeric/transform_reduce.h> +  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)  #pragma GCC system_header  #endif -_LIBCPP_PUSH_MACROS -#include <__undef_macros> - -_LIBCPP_BEGIN_NAMESPACE_STD - -template <class _InputIterator, class _Tp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -accumulate(_InputIterator __first, _InputIterator __last, _Tp __init) -{ -    for (; __first != __last; ++__first) -#if _LIBCPP_STD_VER > 17 -        __init = _VSTD::move(__init) + *__first; -#else -        __init = __init + *__first; -#endif -    return __init; -} - -template <class _InputIterator, class _Tp, class _BinaryOperation> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -accumulate(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOperation __binary_op) -{ -    for (; __first != __last; ++__first) -#if _LIBCPP_STD_VER > 17 -        __init = __binary_op(_VSTD::move(__init), *__first); -#else -        __init = __binary_op(__init, *__first); -#endif -    return __init; -} - -#if _LIBCPP_STD_VER > 14 -template <class _InputIterator, class _Tp, class _BinaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -reduce(_InputIterator __first, _InputIterator __last, _Tp __init, _BinaryOp __b) -{ -    for (; __first != __last; ++__first) -        __init = __b(__init, *__first); -    return __init; -} - -template <class _InputIterator, class _Tp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -reduce(_InputIterator __first, _InputIterator __last, _Tp __init) -{ -    return _VSTD::reduce(__first, __last, __init, _VSTD::plus<>()); -} - -template <class _InputIterator> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -typename iterator_traits<_InputIterator>::value_type -reduce(_InputIterator __first, _InputIterator __last) -{ -    return _VSTD::reduce(__first, __last, -       typename iterator_traits<_InputIterator>::value_type{}); -} -#endif - -template <class _InputIterator1, class _InputIterator2, class _Tp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _Tp __init) -{ -    for (; __first1 != __last1; ++__first1, (void) ++__first2) -#if _LIBCPP_STD_VER > 17 -        __init = _VSTD::move(__init) + *__first1 * *__first2; -#else -        __init = __init + *__first1 * *__first2; -#endif -    return __init; -} - -template <class _InputIterator1, class _InputIterator2, class _Tp, class _BinaryOperation1, class _BinaryOperation2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -inner_product(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, -              _Tp __init, _BinaryOperation1 __binary_op1, _BinaryOperation2 __binary_op2) -{ -    for (; __first1 != __last1; ++__first1, (void) ++__first2) -#if _LIBCPP_STD_VER > 17 -        __init = __binary_op1(_VSTD::move(__init), __binary_op2(*__first1, *__first2)); -#else -        __init = __binary_op1(__init, __binary_op2(*__first1, *__first2)); -#endif -    return __init; -} - -#if _LIBCPP_STD_VER > 14 -template <class _InputIterator, class _Tp, class _BinaryOp, class _UnaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -transform_reduce(_InputIterator __first, _InputIterator __last, -           _Tp __init,  _BinaryOp __b, _UnaryOp __u) -{ -    for (; __first != __last; ++__first) -        __init = __b(__init, __u(*__first)); -    return __init; -} - -template <class _InputIterator1, class _InputIterator2, -          class _Tp, class _BinaryOp1, class _BinaryOp2> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -transform_reduce(_InputIterator1 __first1, _InputIterator1 __last1, -                 _InputIterator2 __first2, _Tp __init,  _BinaryOp1 __b1, _BinaryOp2 __b2) -{ -    for (; __first1 != __last1; ++__first1, (void) ++__first2) -        __init = __b1(__init, __b2(*__first1, *__first2)); -    return __init; -} - -template <class _InputIterator1, class _InputIterator2, class _Tp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_Tp -transform_reduce(_InputIterator1 __first1, _InputIterator1 __last1, -                 _InputIterator2 __first2, _Tp __init) -{ -    return _VSTD::transform_reduce(__first1, __last1, __first2, _VSTD::move(__init), -                                   _VSTD::plus<>(), _VSTD::multiplies<>()); -} -#endif - -template <class _InputIterator, class _OutputIterator> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result) -{ -    if (__first != __last) -    { -        typename iterator_traits<_InputIterator>::value_type __t(*__first); -        *__result = __t; -        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) -        { -#if _LIBCPP_STD_VER > 17 -            __t = _VSTD::move(__t) + *__first; -#else -            __t = __t + *__first; -#endif -            *__result = __t; -        } -    } -    return __result; -} - -template <class _InputIterator, class _OutputIterator, class _BinaryOperation> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -partial_sum(_InputIterator __first, _InputIterator __last, _OutputIterator __result, -              _BinaryOperation __binary_op) -{ -    if (__first != __last) -    { -        typename iterator_traits<_InputIterator>::value_type __t(*__first); -        *__result = __t; -        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) -        { -#if _LIBCPP_STD_VER > 17 -            __t = __binary_op(_VSTD::move(__t), *__first); -#else -            __t = __binary_op(__t, *__first); -#endif -            *__result = __t; -        } -    } -    return __result; -} - -#if _LIBCPP_STD_VER > 14 -template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -exclusive_scan(_InputIterator __first, _InputIterator __last, -               _OutputIterator __result, _Tp __init, _BinaryOp __b) -{ -    if (__first != __last) -    { -        _Tp __tmp(__b(__init, *__first)); -        while (true) -        { -            *__result = _VSTD::move(__init); -            ++__result; -            ++__first; -            if (__first == __last) -                break; -            __init = _VSTD::move(__tmp); -            __tmp = __b(__init, *__first); -        } -    } -    return __result; -} - -template <class _InputIterator, class _OutputIterator, class _Tp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -exclusive_scan(_InputIterator __first, _InputIterator __last, -               _OutputIterator __result, _Tp __init) -{ -    return _VSTD::exclusive_scan(__first, __last, __result, __init, _VSTD::plus<>()); -} - -template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last, -                               _OutputIterator __result, _BinaryOp __b,  _Tp __init) -{ -    for (; __first != __last; ++__first, (void) ++__result) { -        __init = __b(__init, *__first); -        *__result = __init; -    } -    return __result; -} - -template <class _InputIterator, class _OutputIterator, class _BinaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last, -                               _OutputIterator __result, _BinaryOp __b) -{ -    if (__first != __last) { -        typename iterator_traits<_InputIterator>::value_type __init = *__first; -        *__result++ = __init; -        if (++__first != __last) -            return _VSTD::inclusive_scan(__first, __last, __result, __b, __init); -    } - -    return __result; -} - -template <class _InputIterator, class _OutputIterator> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator inclusive_scan(_InputIterator __first, _InputIterator __last, -                               _OutputIterator __result) -{ -    return _VSTD::inclusive_scan(__first, __last, __result, _VSTD::plus<>()); -} - -template <class _InputIterator, class _OutputIterator, class _Tp, -          class _BinaryOp, class _UnaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -transform_exclusive_scan(_InputIterator __first, _InputIterator __last, -                           _OutputIterator __result, _Tp __init, -                           _BinaryOp __b, _UnaryOp __u) -{ -    if (__first != __last) -    { -        _Tp __saved = __init; -        do -        { -            __init = __b(__init, __u(*__first)); -            *__result = __saved; -            __saved = __init; -            ++__result; -        } while (++__first != __last); -    } -    return __result; -} - -template <class _InputIterator, class _OutputIterator, class _Tp, class _BinaryOp, class _UnaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -transform_inclusive_scan(_InputIterator __first, _InputIterator __last, -                           _OutputIterator __result, _BinaryOp __b, _UnaryOp __u, _Tp __init) -{ -    for (; __first != __last; ++__first, (void) ++__result) { -        __init = __b(__init, __u(*__first)); -        *__result = __init; -        } - -    return __result; -} - -template <class _InputIterator, class _OutputIterator, class _BinaryOp, class _UnaryOp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -transform_inclusive_scan(_InputIterator __first, _InputIterator __last, -                               _OutputIterator __result, _BinaryOp __b, _UnaryOp __u) -{ -    if (__first != __last) { -        typename iterator_traits<_InputIterator>::value_type __init = __u(*__first); -        *__result++ = __init; -        if (++__first != __last) -            return _VSTD::transform_inclusive_scan(__first, __last, __result, __b, __u, __init); -    } - -    return __result; -} -#endif - -template <class _InputIterator, class _OutputIterator> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result) -{ -    if (__first != __last) -    { -        typename iterator_traits<_InputIterator>::value_type __acc(*__first); -        *__result = __acc; -        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) -        { -            typename iterator_traits<_InputIterator>::value_type __val(*__first); -#if _LIBCPP_STD_VER > 17 -            *__result = __val - _VSTD::move(__acc); -#else -            *__result = __val - __acc; -#endif -            __acc = _VSTD::move(__val); -        } -    } -    return __result; -} - -template <class _InputIterator, class _OutputIterator, class _BinaryOperation> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -_OutputIterator -adjacent_difference(_InputIterator __first, _InputIterator __last, _OutputIterator __result, -                      _BinaryOperation __binary_op) -{ -    if (__first != __last) -    { -        typename iterator_traits<_InputIterator>::value_type __acc(*__first); -        *__result = __acc; -        for (++__first, (void) ++__result; __first != __last; ++__first, (void) ++__result) -        { -            typename iterator_traits<_InputIterator>::value_type __val(*__first); -#if _LIBCPP_STD_VER > 17 -            *__result = __binary_op(__val, _VSTD::move(__acc)); -#else -            *__result = __binary_op(__val, __acc); -#endif -            __acc = _VSTD::move(__val); -        } -    } -    return __result; -} - -template <class _ForwardIterator, class _Tp> -_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 -void -iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __value_) -{ -    for (; __first != __last; ++__first, (void) ++__value_) -        *__first = __value_; -} - - -#if _LIBCPP_STD_VER > 14 -template <typename _Result, typename _Source, bool _IsSigned = is_signed<_Source>::value> struct __ct_abs; - -template <typename _Result, typename _Source> -struct __ct_abs<_Result, _Source, true> { -    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY -    _Result operator()(_Source __t) const noexcept -    { -        if (__t >= 0) return __t; -        if (__t == numeric_limits<_Source>::min()) return -static_cast<_Result>(__t); -        return -__t; -    } -}; - -template <typename _Result, typename _Source> -struct __ct_abs<_Result, _Source, false> { -    _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY -    _Result operator()(_Source __t) const noexcept { return __t; } -}; - - -template<class _Tp> -_LIBCPP_CONSTEXPR _LIBCPP_HIDDEN -_Tp __gcd(_Tp __m, _Tp __n) -{ -    static_assert((!is_signed<_Tp>::value), ""); -    return __n == 0 ? __m : _VSTD::__gcd<_Tp>(__n, __m % __n); -} - - -template<class _Tp, class _Up> -_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY -common_type_t<_Tp,_Up> -gcd(_Tp __m, _Up __n) -{ -    static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to gcd must be integer types"); -    static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to gcd cannot be bool" ); -    static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to gcd cannot be bool" ); -    using _Rp = common_type_t<_Tp,_Up>; -    using _Wp = make_unsigned_t<_Rp>; -    return static_cast<_Rp>(_VSTD::__gcd( -        static_cast<_Wp>(__ct_abs<_Rp, _Tp>()(__m)), -        static_cast<_Wp>(__ct_abs<_Rp, _Up>()(__n)))); -} - -template<class _Tp, class _Up> -_LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY -common_type_t<_Tp,_Up> -lcm(_Tp __m, _Up __n) -{ -    static_assert((is_integral<_Tp>::value && is_integral<_Up>::value), "Arguments to lcm must be integer types"); -    static_assert((!is_same<typename remove_cv<_Tp>::type, bool>::value), "First argument to lcm cannot be bool" ); -    static_assert((!is_same<typename remove_cv<_Up>::type, bool>::value), "Second argument to lcm cannot be bool" ); -    if (__m == 0 || __n == 0) -        return 0; - -    using _Rp = common_type_t<_Tp,_Up>; -    _Rp __val1 = __ct_abs<_Rp, _Tp>()(__m) / _VSTD::gcd(__m, __n); -    _Rp __val2 = __ct_abs<_Rp, _Up>()(__n); -    _LIBCPP_ASSERT((numeric_limits<_Rp>::max() / __val1 > __val2), "Overflow in lcm"); -    return __val1 * __val2; -} - -#endif /* _LIBCPP_STD_VER > 14 */ - -#if _LIBCPP_STD_VER > 17 -template <class _Tp> -_LIBCPP_INLINE_VISIBILITY constexpr -enable_if_t<is_integral_v<_Tp> && !is_same_v<bool, _Tp> && !is_null_pointer_v<_Tp>, _Tp> -midpoint(_Tp __a, _Tp __b) noexcept -_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK -{ -    using _Up = make_unsigned_t<_Tp>; -    constexpr _Up __bitshift = numeric_limits<_Up>::digits - 1; - -    _Up __diff = _Up(__b) - _Up(__a); -    _Up __sign_bit = __b < __a; - -    _Up __half_diff = (__diff / 2) + (__sign_bit << __bitshift) + (__sign_bit & __diff); - -    return __a + __half_diff; -} - - -template <class _TPtr> -_LIBCPP_INLINE_VISIBILITY constexpr -enable_if_t<is_pointer_v<_TPtr> -             && is_object_v<remove_pointer_t<_TPtr>> -             && ! is_void_v<remove_pointer_t<_TPtr>> -             && (sizeof(remove_pointer_t<_TPtr>) > 0), _TPtr> -midpoint(_TPtr __a, _TPtr __b) noexcept -{ -    return __a + _VSTD::midpoint(ptrdiff_t(0), __b - __a); -} - - -template <typename _Tp> -constexpr int __sign(_Tp __val) { -    return (_Tp(0) < __val) - (__val < _Tp(0)); -} - -template <typename _Fp> -constexpr _Fp __fp_abs(_Fp __f) { return __f >= 0 ? __f : -__f; } - -template <class _Fp> -_LIBCPP_INLINE_VISIBILITY constexpr -enable_if_t<is_floating_point_v<_Fp>, _Fp> -midpoint(_Fp __a, _Fp __b) noexcept -{ -    constexpr _Fp __lo = numeric_limits<_Fp>::min()*2; -    constexpr _Fp __hi = numeric_limits<_Fp>::max()/2; -    return __fp_abs(__a) <= __hi && __fp_abs(__b) <= __hi ?  // typical case: overflow is impossible -      (__a + __b)/2 :                                        // always correctly rounded -      __fp_abs(__a) < __lo ? __a + __b/2 :                   // not safe to halve a -      __fp_abs(__b) < __lo ? __a/2 + __b :                   // not safe to halve b -      __a/2 + __b/2;                                         // otherwise correctly rounded -} - -#endif // _LIBCPP_STD_VER > 17 - -_LIBCPP_END_NAMESPACE_STD - -_LIBCPP_POP_MACROS -  #if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17  #   include <__pstl_numeric>  #endif diff --git a/libcxx/include/random b/libcxx/include/random index 72d9855765f8..9eb70bac00b9 100644 --- a/libcxx/include/random +++ b/libcxx/include/random @@ -1678,5330 +1678,56 @@ class piecewise_linear_distribution  */  #include <__config> +#include <__random/bernoulli_distribution.h> +#include <__random/binomial_distribution.h> +#include <__random/cauchy_distribution.h> +#include <__random/chi_squared_distribution.h> +#include <__random/default_random_engine.h> +#include <__random/discard_block_engine.h> +#include <__random/discrete_distribution.h> +#include <__random/exponential_distribution.h> +#include <__random/extreme_value_distribution.h> +#include <__random/fisher_f_distribution.h> +#include <__random/gamma_distribution.h> +#include <__random/generate_canonical.h> +#include <__random/geometric_distribution.h> +#include <__random/independent_bits_engine.h> +#include <__random/is_seed_sequence.h> +#include <__random/knuth_b.h> +#include <__random/linear_congruential_engine.h> +#include <__random/log2.h> +#include <__random/lognormal_distribution.h> +#include <__random/mersenne_twister_engine.h> +#include <__random/negative_binomial_distribution.h> +#include <__random/normal_distribution.h> +#include <__random/piecewise_constant_distribution.h> +#include <__random/piecewise_linear_distribution.h> +#include <__random/poisson_distribution.h> +#include <__random/random_device.h> +#include <__random/ranlux.h> +#include <__random/seed_seq.h> +#include <__random/shuffle_order_engine.h> +#include <__random/student_t_distribution.h> +#include <__random/subtract_with_carry_engine.h>  #include <__random/uniform_int_distribution.h> -#include <algorithm> -#include <cmath> -#include <concepts> -#include <cstddef> -#include <cstdint> +#include <__random/uniform_random_bit_generator.h> +#include <__random/uniform_real_distribution.h> +#include <__random/weibull_distribution.h>  #include <initializer_list> -#include <iosfwd> -#include <limits> -#include <numeric> -#include <string> -#include <type_traits> -#include <vector> + +#include <algorithm>   // for backward compatibility; TODO remove it +#include <cmath>       // for backward compatibility; TODO remove it +#include <cstddef>     // for backward compatibility; TODO remove it +#include <cstdint>     // for backward compatibility; TODO remove it +#include <iosfwd>      // for backward compatibility; TODO remove it +#include <limits>      // for backward compatibility; TODO remove it +#include <numeric>     // for backward compatibility; TODO remove it +#include <string>      // for backward compatibility; TODO remove it +#include <type_traits> // for backward compatibility; TODO remove it +#include <vector>      // for backward compatibility; TODO remove it  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)  #pragma GCC system_header  #endif -_LIBCPP_PUSH_MACROS -#include <__undef_macros> - - -_LIBCPP_BEGIN_NAMESPACE_STD - -#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) - -// [rand.req.urng] -template<class _Gen> -concept uniform_random_bit_generator = -  invocable<_Gen&> && unsigned_integral<invoke_result_t<_Gen&>> && -  requires { -    { _Gen::min() } -> same_as<invoke_result_t<_Gen&>>; -    { _Gen::max() } -> same_as<invoke_result_t<_Gen&>>; -    requires bool_constant<(_Gen::min() < _Gen::max())>::value; -  }; - -#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CONCEPTS) - -// __is_seed_sequence - -template <class _Sseq, class _Engine> -struct __is_seed_sequence -{ -    static _LIBCPP_CONSTEXPR const bool value = -              !is_convertible<_Sseq, typename _Engine::result_type>::value && -              !is_same<typename remove_cv<_Sseq>::type, _Engine>::value; -}; - -// linear_congruential_engine - -template <unsigned long long __a, unsigned long long __c, -          unsigned long long __m, unsigned long long _Mp, -          bool _MightOverflow = (__a != 0 && __m != 0 && __m-1 > (_Mp-__c)/__a), -          bool _OverflowOK = ((__m | (__m-1)) > __m), // m = 2^n -          bool _SchrageOK = (__a != 0 && __m != 0 && __m % __a <= __m / __a)> // r <= q -struct __lce_alg_picker -{ -    static_assert(__a != 0 || __m != 0 || !_MightOverflow || _OverflowOK || _SchrageOK, -                  "The current values of a, c, and m cannot generate a number " -                  "within bounds of linear_congruential_engine."); - -    static _LIBCPP_CONSTEXPR const bool __use_schrage = _MightOverflow && -                                                        !_OverflowOK && -                                                        _SchrageOK; -}; - -template <unsigned long long __a, unsigned long long __c, -          unsigned long long __m, unsigned long long _Mp, -          bool _UseSchrage = __lce_alg_picker<__a, __c, __m, _Mp>::__use_schrage> -struct __lce_ta; - -// 64 - -template <unsigned long long __a, unsigned long long __c, unsigned long long __m> -struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), true> -{ -    typedef unsigned long long result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        // Schrage's algorithm -        const result_type __q = __m / __a; -        const result_type __r = __m % __a; -        const result_type __t0 = __a * (__x % __q); -        const result_type __t1 = __r * (__x / __q); -        __x = __t0 + (__t0 < __t1) * __m - __t1; -        __x += __c - (__x >= __m - __c) * __m; -        return __x; -    } -}; - -template <unsigned long long __a, unsigned long long __m> -struct __lce_ta<__a, 0, __m, (unsigned long long)(~0), true> -{ -    typedef unsigned long long result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        // Schrage's algorithm -        const result_type __q = __m / __a; -        const result_type __r = __m % __a; -        const result_type __t0 = __a * (__x % __q); -        const result_type __t1 = __r * (__x / __q); -        __x = __t0 + (__t0 < __t1) * __m - __t1; -        return __x; -    } -}; - -template <unsigned long long __a, unsigned long long __c, unsigned long long __m> -struct __lce_ta<__a, __c, __m, (unsigned long long)(~0), false> -{ -    typedef unsigned long long result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        return (__a * __x + __c) % __m; -    } -}; - -template <unsigned long long __a, unsigned long long __c> -struct __lce_ta<__a, __c, 0, (unsigned long long)(~0), false> -{ -    typedef unsigned long long result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        return __a * __x + __c; -    } -}; - -// 32 - -template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> -struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), true> -{ -    typedef unsigned result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        const result_type __a = static_cast<result_type>(_Ap); -        const result_type __c = static_cast<result_type>(_Cp); -        const result_type __m = static_cast<result_type>(_Mp); -        // Schrage's algorithm -        const result_type __q = __m / __a; -        const result_type __r = __m % __a; -        const result_type __t0 = __a * (__x % __q); -        const result_type __t1 = __r * (__x / __q); -        __x = __t0 + (__t0 < __t1) * __m - __t1; -        __x += __c - (__x >= __m - __c) * __m; -        return __x; -    } -}; - -template <unsigned long long _Ap, unsigned long long _Mp> -struct __lce_ta<_Ap, 0, _Mp, unsigned(~0), true> -{ -    typedef unsigned result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        const result_type __a = static_cast<result_type>(_Ap); -        const result_type __m = static_cast<result_type>(_Mp); -        // Schrage's algorithm -        const result_type __q = __m / __a; -        const result_type __r = __m % __a; -        const result_type __t0 = __a * (__x % __q); -        const result_type __t1 = __r * (__x / __q); -        __x = __t0 + (__t0 < __t1) * __m - __t1; -        return __x; -    } -}; - -template <unsigned long long _Ap, unsigned long long _Cp, unsigned long long _Mp> -struct __lce_ta<_Ap, _Cp, _Mp, unsigned(~0), false> -{ -    typedef unsigned result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        const result_type __a = static_cast<result_type>(_Ap); -        const result_type __c = static_cast<result_type>(_Cp); -        const result_type __m = static_cast<result_type>(_Mp); -        return (__a * __x + __c) % __m; -    } -}; - -template <unsigned long long _Ap, unsigned long long _Cp> -struct __lce_ta<_Ap, _Cp, 0, unsigned(~0), false> -{ -    typedef unsigned result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        const result_type __a = static_cast<result_type>(_Ap); -        const result_type __c = static_cast<result_type>(_Cp); -        return __a * __x + __c; -    } -}; - -// 16 - -template <unsigned long long __a, unsigned long long __c, unsigned long long __m, bool __b> -struct __lce_ta<__a, __c, __m, (unsigned short)(~0), __b> -{ -    typedef unsigned short result_type; -    _LIBCPP_INLINE_VISIBILITY -    static result_type next(result_type __x) -    { -        return static_cast<result_type>(__lce_ta<__a, __c, __m, unsigned(~0)>::next(__x)); -    } -}; - -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_INLINE_VISIBILITY -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> -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 -{ -public: -    // types -    typedef _UIntType result_type; - -private: -    result_type __x_; - -    static _LIBCPP_CONSTEXPR const result_type _Mp = result_type(~0); - -    static_assert(__m == 0 || __a < __m, "linear_congruential_engine invalid parameters"); -    static_assert(__m == 0 || __c < __m, "linear_congruential_engine invalid parameters"); -    static_assert(is_unsigned<_UIntType>::value, "_UIntType must be unsigned type"); -public: -    static _LIBCPP_CONSTEXPR const result_type _Min = __c == 0u ? 1u: 0u; -    static _LIBCPP_CONSTEXPR const result_type _Max = __m - 1u; -    static_assert(_Min < _Max,           "linear_congruential_engine invalid parameters"); - -    // engine characteristics -    static _LIBCPP_CONSTEXPR const result_type multiplier = __a; -    static _LIBCPP_CONSTEXPR const result_type increment = __c; -    static _LIBCPP_CONSTEXPR const result_type modulus = __m; -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type min() {return _Min;} -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type max() {return _Max;} -    static _LIBCPP_CONSTEXPR const result_type default_seed = 1u; - -    // constructors and seeding functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    linear_congruential_engine() : linear_congruential_engine(default_seed) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit linear_congruential_engine(result_type __s) { seed(__s); } -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit linear_congruential_engine(result_type __s = default_seed) { -      seed(__s); -    } -#endif -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        explicit linear_congruential_engine(_Sseq& __q, -        typename enable_if<__is_seed_sequence<_Sseq, linear_congruential_engine>::value>::type* = 0) -        {seed(__q);} -    _LIBCPP_INLINE_VISIBILITY -    void seed(result_type __s = default_seed) -        {seed(integral_constant<bool, __m == 0>(), -              integral_constant<bool, __c == 0>(), __s);} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            __is_seed_sequence<_Sseq, linear_congruential_engine>::value, -            void -        >::type -        seed(_Sseq& __q) -            {__seed(__q, integral_constant<unsigned, -                1 + (__m == 0 ? (sizeof(result_type) * __CHAR_BIT__ - 1)/32 -                             :  (__m > 0x100000000ull))>());} - -    // generating functions -    _LIBCPP_INLINE_VISIBILITY -    result_type operator()() -        {return __x_ = static_cast<result_type>(__lce_ta<__a, __c, __m, _Mp>::next(__x_));} -    _LIBCPP_INLINE_VISIBILITY -    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} - -    friend _LIBCPP_INLINE_VISIBILITY -    bool operator==(const linear_congruential_engine& __x, -                    const linear_congruential_engine& __y) -        {return __x.__x_ == __y.__x_;} -    friend _LIBCPP_INLINE_VISIBILITY -    bool operator!=(const linear_congruential_engine& __x, -                    const linear_congruential_engine& __y) -        {return !(__x == __y);} - -private: - -    _LIBCPP_INLINE_VISIBILITY -    void seed(true_type, true_type, result_type __s) {__x_ = __s == 0 ? 1 : __s;} -    _LIBCPP_INLINE_VISIBILITY -    void seed(true_type, false_type, result_type __s) {__x_ = __s;} -    _LIBCPP_INLINE_VISIBILITY -    void seed(false_type, true_type, result_type __s) {__x_ = __s % __m == 0 ? -                                                                 1 : __s % __m;} -    _LIBCPP_INLINE_VISIBILITY -    void seed(false_type, false_type, result_type __s) {__x_ = __s % __m;} - -    template<class _Sseq> -        void __seed(_Sseq& __q, integral_constant<unsigned, 1>); -    template<class _Sseq> -        void __seed(_Sseq& __q, integral_constant<unsigned, 2>); - -    template <class _CharT, class _Traits, -              class _Up, _Up _Ap, _Up _Cp, _Up _Np> -    friend -    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> -    friend -    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> -    _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>) -{ -    const unsigned __k = 1; -    uint32_t __ar[__k+3]; -    __q.generate(__ar, __ar + __k + 3); -    result_type __s = static_cast<result_type>(__ar[3] % __m); -    __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; -} - -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>) -{ -    const unsigned __k = 2; -    uint32_t __ar[__k+3]; -    __q.generate(__ar, __ar + __k + 3); -    result_type __s = static_cast<result_type>((__ar[3] + -                                              ((uint64_t)__ar[4] << 32)) % __m); -    __x_ = __c == 0 && __s == 0 ? result_type(1) : __s; -} - -template <class _CharT, class _Traits, -          class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> -inline _LIBCPP_INLINE_VISIBILITY -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const linear_congruential_engine<_UIntType, __a, __c, __m>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _Ostream; -    __os.flags(_Ostream::dec | _Ostream::left); -    __os.fill(__os.widen(' ')); -    return __os << __x.__x_; -} - -template <class _CharT, class _Traits, -          class _UIntType, _UIntType __a, _UIntType __c, _UIntType __m> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           linear_congruential_engine<_UIntType, __a, __c, __m>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    _UIntType __t; -    __is >> __t; -    if (!__is.fail()) -        __x.__x_ = __t; -    return __is; -} - -typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> -                                                                   minstd_rand0; -typedef linear_congruential_engine<uint_fast32_t, 48271, 0, 2147483647> -                                                                    minstd_rand; -typedef minstd_rand                                       default_random_engine; -// mersenne_twister_engine - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine; - -template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -bool -operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, -           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y); - -template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -_LIBCPP_INLINE_VISIBILITY -bool -operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, -           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y); - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x); - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                   _Bp, _Tp, _Cp, _Lp, _Fp>& __x); - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -class _LIBCPP_TEMPLATE_VIS mersenne_twister_engine -{ -public: -    // types -    typedef _UIntType result_type; - -private: -    result_type __x_[__n]; -    size_t      __i_; - -    static_assert(  0 <  __m, "mersenne_twister_engine invalid parameters"); -    static_assert(__m <= __n, "mersenne_twister_engine invalid parameters"); -    static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; -    static_assert(__w <= _Dt, "mersenne_twister_engine invalid parameters"); -    static_assert(  2 <= __w, "mersenne_twister_engine invalid parameters"); -    static_assert(__r <= __w, "mersenne_twister_engine invalid parameters"); -    static_assert(__u <= __w, "mersenne_twister_engine invalid parameters"); -    static_assert(__s <= __w, "mersenne_twister_engine invalid parameters"); -    static_assert(__t <= __w, "mersenne_twister_engine invalid parameters"); -    static_assert(__l <= __w, "mersenne_twister_engine invalid parameters"); -public: -    static _LIBCPP_CONSTEXPR const result_type _Min = 0; -    static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : -                                                      (result_type(1) << __w) - result_type(1); -    static_assert(_Min < _Max, "mersenne_twister_engine invalid parameters"); -    static_assert(__a <= _Max, "mersenne_twister_engine invalid parameters"); -    static_assert(__b <= _Max, "mersenne_twister_engine invalid parameters"); -    static_assert(__c <= _Max, "mersenne_twister_engine invalid parameters"); -    static_assert(__d <= _Max, "mersenne_twister_engine invalid parameters"); -    static_assert(__f <= _Max, "mersenne_twister_engine invalid parameters"); - -    // engine characteristics -    static _LIBCPP_CONSTEXPR const size_t word_size = __w; -    static _LIBCPP_CONSTEXPR const size_t state_size = __n; -    static _LIBCPP_CONSTEXPR const size_t shift_size = __m; -    static _LIBCPP_CONSTEXPR const size_t mask_bits = __r; -    static _LIBCPP_CONSTEXPR const result_type xor_mask = __a; -    static _LIBCPP_CONSTEXPR const size_t tempering_u = __u; -    static _LIBCPP_CONSTEXPR const result_type tempering_d = __d; -    static _LIBCPP_CONSTEXPR const size_t tempering_s = __s; -    static _LIBCPP_CONSTEXPR const result_type tempering_b = __b; -    static _LIBCPP_CONSTEXPR const size_t tempering_t = __t; -    static _LIBCPP_CONSTEXPR const result_type tempering_c = __c; -    static _LIBCPP_CONSTEXPR const size_t tempering_l = __l; -    static _LIBCPP_CONSTEXPR const result_type initialization_multiplier = __f; -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } -    static _LIBCPP_CONSTEXPR const result_type default_seed = 5489u; - -    // constructors and seeding functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    mersenne_twister_engine() : mersenne_twister_engine(default_seed) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit mersenne_twister_engine(result_type __sd) { seed(__sd); } -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit mersenne_twister_engine(result_type __sd = default_seed) { -      seed(__sd); -    } -#endif -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        explicit mersenne_twister_engine(_Sseq& __q, -        typename enable_if<__is_seed_sequence<_Sseq, mersenne_twister_engine>::value>::type* = 0) -        {seed(__q);} -    void seed(result_type __sd = default_seed); -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            __is_seed_sequence<_Sseq, mersenne_twister_engine>::value, -            void -        >::type -        seed(_Sseq& __q) -            {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} - -    // generating functions -    result_type operator()(); -    _LIBCPP_INLINE_VISIBILITY -    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} - -    template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -    friend -    bool -    operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __x, -               const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __y); - -    template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -    friend -    bool -    operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __x, -               const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __y); - -    template <class _CharT, class _Traits, -              class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                             _Bp, _Tp, _Cp, _Lp, _Fp>& __x); - -    template <class _CharT, class _Traits, -              class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -              _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -              _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                       _Bp, _Tp, _Cp, _Lp, _Fp>& __x); -private: - -    template<class _Sseq> -        void __seed(_Sseq& __q, integral_constant<unsigned, 1>); -    template<class _Sseq> -        void __seed(_Sseq& __q, integral_constant<unsigned, 2>); - -    template <size_t __count> -        _LIBCPP_INLINE_VISIBILITY -        static -        typename enable_if -        < -            __count < __w, -            result_type -        >::type -        __lshift(result_type __x) {return (__x << __count) & _Max;} - -    template <size_t __count> -        _LIBCPP_INLINE_VISIBILITY -        static -        typename enable_if -        < -            (__count >= __w), -            result_type -        >::type -        __lshift(result_type) {return result_type(0);} - -    template <size_t __count> -        _LIBCPP_INLINE_VISIBILITY -        static -        typename enable_if -        < -            __count < _Dt, -            result_type -        >::type -        __rshift(result_type __x) {return __x >> __count;} - -    template <size_t __count> -        _LIBCPP_INLINE_VISIBILITY -        static -        typename enable_if -        < -            (__count >= _Dt), -            result_type -        >::type -        __rshift(result_type) {return result_type(0);} -}; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::word_size; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::state_size; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::shift_size; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::mask_bits; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::xor_mask; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_u; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_d; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_s; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_b; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_t; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_c; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const size_t -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::tempering_l; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::initialization_multiplier; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -    _LIBCPP_CONSTEXPR const typename mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::result_type -    mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, __t, __c, __l, __f>::default_seed; - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -void -mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, -    __t, __c, __l, __f>::seed(result_type __sd) -    _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK -{   // __w >= 2 -    __x_[0] = __sd & _Max; -    for (size_t __i = 1; __i < __n; ++__i) -        __x_[__i] = (__f * (__x_[__i-1] ^ __rshift<__w - 2>(__x_[__i-1])) + __i) & _Max; -    __i_ = 0; -} - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -template<class _Sseq> -void -mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, -    __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 1>) -{ -    const unsigned __k = 1; -    uint32_t __ar[__n * __k]; -    __q.generate(__ar, __ar + __n * __k); -    for (size_t __i = 0; __i < __n; ++__i) -        __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); -    const result_type __mask = __r == _Dt ? result_type(~0) : -                                       (result_type(1) << __r) - result_type(1); -    __i_ = 0; -    if ((__x_[0] & ~__mask) == 0) -    { -        for (size_t __i = 1; __i < __n; ++__i) -            if (__x_[__i] != 0) -                return; -        __x_[0] = result_type(1) << (__w - 1); -    } -} - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -template<class _Sseq> -void -mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, -    __t, __c, __l, __f>::__seed(_Sseq& __q, integral_constant<unsigned, 2>) -{ -    const unsigned __k = 2; -    uint32_t __ar[__n * __k]; -    __q.generate(__ar, __ar + __n * __k); -    for (size_t __i = 0; __i < __n; ++__i) -        __x_[__i] = static_cast<result_type>( -            (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); -    const result_type __mask = __r == _Dt ? result_type(~0) : -                                       (result_type(1) << __r) - result_type(1); -    __i_ = 0; -    if ((__x_[0] & ~__mask) == 0) -    { -        for (size_t __i = 1; __i < __n; ++__i) -            if (__x_[__i] != 0) -                return; -        __x_[0] = result_type(1) << (__w - 1); -    } -} - -template <class _UIntType, size_t __w, size_t __n, size_t __m, size_t __r, -          _UIntType __a, size_t __u, _UIntType __d, size_t __s, -          _UIntType __b, size_t __t, _UIntType __c, size_t __l, _UIntType __f> -_UIntType -mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, __s, __b, -    __t, __c, __l, __f>::operator()() -{ -    const size_t __j = (__i_ + 1) % __n; -    const result_type __mask = __r == _Dt ? result_type(~0) : -                                       (result_type(1) << __r) - result_type(1); -    const result_type _Yp = (__x_[__i_] & ~__mask) | (__x_[__j] & __mask); -    const size_t __k = (__i_ + __m) % __n; -    __x_[__i_] = __x_[__k] ^ __rshift<1>(_Yp) ^ (__a * (_Yp & 1)); -    result_type __z = __x_[__i_] ^ (__rshift<__u>(__x_[__i_]) & __d); -    __i_ = __j; -    __z ^= __lshift<__s>(__z) & __b; -    __z ^= __lshift<__t>(__z) & __c; -    return __z ^ __rshift<__l>(__z); -} - -template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -bool -operator==(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, -           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y) -{ -    if (__x.__i_ == __y.__i_) -        return _VSTD::equal(__x.__x_, __x.__x_ + _Np, __y.__x_); -    if (__x.__i_ == 0 || __y.__i_ == 0) -    { -        size_t __j = _VSTD::min(_Np - __x.__i_, _Np - __y.__i_); -        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, -                         __y.__x_ + __y.__i_)) -            return false; -        if (__x.__i_ == 0) -            return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Np, __y.__x_); -        return _VSTD::equal(__x.__x_, __x.__x_ + (_Np - __j), __y.__x_ + __j); -    } -    if (__x.__i_ < __y.__i_) -    { -        size_t __j = _Np - __y.__i_; -        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), -                         __y.__x_ + __y.__i_)) -            return false; -        if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Np, -                         __y.__x_)) -            return false; -        return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, -                           __y.__x_ + (_Np - (__x.__i_ + __j))); -    } -    size_t __j = _Np - __x.__i_; -    if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), -                     __x.__x_ + __x.__i_)) -        return false; -    if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Np, -                     __x.__x_)) -        return false; -    return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, -                       __x.__x_ + (_Np - (__y.__i_ + __j))); -} - -template <class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator!=(const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x, -           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __y) -{ -    return !(__x == __y); -} - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                         _Bp, _Tp, _Cp, _Lp, _Fp>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _Ostream; -    __os.flags(_Ostream::dec | _Ostream::left); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.__x_[__x.__i_]; -    for (size_t __j = __x.__i_ + 1; __j < _Np; ++__j) -        __os << __sp << __x.__x_[__j]; -    for (size_t __j = 0; __j < __x.__i_; ++__j) -        __os << __sp << __x.__x_[__j]; -    return __os; -} - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Np, size_t _Mp, size_t _Rp, -          _UInt _Ap, size_t _Up, _UInt _Dp, size_t _Sp, -          _UInt _Bp, size_t _Tp, _UInt _Cp, size_t _Lp, _UInt _Fp> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           mersenne_twister_engine<_UInt, _Wp, _Np, _Mp, _Rp, _Ap, _Up, _Dp, _Sp, -                                   _Bp, _Tp, _Cp, _Lp, _Fp>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    _UInt __t[_Np]; -    for (size_t __i = 0; __i < _Np; ++__i) -        __is >> __t[__i]; -    if (!__is.fail()) -    { -        for (size_t __i = 0; __i < _Np; ++__i) -            __x.__x_[__i] = __t[__i]; -        __x.__i_ = 0; -    } -    return __is; -} - -typedef mersenne_twister_engine<uint_fast32_t, 32, 624, 397, 31, -                                0x9908b0df, 11, 0xffffffff, -                                7,  0x9d2c5680, -                                15, 0xefc60000, -                                18, 1812433253>                         mt19937; -typedef mersenne_twister_engine<uint_fast64_t, 64, 312, 156, 31, -                                0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL, -                                17, 0x71d67fffeda60000ULL, -                                37, 0xfff7eee000000000ULL, -                                43, 6364136223846793005ULL>          mt19937_64; - -// subtract_with_carry_engine - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine; - -template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -bool -operator==( -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); - -template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -_LIBCPP_INLINE_VISIBILITY -bool -operator!=( -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -class _LIBCPP_TEMPLATE_VIS subtract_with_carry_engine -{ -public: -    // types -    typedef _UIntType result_type; - -private: -    result_type __x_[__r]; -    result_type  __c_; -    size_t      __i_; - -    static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; -    static_assert(  0 <  __w, "subtract_with_carry_engine invalid parameters"); -    static_assert(__w <= _Dt, "subtract_with_carry_engine invalid parameters"); -    static_assert(  0 <  __s, "subtract_with_carry_engine invalid parameters"); -    static_assert(__s <  __r, "subtract_with_carry_engine invalid parameters"); -public: -    static _LIBCPP_CONSTEXPR const result_type _Min = 0; -    static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : -                                                      (result_type(1) << __w) - result_type(1); -    static_assert(_Min < _Max, "subtract_with_carry_engine invalid parameters"); - -    // engine characteristics -    static _LIBCPP_CONSTEXPR const size_t word_size = __w; -    static _LIBCPP_CONSTEXPR const size_t short_lag = __s; -    static _LIBCPP_CONSTEXPR const size_t long_lag = __r; -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } -    static _LIBCPP_CONSTEXPR const result_type default_seed = 19780503u; - -    // constructors and seeding functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    subtract_with_carry_engine() : subtract_with_carry_engine(default_seed) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit subtract_with_carry_engine(result_type __sd) { seed(__sd); } -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit subtract_with_carry_engine(result_type __sd = default_seed) { -      seed(__sd); -    } -#endif -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        explicit subtract_with_carry_engine(_Sseq& __q, -        typename enable_if<__is_seed_sequence<_Sseq, subtract_with_carry_engine>::value>::type* = 0) -        {seed(__q);} -    _LIBCPP_INLINE_VISIBILITY -    void seed(result_type __sd = default_seed) -        {seed(__sd, integral_constant<unsigned, 1 + (__w - 1) / 32>());} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            __is_seed_sequence<_Sseq, subtract_with_carry_engine>::value, -            void -        >::type -        seed(_Sseq& __q) -            {__seed(__q, integral_constant<unsigned, 1 + (__w - 1) / 32>());} - -    // generating functions -    result_type operator()(); -    _LIBCPP_INLINE_VISIBILITY -    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} - -    template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -    friend -    bool -    operator==( -        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, -        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); - -    template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -    friend -    bool -    operator!=( -        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, -        const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y); - -    template <class _CharT, class _Traits, -              class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); - -    template <class _CharT, class _Traits, -              class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x); - -private: - -    void seed(result_type __sd, integral_constant<unsigned, 1>); -    void seed(result_type __sd, integral_constant<unsigned, 2>); -    template<class _Sseq> -        void __seed(_Sseq& __q, integral_constant<unsigned, 1>); -    template<class _Sseq> -        void __seed(_Sseq& __q, integral_constant<unsigned, 2>); -}; - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -    _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::word_size; - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -    _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::short_lag; - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -    _LIBCPP_CONSTEXPR const size_t subtract_with_carry_engine<_UIntType, __w, __s, __r>::long_lag; - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -    _LIBCPP_CONSTEXPR const typename subtract_with_carry_engine<_UIntType, __w, __s, __r>::result_type -    subtract_with_carry_engine<_UIntType, __w, __s, __r>::default_seed; - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -void -subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, -        integral_constant<unsigned, 1>) -{ -    linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> -        __e(__sd == 0u ? default_seed : __sd); -    for (size_t __i = 0; __i < __r; ++__i) -        __x_[__i] = static_cast<result_type>(__e() & _Max); -    __c_ = __x_[__r-1] == 0; -    __i_ = 0; -} - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -void -subtract_with_carry_engine<_UIntType, __w, __s, __r>::seed(result_type __sd, -        integral_constant<unsigned, 2>) -{ -    linear_congruential_engine<result_type, 40014u, 0u, 2147483563u> -        __e(__sd == 0u ? default_seed : __sd); -    for (size_t __i = 0; __i < __r; ++__i) -    { -        result_type __e0 = __e(); -        __x_[__i] = static_cast<result_type>( -                                    (__e0 + ((uint64_t)__e() << 32)) & _Max); -    } -    __c_ = __x_[__r-1] == 0; -    __i_ = 0; -} - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -template<class _Sseq> -void -subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, -        integral_constant<unsigned, 1>) -{ -    const unsigned __k = 1; -    uint32_t __ar[__r * __k]; -    __q.generate(__ar, __ar + __r * __k); -    for (size_t __i = 0; __i < __r; ++__i) -        __x_[__i] = static_cast<result_type>(__ar[__i] & _Max); -    __c_ = __x_[__r-1] == 0; -    __i_ = 0; -} - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -template<class _Sseq> -void -subtract_with_carry_engine<_UIntType, __w, __s, __r>::__seed(_Sseq& __q, -        integral_constant<unsigned, 2>) -{ -    const unsigned __k = 2; -    uint32_t __ar[__r * __k]; -    __q.generate(__ar, __ar + __r * __k); -    for (size_t __i = 0; __i < __r; ++__i) -        __x_[__i] = static_cast<result_type>( -                  (__ar[2 * __i] + ((uint64_t)__ar[2 * __i + 1] << 32)) & _Max); -    __c_ = __x_[__r-1] == 0; -    __i_ = 0; -} - -template<class _UIntType, size_t __w, size_t __s, size_t __r> -_UIntType -subtract_with_carry_engine<_UIntType, __w, __s, __r>::operator()() -{ -    const result_type& __xs = __x_[(__i_ + (__r - __s)) % __r]; -    result_type& __xr = __x_[__i_]; -    result_type __new_c = __c_ == 0 ? __xs < __xr : __xs != 0 ? __xs <= __xr : 1; -    __xr = (__xs - __xr - __c_) & _Max; -    __c_ = __new_c; -    __i_ = (__i_ + 1) % __r; -    return __xr; -} - -template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -bool -operator==( -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y) -{ -    if (__x.__c_ != __y.__c_) -        return false; -    if (__x.__i_ == __y.__i_) -        return _VSTD::equal(__x.__x_, __x.__x_ + _Rp, __y.__x_); -    if (__x.__i_ == 0 || __y.__i_ == 0) -    { -        size_t __j = _VSTD::min(_Rp - __x.__i_, _Rp - __y.__i_); -        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + __x.__i_ + __j, -                         __y.__x_ + __y.__i_)) -            return false; -        if (__x.__i_ == 0) -            return _VSTD::equal(__x.__x_ + __j, __x.__x_ + _Rp, __y.__x_); -        return _VSTD::equal(__x.__x_, __x.__x_ + (_Rp - __j), __y.__x_ + __j); -    } -    if (__x.__i_ < __y.__i_) -    { -        size_t __j = _Rp - __y.__i_; -        if (!_VSTD::equal(__x.__x_ + __x.__i_, __x.__x_ + (__x.__i_ + __j), -                         __y.__x_ + __y.__i_)) -            return false; -        if (!_VSTD::equal(__x.__x_ + (__x.__i_ + __j), __x.__x_ + _Rp, -                         __y.__x_)) -            return false; -        return _VSTD::equal(__x.__x_, __x.__x_ + __x.__i_, -                           __y.__x_ + (_Rp - (__x.__i_ + __j))); -    } -    size_t __j = _Rp - __x.__i_; -    if (!_VSTD::equal(__y.__x_ + __y.__i_, __y.__x_ + (__y.__i_ + __j), -                     __x.__x_ + __x.__i_)) -        return false; -    if (!_VSTD::equal(__y.__x_ + (__y.__i_ + __j), __y.__x_ + _Rp, -                     __x.__x_)) -        return false; -    return _VSTD::equal(__y.__x_, __y.__x_ + __y.__i_, -                       __x.__x_ + (_Rp - (__y.__i_ + __j))); -} - -template<class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator!=( -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x, -    const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __y) -{ -    return !(__x == __y); -} - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _Ostream; -    __os.flags(_Ostream::dec | _Ostream::left); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.__x_[__x.__i_]; -    for (size_t __j = __x.__i_ + 1; __j < _Rp; ++__j) -        __os << __sp << __x.__x_[__j]; -    for (size_t __j = 0; __j < __x.__i_; ++__j) -        __os << __sp << __x.__x_[__j]; -    __os << __sp << __x.__c_; -    return __os; -} - -template <class _CharT, class _Traits, -          class _UInt, size_t _Wp, size_t _Sp, size_t _Rp> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           subtract_with_carry_engine<_UInt, _Wp, _Sp, _Rp>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    _UInt __t[_Rp+1]; -    for (size_t __i = 0; __i < _Rp+1; ++__i) -        __is >> __t[__i]; -    if (!__is.fail()) -    { -        for (size_t __i = 0; __i < _Rp; ++__i) -            __x.__x_[__i] = __t[__i]; -        __x.__c_ = __t[_Rp]; -        __x.__i_ = 0; -    } -    return __is; -} - -typedef subtract_with_carry_engine<uint_fast32_t, 24, 10, 24>     ranlux24_base; -typedef subtract_with_carry_engine<uint_fast64_t, 48,  5, 12>     ranlux48_base; - -// discard_block_engine - -template<class _Engine, size_t __p, size_t __r> -class _LIBCPP_TEMPLATE_VIS discard_block_engine -{ -    _Engine __e_; -    int     __n_; - -    static_assert(  0 <  __r, "discard_block_engine invalid parameters"); -    static_assert(__r <= __p, "discard_block_engine invalid parameters"); -    static_assert(__r <= INT_MAX, "discard_block_engine invalid parameters"); -public: -    // types -    typedef typename _Engine::result_type result_type; - -    // engine characteristics -    static _LIBCPP_CONSTEXPR const size_t block_size = __p; -    static _LIBCPP_CONSTEXPR const size_t used_block = __r; - -#ifdef _LIBCPP_CXX03_LANG -    static const result_type _Min = _Engine::_Min; -    static const result_type _Max = _Engine::_Max; -#else -    static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); -    static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); -#endif - -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type min() { return _Engine::min(); } -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type max() { return _Engine::max(); } - -    // constructors and seeding functions -    _LIBCPP_INLINE_VISIBILITY -    discard_block_engine() : __n_(0) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit discard_block_engine(const _Engine& __e) -        : __e_(__e), __n_(0) {} -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    explicit discard_block_engine(_Engine&& __e) -        : __e_(_VSTD::move(__e)), __n_(0) {} -#endif // _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    explicit discard_block_engine(result_type __sd) : __e_(__sd), __n_(0) {} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        explicit discard_block_engine(_Sseq& __q, -        typename enable_if<__is_seed_sequence<_Sseq, discard_block_engine>::value && -                           !is_convertible<_Sseq, _Engine>::value>::type* = 0) -        : __e_(__q), __n_(0) {} -    _LIBCPP_INLINE_VISIBILITY -    void seed() {__e_.seed(); __n_ = 0;} -    _LIBCPP_INLINE_VISIBILITY -    void seed(result_type __sd) {__e_.seed(__sd); __n_ = 0;} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            __is_seed_sequence<_Sseq, discard_block_engine>::value, -            void -        >::type -        seed(_Sseq& __q) {__e_.seed(__q); __n_ = 0;} - -    // generating functions -    result_type operator()(); -    _LIBCPP_INLINE_VISIBILITY -    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    const _Engine& base() const _NOEXCEPT {return __e_;} - -    template<class _Eng, size_t _Pp, size_t _Rp> -    friend -    bool -    operator==( -        const discard_block_engine<_Eng, _Pp, _Rp>& __x, -        const discard_block_engine<_Eng, _Pp, _Rp>& __y); - -    template<class _Eng, size_t _Pp, size_t _Rp> -    friend -    bool -    operator!=( -        const discard_block_engine<_Eng, _Pp, _Rp>& __x, -        const discard_block_engine<_Eng, _Pp, _Rp>& __y); - -    template <class _CharT, class _Traits, -              class _Eng, size_t _Pp, size_t _Rp> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const discard_block_engine<_Eng, _Pp, _Rp>& __x); - -    template <class _CharT, class _Traits, -              class _Eng, size_t _Pp, size_t _Rp> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               discard_block_engine<_Eng, _Pp, _Rp>& __x); -}; - -template<class _Engine, size_t __p, size_t __r> -    _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::block_size; - -template<class _Engine, size_t __p, size_t __r> -    _LIBCPP_CONSTEXPR const size_t discard_block_engine<_Engine, __p, __r>::used_block; - -template<class _Engine, size_t __p, size_t __r> -typename discard_block_engine<_Engine, __p, __r>::result_type -discard_block_engine<_Engine, __p, __r>::operator()() -{ -    if (__n_ >= static_cast<int>(__r)) -    { -        __e_.discard(__p - __r); -        __n_ = 0; -    } -    ++__n_; -    return __e_(); -} - -template<class _Eng, size_t _Pp, size_t _Rp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator==(const discard_block_engine<_Eng, _Pp, _Rp>& __x, -           const discard_block_engine<_Eng, _Pp, _Rp>& __y) -{ -    return __x.__n_ == __y.__n_ && __x.__e_ == __y.__e_; -} - -template<class _Eng, size_t _Pp, size_t _Rp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator!=(const discard_block_engine<_Eng, _Pp, _Rp>& __x, -           const discard_block_engine<_Eng, _Pp, _Rp>& __y) -{ -    return !(__x == __y); -} - -template <class _CharT, class _Traits, -          class _Eng, size_t _Pp, size_t _Rp> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const discard_block_engine<_Eng, _Pp, _Rp>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _Ostream; -    __os.flags(_Ostream::dec | _Ostream::left); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    return __os << __x.__e_ << __sp << __x.__n_; -} - -template <class _CharT, class _Traits, -          class _Eng, size_t _Pp, size_t _Rp> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           discard_block_engine<_Eng, _Pp, _Rp>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    _Eng __e; -    int __n; -    __is >> __e >> __n; -    if (!__is.fail()) -    { -        __x.__e_ = __e; -        __x.__n_ = __n; -    } -    return __is; -} - -typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24; -typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48; - -// independent_bits_engine - -template<class _Engine, size_t __w, class _UIntType> -class _LIBCPP_TEMPLATE_VIS independent_bits_engine -{ -    template <class _UInt, _UInt _R0, size_t _Wp, size_t _Mp> -    class __get_n -    { -        static _LIBCPP_CONSTEXPR const size_t _Dt = numeric_limits<_UInt>::digits; -        static _LIBCPP_CONSTEXPR const size_t _Np = _Wp / _Mp + (_Wp % _Mp != 0); -        static _LIBCPP_CONSTEXPR const size_t _W0 = _Wp / _Np; -        static _LIBCPP_CONSTEXPR const _UInt _Y0 = _W0 >= _Dt ? 0 : (_R0 >> _W0) << _W0; -    public: -        static _LIBCPP_CONSTEXPR const size_t value = _R0 - _Y0 > _Y0 / _Np ? _Np + 1 : _Np; -    }; -public: -    // types -    typedef _UIntType result_type; - -private: -    _Engine __e_; - -    static _LIBCPP_CONSTEXPR const result_type _Dt = numeric_limits<result_type>::digits; -    static_assert(  0 <  __w, "independent_bits_engine invalid parameters"); -    static_assert(__w <= _Dt, "independent_bits_engine invalid parameters"); - -    typedef typename _Engine::result_type _Engine_result_type; -    typedef typename conditional -        < -            sizeof(_Engine_result_type) <= sizeof(result_type), -                result_type, -                _Engine_result_type -        >::type _Working_result_type; -#ifdef _LIBCPP_CXX03_LANG -    static const _Working_result_type _Rp = _Engine::_Max - _Engine::_Min -                                          + _Working_result_type(1); -#else -    static _LIBCPP_CONSTEXPR const _Working_result_type _Rp = _Engine::max() - _Engine::min() -                                                            + _Working_result_type(1); -#endif -    static _LIBCPP_CONSTEXPR const size_t __m = __log2<_Working_result_type, _Rp>::value; -    static _LIBCPP_CONSTEXPR const size_t __n = __get_n<_Working_result_type, _Rp, __w, __m>::value; -    static _LIBCPP_CONSTEXPR const size_t __w0 = __w / __n; -    static _LIBCPP_CONSTEXPR const size_t __n0 = __n - __w % __n; -    static _LIBCPP_CONSTEXPR const size_t _WDt = numeric_limits<_Working_result_type>::digits; -    static _LIBCPP_CONSTEXPR const size_t _EDt = numeric_limits<_Engine_result_type>::digits; -    static _LIBCPP_CONSTEXPR const _Working_result_type __y0 = __w0 >= _WDt ? 0 : -                                                               (_Rp >> __w0) << __w0; -    static _LIBCPP_CONSTEXPR const _Working_result_type __y1 = __w0 >= _WDt - 1 ? 0 : -                                                               (_Rp >> (__w0+1)) << (__w0+1); -    static _LIBCPP_CONSTEXPR const _Engine_result_type __mask0 = __w0 > 0 ? -                                _Engine_result_type(~0) >> (_EDt - __w0) : -                                _Engine_result_type(0); -    static _LIBCPP_CONSTEXPR const _Engine_result_type __mask1 = __w0 < _EDt - 1 ? -                                _Engine_result_type(~0) >> (_EDt - (__w0 + 1)) : -                                _Engine_result_type(~0); -public: -    static _LIBCPP_CONSTEXPR const result_type _Min = 0; -    static _LIBCPP_CONSTEXPR const result_type _Max = __w == _Dt ? result_type(~0) : -                                                      (result_type(1) << __w) - result_type(1); -    static_assert(_Min < _Max, "independent_bits_engine invalid parameters"); - -    // engine characteristics -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } - -    // constructors and seeding functions -    _LIBCPP_INLINE_VISIBILITY -    independent_bits_engine() {} -    _LIBCPP_INLINE_VISIBILITY -    explicit independent_bits_engine(const _Engine& __e) -        : __e_(__e) {} -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    explicit independent_bits_engine(_Engine&& __e) -        : __e_(_VSTD::move(__e)) {} -#endif // _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    explicit independent_bits_engine(result_type __sd) : __e_(__sd) {} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        explicit independent_bits_engine(_Sseq& __q, -        typename enable_if<__is_seed_sequence<_Sseq, independent_bits_engine>::value && -                           !is_convertible<_Sseq, _Engine>::value>::type* = 0) -         : __e_(__q) {} -    _LIBCPP_INLINE_VISIBILITY -    void seed() {__e_.seed();} -    _LIBCPP_INLINE_VISIBILITY -    void seed(result_type __sd) {__e_.seed(__sd);} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            __is_seed_sequence<_Sseq, independent_bits_engine>::value, -            void -        >::type -        seed(_Sseq& __q) {__e_.seed(__q);} - -    // generating functions -    _LIBCPP_INLINE_VISIBILITY -    result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} -    _LIBCPP_INLINE_VISIBILITY -    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    const _Engine& base() const _NOEXCEPT {return __e_;} - -    template<class _Eng, size_t _Wp, class _UInt> -    friend -    bool -    operator==( -        const independent_bits_engine<_Eng, _Wp, _UInt>& __x, -        const independent_bits_engine<_Eng, _Wp, _UInt>& __y); - -    template<class _Eng, size_t _Wp, class _UInt> -    friend -    bool -    operator!=( -        const independent_bits_engine<_Eng, _Wp, _UInt>& __x, -        const independent_bits_engine<_Eng, _Wp, _UInt>& __y); - -    template <class _CharT, class _Traits, -              class _Eng, size_t _Wp, class _UInt> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const independent_bits_engine<_Eng, _Wp, _UInt>& __x); - -    template <class _CharT, class _Traits, -              class _Eng, size_t _Wp, class _UInt> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               independent_bits_engine<_Eng, _Wp, _UInt>& __x); - -private: -    _LIBCPP_INLINE_VISIBILITY -    result_type __eval(false_type); -    result_type __eval(true_type); - -    template <size_t __count> -        _LIBCPP_INLINE_VISIBILITY -        static -        typename enable_if -        < -            __count < _Dt, -            result_type -        >::type -        __lshift(result_type __x) {return __x << __count;} - -    template <size_t __count> -        _LIBCPP_INLINE_VISIBILITY -        static -        typename enable_if -        < -            (__count >= _Dt), -            result_type -        >::type -        __lshift(result_type) {return result_type(0);} -}; - -template<class _Engine, size_t __w, class _UIntType> -inline -_UIntType -independent_bits_engine<_Engine, __w, _UIntType>::__eval(false_type) -{ -    return static_cast<result_type>(__e_() & __mask0); -} - -template<class _Engine, size_t __w, class _UIntType> -_UIntType -independent_bits_engine<_Engine, __w, _UIntType>::__eval(true_type) -{ -    result_type _Sp = 0; -    for (size_t __k = 0; __k < __n0; ++__k) -    { -        _Engine_result_type __u; -        do -        { -            __u = __e_() - _Engine::min(); -        } while (__u >= __y0); -        _Sp = static_cast<result_type>(__lshift<__w0>(_Sp) + (__u & __mask0)); -    } -    for (size_t __k = __n0; __k < __n; ++__k) -    { -        _Engine_result_type __u; -        do -        { -            __u = __e_() - _Engine::min(); -        } while (__u >= __y1); -        _Sp = static_cast<result_type>(__lshift<__w0+1>(_Sp) + (__u & __mask1)); -    } -    return _Sp; -} - -template<class _Eng, size_t _Wp, class _UInt> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator==( -    const independent_bits_engine<_Eng, _Wp, _UInt>& __x, -    const independent_bits_engine<_Eng, _Wp, _UInt>& __y) -{ -    return __x.base() == __y.base(); -} - -template<class _Eng, size_t _Wp, class _UInt> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator!=( -    const independent_bits_engine<_Eng, _Wp, _UInt>& __x, -    const independent_bits_engine<_Eng, _Wp, _UInt>& __y) -{ -    return !(__x == __y); -} - -template <class _CharT, class _Traits, -          class _Eng, size_t _Wp, class _UInt> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const independent_bits_engine<_Eng, _Wp, _UInt>& __x) -{ -    return __os << __x.base(); -} - -template <class _CharT, class _Traits, -          class _Eng, size_t _Wp, class _UInt> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           independent_bits_engine<_Eng, _Wp, _UInt>& __x) -{ -    _Eng __e; -    __is >> __e; -    if (!__is.fail()) -        __x.__e_ = __e; -    return __is; -} - -// shuffle_order_engine - -template <uint64_t _Xp, uint64_t _Yp> -struct __ugcd -{ -    static _LIBCPP_CONSTEXPR const uint64_t value = __ugcd<_Yp, _Xp % _Yp>::value; -}; - -template <uint64_t _Xp> -struct __ugcd<_Xp, 0> -{ -    static _LIBCPP_CONSTEXPR const uint64_t value = _Xp; -}; - -template <uint64_t _Np, uint64_t _Dp> -class __uratio -{ -    static_assert(_Dp != 0, "__uratio divide by 0"); -    static _LIBCPP_CONSTEXPR const uint64_t __gcd = __ugcd<_Np, _Dp>::value; -public: -    static _LIBCPP_CONSTEXPR const uint64_t num = _Np / __gcd; -    static _LIBCPP_CONSTEXPR const uint64_t den = _Dp / __gcd; - -    typedef __uratio<num, den> type; -}; - -template<class _Engine, size_t __k> -class _LIBCPP_TEMPLATE_VIS shuffle_order_engine -{ -    static_assert(0 < __k, "shuffle_order_engine invalid parameters"); -public: -    // types -    typedef typename _Engine::result_type result_type; - -private: -    _Engine __e_; -    result_type _V_[__k]; -    result_type _Y_; - -public: -    // engine characteristics -    static _LIBCPP_CONSTEXPR const size_t table_size = __k; - -#ifdef _LIBCPP_CXX03_LANG -    static const result_type _Min = _Engine::_Min; -    static const result_type _Max = _Engine::_Max; -#else -    static _LIBCPP_CONSTEXPR const result_type _Min = _Engine::min(); -    static _LIBCPP_CONSTEXPR const result_type _Max = _Engine::max(); -#endif -    static_assert(_Min < _Max, "shuffle_order_engine invalid parameters"); -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type min() { return _Min; } -    _LIBCPP_INLINE_VISIBILITY -    static _LIBCPP_CONSTEXPR result_type max() { return _Max; } - -    static _LIBCPP_CONSTEXPR const unsigned long long _Rp = _Max - _Min + 1ull; - -    // constructors and seeding functions -    _LIBCPP_INLINE_VISIBILITY -    shuffle_order_engine() {__init();} -    _LIBCPP_INLINE_VISIBILITY -    explicit shuffle_order_engine(const _Engine& __e) -        : __e_(__e) {__init();} -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    explicit shuffle_order_engine(_Engine&& __e) -        : __e_(_VSTD::move(__e)) {__init();} -#endif // _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    explicit shuffle_order_engine(result_type __sd) : __e_(__sd) {__init();} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        explicit shuffle_order_engine(_Sseq& __q, -        typename enable_if<__is_seed_sequence<_Sseq, shuffle_order_engine>::value && -                           !is_convertible<_Sseq, _Engine>::value>::type* = 0) -         : __e_(__q) {__init();} -    _LIBCPP_INLINE_VISIBILITY -    void seed() {__e_.seed(); __init();} -    _LIBCPP_INLINE_VISIBILITY -    void seed(result_type __sd) {__e_.seed(__sd); __init();} -    template<class _Sseq> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            __is_seed_sequence<_Sseq, shuffle_order_engine>::value, -            void -        >::type -        seed(_Sseq& __q) {__e_.seed(__q); __init();} - -    // generating functions -    _LIBCPP_INLINE_VISIBILITY -    result_type operator()() {return __eval(integral_constant<bool, _Rp != 0>());} -    _LIBCPP_INLINE_VISIBILITY -    void discard(unsigned long long __z) {for (; __z; --__z) operator()();} - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    const _Engine& base() const _NOEXCEPT {return __e_;} - -private: -    template<class _Eng, size_t _Kp> -    friend -    bool -    operator==( -        const shuffle_order_engine<_Eng, _Kp>& __x, -        const shuffle_order_engine<_Eng, _Kp>& __y); - -    template<class _Eng, size_t _Kp> -    friend -    bool -    operator!=( -        const shuffle_order_engine<_Eng, _Kp>& __x, -        const shuffle_order_engine<_Eng, _Kp>& __y); - -    template <class _CharT, class _Traits, -              class _Eng, size_t _Kp> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const shuffle_order_engine<_Eng, _Kp>& __x); - -    template <class _CharT, class _Traits, -              class _Eng, size_t _Kp> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               shuffle_order_engine<_Eng, _Kp>& __x); - -    _LIBCPP_INLINE_VISIBILITY -    void __init() -    { -        for (size_t __i = 0; __i < __k; ++__i) -            _V_[__i] = __e_(); -        _Y_ = __e_(); -    } - -    _LIBCPP_INLINE_VISIBILITY -    result_type __eval(false_type) {return __eval2(integral_constant<bool, __k & 1>());} -    _LIBCPP_INLINE_VISIBILITY -    result_type __eval(true_type) {return __eval(__uratio<__k, _Rp>());} - -    _LIBCPP_INLINE_VISIBILITY -    result_type __eval2(false_type) {return __eval(__uratio<__k/2, 0x8000000000000000ull>());} -    _LIBCPP_INLINE_VISIBILITY -    result_type __eval2(true_type) {return __evalf<__k, 0>();} - -    template <uint64_t _Np, uint64_t _Dp> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            (__uratio<_Np, _Dp>::num > 0xFFFFFFFFFFFFFFFFull / (_Max - _Min)), -            result_type -        >::type -        __eval(__uratio<_Np, _Dp>) -            {return __evalf<__uratio<_Np, _Dp>::num, __uratio<_Np, _Dp>::den>();} - -    template <uint64_t _Np, uint64_t _Dp> -        _LIBCPP_INLINE_VISIBILITY -        typename enable_if -        < -            __uratio<_Np, _Dp>::num <= 0xFFFFFFFFFFFFFFFFull / (_Max - _Min), -            result_type -        >::type -        __eval(__uratio<_Np, _Dp>) -        { -            const size_t __j = static_cast<size_t>(__uratio<_Np, _Dp>::num * (_Y_ - _Min) -                                                   / __uratio<_Np, _Dp>::den); -            _Y_ = _V_[__j]; -            _V_[__j] = __e_(); -            return _Y_; -        } - -    template <uint64_t __n, uint64_t __d> -        _LIBCPP_INLINE_VISIBILITY -        result_type __evalf() -        { -            const double _Fp = __d == 0 ? -                __n / (2. * 0x8000000000000000ull) : -                __n / (double)__d; -            const size_t __j = static_cast<size_t>(_Fp * (_Y_ - _Min)); -            _Y_ = _V_[__j]; -            _V_[__j] = __e_(); -            return _Y_; -        } -}; - -template<class _Engine, size_t __k> -    _LIBCPP_CONSTEXPR const size_t shuffle_order_engine<_Engine, __k>::table_size; - -template<class _Eng, size_t _Kp> -bool -operator==( -    const shuffle_order_engine<_Eng, _Kp>& __x, -    const shuffle_order_engine<_Eng, _Kp>& __y) -{ -    return __x._Y_ == __y._Y_ && _VSTD::equal(__x._V_, __x._V_ + _Kp, __y._V_) && -           __x.__e_ == __y.__e_; -} - -template<class _Eng, size_t _Kp> -inline _LIBCPP_INLINE_VISIBILITY -bool -operator!=( -    const shuffle_order_engine<_Eng, _Kp>& __x, -    const shuffle_order_engine<_Eng, _Kp>& __y) -{ -    return !(__x == __y); -} - -template <class _CharT, class _Traits, -          class _Eng, size_t _Kp> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const shuffle_order_engine<_Eng, _Kp>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _Ostream; -    __os.flags(_Ostream::dec | _Ostream::left); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.__e_ << __sp << __x._V_[0]; -    for (size_t __i = 1; __i < _Kp; ++__i) -        __os << __sp << __x._V_[__i]; -    return __os << __sp << __x._Y_; -} - -template <class _CharT, class _Traits, -          class _Eng, size_t _Kp> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           shuffle_order_engine<_Eng, _Kp>& __x) -{ -    typedef typename shuffle_order_engine<_Eng, _Kp>::result_type result_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    _Eng __e; -    result_type _Vp[_Kp+1]; -    __is >> __e; -    for (size_t __i = 0; __i < _Kp+1; ++__i) -        __is >> _Vp[__i]; -    if (!__is.fail()) -    { -        __x.__e_ = __e; -        for (size_t __i = 0; __i < _Kp; ++__i) -            __x._V_[__i] = _Vp[__i]; -        __x._Y_ = _Vp[_Kp]; -    } -    return __is; -} - -typedef shuffle_order_engine<minstd_rand0, 256>                         knuth_b; - -// random_device - -#if !defined(_LIBCPP_HAS_NO_RANDOM_DEVICE) - -class _LIBCPP_TYPE_VIS random_device -{ -#ifdef _LIBCPP_USING_DEV_RANDOM -    int __f_; -#endif // defined(_LIBCPP_USING_DEV_RANDOM) -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; - -private: -    // no copy functions -    random_device(const random_device&); // = delete; -    random_device& operator=(const random_device&); // = delete; -}; - -#endif // !_LIBCPP_HAS_NO_RANDOM_DEVICE - -// seed_seq - -class _LIBCPP_TEMPLATE_VIS seed_seq -{ -public: -    // types -    typedef uint32_t result_type; - -private: -    vector<result_type> __v_; - -    template<class _InputIterator> -        void init(_InputIterator __first, _InputIterator __last); -public: -    // constructors -    _LIBCPP_INLINE_VISIBILITY -    seed_seq() _NOEXCEPT {} -#ifndef _LIBCPP_CXX03_LANG -    template<class _Tp> -        _LIBCPP_INLINE_VISIBILITY -        seed_seq(initializer_list<_Tp> __il) {init(__il.begin(), __il.end());} -#endif // _LIBCPP_CXX03_LANG - -    template<class _InputIterator> -        _LIBCPP_INLINE_VISIBILITY -        seed_seq(_InputIterator __first, _InputIterator __last) -             {init(__first, __last);} - -    // generating functions -    template<class _RandomAccessIterator> -        void generate(_RandomAccessIterator __first, _RandomAccessIterator __last); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    size_t size() const _NOEXCEPT {return __v_.size();} -    template<class _OutputIterator> -        _LIBCPP_INLINE_VISIBILITY -        void param(_OutputIterator __dest) const -            {_VSTD::copy(__v_.begin(), __v_.end(), __dest);} - -private: -    // no copy functions -    seed_seq(const seed_seq&); // = delete; -    void operator=(const seed_seq&); // = delete; - -    _LIBCPP_INLINE_VISIBILITY -    static result_type _Tp(result_type __x) {return __x ^ (__x >> 27);} -}; - -template<class _InputIterator> -void -seed_seq::init(_InputIterator __first, _InputIterator __last) -{ -    for (_InputIterator __s = __first; __s != __last; ++__s) -        __v_.push_back(*__s & 0xFFFFFFFF); -} - -template<class _RandomAccessIterator> -void -seed_seq::generate(_RandomAccessIterator __first, _RandomAccessIterator __last) -{ -    if (__first != __last) -    { -        _VSTD::fill(__first, __last, 0x8b8b8b8b); -        const size_t __n = static_cast<size_t>(__last - __first); -        const size_t __s = __v_.size(); -        const size_t __t = (__n >= 623) ? 11 -                         : (__n >= 68) ? 7 -                         : (__n >= 39) ? 5 -                         : (__n >= 7)  ? 3 -                         : (__n - 1) / 2; -        const size_t __p = (__n - __t) / 2; -        const size_t __q = __p + __t; -        const size_t __m = _VSTD::max(__s + 1, __n); -        // __k = 0; -        { -            result_type __r = 1664525 * _Tp(__first[0] ^ __first[__p] -                                                      ^  __first[__n - 1]); -            __first[__p] += __r; -            __r += __s; -            __first[__q] += __r; -            __first[0] = __r; -        } -        for (size_t __k = 1; __k <= __s; ++__k) -        { -            const size_t __kmodn = __k % __n; -            const size_t __kpmodn = (__k + __p) % __n; -            result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] -                                           ^ __first[(__k - 1) % __n]); -            __first[__kpmodn] += __r; -            __r +=  __kmodn + __v_[__k-1]; -            __first[(__k + __q) % __n] += __r; -            __first[__kmodn] = __r; -        } -        for (size_t __k = __s + 1; __k < __m; ++__k) -        { -            const size_t __kmodn = __k % __n; -            const size_t __kpmodn = (__k + __p) % __n; -            result_type __r = 1664525 * _Tp(__first[__kmodn] ^ __first[__kpmodn] -                                           ^ __first[(__k - 1) % __n]); -            __first[__kpmodn] += __r; -            __r +=  __kmodn; -            __first[(__k + __q) % __n] += __r; -            __first[__kmodn] = __r; -        } -        for (size_t __k = __m; __k < __m + __n; ++__k) -        { -            const size_t __kmodn = __k % __n; -            const size_t __kpmodn = (__k + __p) % __n; -            result_type __r = 1566083941 * _Tp(__first[__kmodn] + -                                              __first[__kpmodn] + -                                              __first[(__k - 1) % __n]); -            __first[__kpmodn] ^= __r; -            __r -= __kmodn; -            __first[(__k + __q) % __n] ^= __r; -            __first[__kmodn] = __r; -        } -    } -} - -// generate_canonical - -template<class _RealType, size_t __bits, class _URNG> -_RealType -generate_canonical(_URNG& __g) -{ -    const size_t _Dt = numeric_limits<_RealType>::digits; -    const size_t __b = _Dt < __bits ? _Dt : __bits; -#ifdef _LIBCPP_CXX03_LANG -    const size_t __logR = __log2<uint64_t, _URNG::_Max - _URNG::_Min + uint64_t(1)>::value; -#else -    const size_t __logR = __log2<uint64_t, _URNG::max() - _URNG::min() + uint64_t(1)>::value; -#endif -    const size_t __k = __b / __logR + (__b % __logR != 0) + (__b == 0); -    const _RealType _Rp = static_cast<_RealType>(_URNG::max() - _URNG::min()) + _RealType(1); -    _RealType __base = _Rp; -    _RealType _Sp = __g() - _URNG::min(); -    for (size_t __i = 1; __i < __k; ++__i, __base *= _Rp) -        _Sp += (__g() - _URNG::min()) * __base; -    return _Sp / __base; -} - -// uniform_real_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS uniform_real_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __a_; -        result_type __b_; -    public: -        typedef uniform_real_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __a = 0, -                            result_type __b = 1) -            : __a_(__a), __b_(__b) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type a() const {return __a_;} -        _LIBCPP_INLINE_VISIBILITY -        result_type b() const {return __b_;} - -        friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} -        friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    uniform_real_distribution() : uniform_real_distribution(0) {} -    explicit uniform_real_distribution(result_type __a, result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit uniform_real_distribution(result_type __a = 0, result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit uniform_real_distribution(const param_type& __p) : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type a() const {return __p_.a();} -    _LIBCPP_INLINE_VISIBILITY -    result_type b() const {return __p_.b();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return a();} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return b();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const uniform_real_distribution& __x, -                        const uniform_real_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const uniform_real_distribution& __x, -                        const uniform_real_distribution& __y) -        {return !(__x == __y);} -}; - -template<class _RealType> -template<class _URNG> -inline -typename uniform_real_distribution<_RealType>::result_type -uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    return (__p.b() - __p.a()) -        * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g) -        + __p.a(); -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const uniform_real_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    return __os << __x.a() << __sp << __x.b(); -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           uniform_real_distribution<_RT>& __x) -{ -    typedef uniform_real_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __a; -    result_type __b; -    __is >> __a >> __b; -    if (!__is.fail()) -        __x.param(param_type(__a, __b)); -    return __is; -} - -// bernoulli_distribution - -class _LIBCPP_TEMPLATE_VIS bernoulli_distribution -{ -public: -    // types -    typedef bool result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        double __p_; -    public: -        typedef bernoulli_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(double __p = 0.5) : __p_(__p) {} - -        _LIBCPP_INLINE_VISIBILITY -        double p() const {return __p_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__p_ == __y.__p_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    bernoulli_distribution() : bernoulli_distribution(0.5) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit bernoulli_distribution(double __p) : __p_(param_type(__p)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit bernoulli_distribution(double __p = 0.5) : __p_(param_type(__p)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit bernoulli_distribution(const param_type& __p) : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    double p() const {return __p_.p();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return false;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return true;} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const bernoulli_distribution& __x, -                        const bernoulli_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const bernoulli_distribution& __x, -                        const bernoulli_distribution& __y) -        {return !(__x == __y);} -}; - -template<class _URNG> -inline -bernoulli_distribution::result_type -bernoulli_distribution::operator()(_URNG& __g, const param_type& __p) -{ -    uniform_real_distribution<double> __gen; -    return __gen(__g) < __p.p(); -} - -template <class _CharT, class _Traits> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, const bernoulli_distribution& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    return __os << __x.p(); -} - -template <class _CharT, class _Traits> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, bernoulli_distribution& __x) -{ -    typedef bernoulli_distribution _Eng; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    double __p; -    __is >> __p; -    if (!__is.fail()) -        __x.param(param_type(__p)); -    return __is; -} - -// binomial_distribution - -template<class _IntType = int> -class _LIBCPP_TEMPLATE_VIS binomial_distribution -{ -public: -    // types -    typedef _IntType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __t_; -        double __p_; -        double __pr_; -        double __odds_ratio_; -        result_type __r0_; -    public: -        typedef binomial_distribution distribution_type; - -        explicit param_type(result_type __t = 1, double __p = 0.5); - -        _LIBCPP_INLINE_VISIBILITY -        result_type t() const {return __t_;} -        _LIBCPP_INLINE_VISIBILITY -        double p() const {return __p_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__t_ == __y.__t_ && __x.__p_ == __y.__p_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} - -        friend class binomial_distribution; -    }; - -private: -    param_type __p_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    binomial_distribution() : binomial_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit binomial_distribution(result_type __t, double __p = 0.5) -        : __p_(param_type(__t, __p)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit binomial_distribution(result_type __t = 1, double __p = 0.5) -        : __p_(param_type(__t, __p)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit binomial_distribution(const param_type& __p) : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type t() const {return __p_.t();} -    _LIBCPP_INLINE_VISIBILITY -    double p() const {return __p_.p();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return t();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const binomial_distribution& __x, -                        const binomial_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const binomial_distribution& __x, -                        const binomial_distribution& __y) -        {return !(__x == __y);} -}; - -#ifndef _LIBCPP_MSVCRT_LIKE -extern "C" double lgamma_r(double, int *); -#endif - -inline _LIBCPP_INLINE_VISIBILITY double __libcpp_lgamma(double __d) { -#if defined(_LIBCPP_MSVCRT_LIKE) -  return lgamma(__d); -#else -  int __sign; -  return lgamma_r(__d, &__sign); -#endif -} - -template<class _IntType> -binomial_distribution<_IntType>::param_type::param_type(result_type __t, double __p) -    : __t_(__t), __p_(__p) -{ -    if (0 < __p_ && __p_ < 1) -    { -        __r0_ = static_cast<result_type>((__t_ + 1) * __p_); -        __pr_ = _VSTD::exp(__libcpp_lgamma(__t_ + 1.) - -                           __libcpp_lgamma(__r0_ + 1.) - -                           __libcpp_lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) + -                           (__t_ - __r0_) * _VSTD::log(1 - __p_)); -        __odds_ratio_ = __p_ / (1 - __p_); -    } -} - -// Reference: Kemp, C.D. (1986). `A modal method for generating binomial -//           variables', Commun. Statist. - Theor. Meth. 15(3), 805-813. -template<class _IntType> -template<class _URNG> -_IntType -binomial_distribution<_IntType>::operator()(_URNG& __g, const param_type& __pr) -{ -    if (__pr.__t_ == 0 || __pr.__p_ == 0) -        return 0; -    if (__pr.__p_ == 1) -        return __pr.__t_; -    uniform_real_distribution<double> __gen; -    double __u = __gen(__g) - __pr.__pr_; -    if (__u < 0) -        return __pr.__r0_; -    double __pu = __pr.__pr_; -    double __pd = __pu; -    result_type __ru = __pr.__r0_; -    result_type __rd = __ru; -    while (true) -    { -        bool __break = true; -        if (__rd >= 1) -        { -            __pd *= __rd / (__pr.__odds_ratio_ * (__pr.__t_ - __rd + 1)); -            __u -= __pd; -            __break = false; -            if (__u < 0) -                return __rd - 1; -        } -        if ( __rd != 0 ) -            --__rd; -        ++__ru; -        if (__ru <= __pr.__t_) -        { -            __pu *= (__pr.__t_ - __ru + 1) * __pr.__odds_ratio_ / __ru; -            __u -= __pu; -            __break = false; -            if (__u < 0) -                return __ru; -        } -        if (__break) -            return 0; -    } -} - -template <class _CharT, class _Traits, class _IntType> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const binomial_distribution<_IntType>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    return __os << __x.t() << __sp << __x.p(); -} - -template <class _CharT, class _Traits, class _IntType> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           binomial_distribution<_IntType>& __x) -{ -    typedef binomial_distribution<_IntType> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __t; -    double __p; -    __is >> __t >> __p; -    if (!__is.fail()) -        __x.param(param_type(__t, __p)); -    return __is; -} - -// exponential_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS exponential_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __lambda_; -    public: -        typedef exponential_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __lambda = 1) : __lambda_(__lambda) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type lambda() const {return __lambda_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__lambda_ == __y.__lambda_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    exponential_distribution() : exponential_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit exponential_distribution(result_type __lambda) -        : __p_(param_type(__lambda)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit exponential_distribution(result_type __lambda = 1) -        : __p_(param_type(__lambda)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit exponential_distribution(const param_type& __p) : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type lambda() const {return __p_.lambda();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const exponential_distribution& __x, -                        const exponential_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const exponential_distribution& __x, -                        const exponential_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _RealType> -template<class _URNG> -_RealType -exponential_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    return -_VSTD::log -                  ( -                      result_type(1) - -                      _VSTD::generate_canonical<result_type, -                                       numeric_limits<result_type>::digits>(__g) -                  ) -                  / __p.lambda(); -} - -template <class _CharT, class _Traits, class _RealType> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const exponential_distribution<_RealType>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    return __os << __x.lambda(); -} - -template <class _CharT, class _Traits, class _RealType> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           exponential_distribution<_RealType>& __x) -{ -    typedef exponential_distribution<_RealType> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __lambda; -    __is >> __lambda; -    if (!__is.fail()) -        __x.param(param_type(__lambda)); -    return __is; -} - -// normal_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS normal_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __mean_; -        result_type __stddev_; -    public: -        typedef normal_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __mean = 0, result_type __stddev = 1) -            : __mean_(__mean), __stddev_(__stddev) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type mean() const {return __mean_;} -        _LIBCPP_INLINE_VISIBILITY -        result_type stddev() const {return __stddev_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__mean_ == __y.__mean_ && __x.__stddev_ == __y.__stddev_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; -    result_type _V_; -    bool _V_hot_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    normal_distribution() : normal_distribution(0) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit normal_distribution(result_type __mean, result_type __stddev = 1) -        : __p_(param_type(__mean, __stddev)), _V_hot_(false) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit normal_distribution(result_type __mean = 0, -                                 result_type __stddev = 1) -        : __p_(param_type(__mean, __stddev)), _V_hot_(false) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit normal_distribution(const param_type& __p) -        : __p_(__p), _V_hot_(false) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {_V_hot_ = false;} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type mean() const {return __p_.mean();} -    _LIBCPP_INLINE_VISIBILITY -    result_type stddev() const {return __p_.stddev();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return -numeric_limits<result_type>::infinity();} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const normal_distribution& __x, -                        const normal_distribution& __y) -        {return __x.__p_ == __y.__p_ && __x._V_hot_ == __y._V_hot_ && -                (!__x._V_hot_ || __x._V_ == __y._V_);} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const normal_distribution& __x, -                        const normal_distribution& __y) -        {return !(__x == __y);} - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const normal_distribution<_RT>& __x); - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               normal_distribution<_RT>& __x); -}; - -template <class _RealType> -template<class _URNG> -_RealType -normal_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    result_type _Up; -    if (_V_hot_) -    { -        _V_hot_ = false; -        _Up = _V_; -    } -    else -    { -        uniform_real_distribution<result_type> _Uni(-1, 1); -        result_type __u; -        result_type __v; -        result_type __s; -        do -        { -            __u = _Uni(__g); -            __v = _Uni(__g); -            __s = __u * __u + __v * __v; -        } while (__s > 1 || __s == 0); -        result_type _Fp = _VSTD::sqrt(-2 * _VSTD::log(__s) / __s); -        _V_ = __v * _Fp; -        _V_hot_ = true; -        _Up = __u * _Fp; -    } -    return _Up * __p.stddev() + __p.mean(); -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const normal_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.mean() << __sp << __x.stddev() << __sp << __x._V_hot_; -    if (__x._V_hot_) -        __os << __sp << __x._V_; -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           normal_distribution<_RT>& __x) -{ -    typedef normal_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __mean; -    result_type __stddev; -    result_type _Vp = 0; -    bool _V_hot = false; -    __is >> __mean >> __stddev >> _V_hot; -    if (_V_hot) -        __is >> _Vp; -    if (!__is.fail()) -    { -        __x.param(param_type(__mean, __stddev)); -        __x._V_hot_ = _V_hot; -        __x._V_ = _Vp; -    } -    return __is; -} - -// lognormal_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS lognormal_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        normal_distribution<result_type> __nd_; -    public: -        typedef lognormal_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __m = 0, result_type __s = 1) -            : __nd_(__m, __s) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type m() const {return __nd_.mean();} -        _LIBCPP_INLINE_VISIBILITY -        result_type s() const {return __nd_.stddev();} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__nd_ == __y.__nd_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -        friend class lognormal_distribution; - -        template <class _CharT, class _Traits, class _RT> -        friend -        basic_ostream<_CharT, _Traits>& -        operator<<(basic_ostream<_CharT, _Traits>& __os, -                   const lognormal_distribution<_RT>& __x); - -        template <class _CharT, class _Traits, class _RT> -        friend -        basic_istream<_CharT, _Traits>& -        operator>>(basic_istream<_CharT, _Traits>& __is, -                   lognormal_distribution<_RT>& __x); -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    lognormal_distribution() : lognormal_distribution(0) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit lognormal_distribution(result_type __m, result_type __s = 1) -        : __p_(param_type(__m, __s)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit lognormal_distribution(result_type __m = 0, -                                    result_type __s = 1) -        : __p_(param_type(__m, __s)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit lognormal_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {__p_.__nd_.reset();} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g, const param_type& __p) -        {return _VSTD::exp(const_cast<normal_distribution<result_type>&>(__p.__nd_)(__g));} - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type m() const {return __p_.m();} -    _LIBCPP_INLINE_VISIBILITY -    result_type s() const {return __p_.s();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const lognormal_distribution& __x, -                        const lognormal_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const lognormal_distribution& __x, -                        const lognormal_distribution& __y) -        {return !(__x == __y);} - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const lognormal_distribution<_RT>& __x); - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               lognormal_distribution<_RT>& __x); -}; - -template <class _CharT, class _Traits, class _RT> -inline _LIBCPP_INLINE_VISIBILITY -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const lognormal_distribution<_RT>& __x) -{ -    return __os << __x.__p_.__nd_; -} - -template <class _CharT, class _Traits, class _RT> -inline _LIBCPP_INLINE_VISIBILITY -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           lognormal_distribution<_RT>& __x) -{ -    return __is >> __x.__p_.__nd_; -} - -// poisson_distribution - -template<class _IntType = int> -class _LIBCPP_TEMPLATE_VIS poisson_distribution -{ -public: -    // types -    typedef _IntType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        double __mean_; -        double __s_; -        double __d_; -        double __l_; -        double __omega_; -        double __c0_; -        double __c1_; -        double __c2_; -        double __c3_; -        double __c_; - -    public: -        typedef poisson_distribution distribution_type; - -        explicit param_type(double __mean = 1.0); - -        _LIBCPP_INLINE_VISIBILITY -        double mean() const {return __mean_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__mean_ == __y.__mean_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} - -        friend class poisson_distribution; -    }; - -private: -    param_type __p_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    poisson_distribution() : poisson_distribution(1.0) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit poisson_distribution(double __mean) -        : __p_(__mean) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit poisson_distribution(double __mean = 1.0) -        : __p_(__mean) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit poisson_distribution(const param_type& __p) : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    double mean() const {return __p_.mean();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::max();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const poisson_distribution& __x, -                        const poisson_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const poisson_distribution& __x, -                        const poisson_distribution& __y) -        {return !(__x == __y);} -}; - -template<class _IntType> -poisson_distribution<_IntType>::param_type::param_type(double __mean) -    // According to the standard `inf` is a valid input, but it causes the -    // distribution to hang, so we replace it with the maximum representable -    // mean. -    : __mean_(isinf(__mean) ? numeric_limits<double>::max() : __mean) -{ -    if (__mean_ < 10) -    { -        __s_ = 0; -        __d_ = 0; -        __l_ = _VSTD::exp(-__mean_); -        __omega_ = 0; -        __c3_ = 0; -        __c2_ = 0; -        __c1_ = 0; -        __c0_ = 0; -        __c_ = 0; -    } -    else -    { -        __s_ = _VSTD::sqrt(__mean_); -        __d_ = 6 * __mean_ * __mean_; -        __l_ = _VSTD::trunc(__mean_ - 1.1484); -        __omega_ = .3989423 / __s_; -        double __b1_ = .4166667E-1 / __mean_; -        double __b2_ = .3 * __b1_ * __b1_; -        __c3_ = .1428571 * __b1_ * __b2_; -        __c2_ = __b2_ - 15. * __c3_; -        __c1_ = __b1_ - 6. * __b2_ + 45. * __c3_; -        __c0_ = 1. - __b1_ + 3. * __b2_ - 15. * __c3_; -        __c_ = .1069 / __mean_; -    } -} - -template <class _IntType> -template<class _URNG> -_IntType -poisson_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) -{ -    double __tx; -    uniform_real_distribution<double> __urd; -    if (__pr.__mean_ < 10) -    { -         __tx = 0; -        for (double __p = __urd(__urng); __p > __pr.__l_; ++__tx) -            __p *= __urd(__urng); -    } -    else -    { -        double __difmuk; -        double __g = __pr.__mean_ + __pr.__s_ * normal_distribution<double>()(__urng); -        double __u; -        if (__g > 0) -        { -            __tx = _VSTD::trunc(__g); -            if (__tx >= __pr.__l_) -                return _VSTD::__clamp_to_integral<result_type>(__tx); -            __difmuk = __pr.__mean_ - __tx; -            __u = __urd(__urng); -            if (__pr.__d_ * __u >= __difmuk * __difmuk * __difmuk) -                return _VSTD::__clamp_to_integral<result_type>(__tx); -        } -        exponential_distribution<double> __edist; -        for (bool __using_exp_dist = false; true; __using_exp_dist = true) -        { -            double __e; -            if (__using_exp_dist || __g <= 0) -            { -                double __t; -                do -                { -                    __e = __edist(__urng); -                    __u = __urd(__urng); -                    __u += __u - 1; -                    __t = 1.8 + (__u < 0 ? -__e : __e); -                } while (__t <= -.6744); -                __tx = _VSTD::trunc(__pr.__mean_ + __pr.__s_ * __t); -                __difmuk = __pr.__mean_ - __tx; -                __using_exp_dist = true; -            } -            double __px; -            double __py; -            if (__tx < 10 && __tx >= 0) -            { -                const double __fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, -                                             40320, 362880}; -                __px = -__pr.__mean_; -                __py = _VSTD::pow(__pr.__mean_, (double)__tx) / __fac[static_cast<int>(__tx)]; -            } -            else -            { -                double __del = .8333333E-1 / __tx; -                __del -= 4.8 * __del * __del * __del; -                double __v = __difmuk / __tx; -                if (_VSTD::abs(__v) > 0.25) -                    __px = __tx * _VSTD::log(1 + __v) - __difmuk - __del; -                else -                    __px = __tx * __v * __v * (((((((.1250060 * __v + -.1384794) * -                           __v + .1421878) * __v + -.1661269) * __v + .2000118) * -                           __v + -.2500068) * __v + .3333333) * __v + -.5) - __del; -                __py = .3989423 / _VSTD::sqrt(__tx); -            } -            double __r = (0.5 - __difmuk) / __pr.__s_; -            double __r2 = __r * __r; -            double __fx = -0.5 * __r2; -            double __fy = __pr.__omega_ * (((__pr.__c3_ * __r2 + __pr.__c2_) * -                                        __r2 + __pr.__c1_) * __r2 + __pr.__c0_); -            if (__using_exp_dist) -            { -                if (__pr.__c_ * _VSTD::abs(__u) <= __py * _VSTD::exp(__px + __e) - -                                                   __fy * _VSTD::exp(__fx + __e)) -                    break; -            } -            else -            { -                if (__fy - __u * __fy <= __py * _VSTD::exp(__px - __fx)) -                    break; -            } -        } -    } -    return _VSTD::__clamp_to_integral<result_type>(__tx); -} - -template <class _CharT, class _Traits, class _IntType> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const poisson_distribution<_IntType>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    return __os << __x.mean(); -} - -template <class _CharT, class _Traits, class _IntType> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           poisson_distribution<_IntType>& __x) -{ -    typedef poisson_distribution<_IntType> _Eng; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    double __mean; -    __is >> __mean; -    if (!__is.fail()) -        __x.param(param_type(__mean)); -    return __is; -} - -// weibull_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS weibull_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __a_; -        result_type __b_; -    public: -        typedef weibull_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __a = 1, result_type __b = 1) -            : __a_(__a), __b_(__b) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type a() const {return __a_;} -        _LIBCPP_INLINE_VISIBILITY -        result_type b() const {return __b_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    weibull_distribution() : weibull_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit weibull_distribution(result_type __a, result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit weibull_distribution(result_type __a = 1, result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit weibull_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g, const param_type& __p) -        {return __p.b() * -            _VSTD::pow(exponential_distribution<result_type>()(__g), 1/__p.a());} - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type a() const {return __p_.a();} -    _LIBCPP_INLINE_VISIBILITY -    result_type b() const {return __p_.b();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const weibull_distribution& __x, -                        const weibull_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const weibull_distribution& __x, -                        const weibull_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const weibull_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.a() << __sp << __x.b(); -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           weibull_distribution<_RT>& __x) -{ -    typedef weibull_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __a; -    result_type __b; -    __is >> __a >> __b; -    if (!__is.fail()) -        __x.param(param_type(__a, __b)); -    return __is; -} - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS extreme_value_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __a_; -        result_type __b_; -    public: -        typedef extreme_value_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __a = 0, result_type __b = 1) -            : __a_(__a), __b_(__b) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type a() const {return __a_;} -        _LIBCPP_INLINE_VISIBILITY -        result_type b() const {return __b_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    extreme_value_distribution() : extreme_value_distribution(0) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit extreme_value_distribution(result_type __a, result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit extreme_value_distribution(result_type __a = 0, -                                        result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit extreme_value_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type a() const {return __p_.a();} -    _LIBCPP_INLINE_VISIBILITY -    result_type b() const {return __p_.b();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return -numeric_limits<result_type>::infinity();} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const extreme_value_distribution& __x, -                        const extreme_value_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const extreme_value_distribution& __x, -                        const extreme_value_distribution& __y) -        {return !(__x == __y);} -}; - -template<class _RealType> -template<class _URNG> -_RealType -extreme_value_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    return __p.a() - __p.b() * -         _VSTD::log(-_VSTD::log(1-uniform_real_distribution<result_type>()(__g))); -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const extreme_value_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.a() << __sp << __x.b(); -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           extreme_value_distribution<_RT>& __x) -{ -    typedef extreme_value_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __a; -    result_type __b; -    __is >> __a >> __b; -    if (!__is.fail()) -        __x.param(param_type(__a, __b)); -    return __is; -} - -// gamma_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS gamma_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __alpha_; -        result_type __beta_; -    public: -        typedef gamma_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __alpha = 1, result_type __beta = 1) -            : __alpha_(__alpha), __beta_(__beta) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type alpha() const {return __alpha_;} -        _LIBCPP_INLINE_VISIBILITY -        result_type beta() const {return __beta_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__alpha_ == __y.__alpha_ && __x.__beta_ == __y.__beta_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    gamma_distribution() : gamma_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit gamma_distribution(result_type __alpha, result_type __beta = 1) -        : __p_(param_type(__alpha, __beta)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit gamma_distribution(result_type __alpha = 1, -                                result_type __beta = 1) -        : __p_(param_type(__alpha, __beta)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit gamma_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type alpha() const {return __p_.alpha();} -    _LIBCPP_INLINE_VISIBILITY -    result_type beta() const {return __p_.beta();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const gamma_distribution& __x, -                        const gamma_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const gamma_distribution& __x, -                        const gamma_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _RealType> -template<class _URNG> -_RealType -gamma_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    result_type __a = __p.alpha(); -    uniform_real_distribution<result_type> __gen(0, 1); -    exponential_distribution<result_type> __egen; -    result_type __x; -    if (__a == 1) -        __x = __egen(__g); -    else if (__a > 1) -    { -        const result_type __b = __a - 1; -        const result_type __c = 3 * __a - result_type(0.75); -        while (true) -        { -            const result_type __u = __gen(__g); -            const result_type __v = __gen(__g); -            const result_type __w = __u * (1 - __u); -            if (__w != 0) -            { -                const result_type __y = _VSTD::sqrt(__c / __w) * -                                        (__u - result_type(0.5)); -                __x = __b + __y; -                if (__x >= 0) -                { -                    const result_type __z = 64 * __w * __w * __w * __v * __v; -                    if (__z <= 1 - 2 * __y * __y / __x) -                        break; -                    if (_VSTD::log(__z) <= 2 * (__b * _VSTD::log(__x / __b) - __y)) -                        break; -                } -            } -        } -    } -    else  // __a < 1 -    { -        while (true) -        { -            const result_type __u = __gen(__g); -            const result_type __es = __egen(__g); -            if (__u <= 1 - __a) -            { -                __x = _VSTD::pow(__u, 1 / __a); -                if (__x <= __es) -                    break; -            } -            else -            { -                const result_type __e = -_VSTD::log((1-__u)/__a); -                __x = _VSTD::pow(1 - __a + __a * __e, 1 / __a); -                if (__x <= __e + __es) -                    break; -            } -        } -    } -    return __x * __p.beta(); -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const gamma_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.alpha() << __sp << __x.beta(); -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           gamma_distribution<_RT>& __x) -{ -    typedef gamma_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __alpha; -    result_type __beta; -    __is >> __alpha >> __beta; -    if (!__is.fail()) -        __x.param(param_type(__alpha, __beta)); -    return __is; -} - -// negative_binomial_distribution - -template<class _IntType = int> -class _LIBCPP_TEMPLATE_VIS negative_binomial_distribution -{ -public: -    // types -    typedef _IntType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __k_; -        double __p_; -    public: -        typedef negative_binomial_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __k = 1, double __p = 0.5) -            : __k_(__k), __p_(__p) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type k() const {return __k_;} -        _LIBCPP_INLINE_VISIBILITY -        double p() const {return __p_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__k_ == __y.__k_ && __x.__p_ == __y.__p_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    negative_binomial_distribution() : negative_binomial_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit negative_binomial_distribution(result_type __k, double __p = 0.5) -        : __p_(__k, __p) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit negative_binomial_distribution(result_type __k = 1, -                                            double __p = 0.5) -        : __p_(__k, __p) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit negative_binomial_distribution(const param_type& __p) : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type k() const {return __p_.k();} -    _LIBCPP_INLINE_VISIBILITY -    double p() const {return __p_.p();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::max();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const negative_binomial_distribution& __x, -                        const negative_binomial_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const negative_binomial_distribution& __x, -                        const negative_binomial_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _IntType> -template<class _URNG> -_IntType -negative_binomial_distribution<_IntType>::operator()(_URNG& __urng, const param_type& __pr) -{ -    result_type __k = __pr.k(); -    double __p = __pr.p(); -    if (__k <= 21 * __p) -    { -        bernoulli_distribution __gen(__p); -        result_type __f = 0; -        result_type __s = 0; -        while (__s < __k) -        { -            if (__gen(__urng)) -                ++__s; -            else -                ++__f; -        } -        return __f; -    } -    return poisson_distribution<result_type>(gamma_distribution<double> -                                            (__k, (1-__p)/__p)(__urng))(__urng); -} - -template <class _CharT, class _Traits, class _IntType> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const negative_binomial_distribution<_IntType>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    return __os << __x.k() << __sp << __x.p(); -} - -template <class _CharT, class _Traits, class _IntType> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           negative_binomial_distribution<_IntType>& __x) -{ -    typedef negative_binomial_distribution<_IntType> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __k; -    double __p; -    __is >> __k >> __p; -    if (!__is.fail()) -        __x.param(param_type(__k, __p)); -    return __is; -} - -// geometric_distribution - -template<class _IntType = int> -class _LIBCPP_TEMPLATE_VIS geometric_distribution -{ -public: -    // types -    typedef _IntType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        double __p_; -    public: -        typedef geometric_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(double __p = 0.5) : __p_(__p) {} - -        _LIBCPP_INLINE_VISIBILITY -        double p() const {return __p_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__p_ == __y.__p_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructors and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    geometric_distribution() : geometric_distribution(0.5) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit geometric_distribution(double __p) -        : __p_(__p) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit geometric_distribution(double __p = 0.5) -        : __p_(__p) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit geometric_distribution(const param_type& __p) : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g, const param_type& __p) -        {return negative_binomial_distribution<result_type>(1, __p.p())(__g);} - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    double p() const {return __p_.p();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::max();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const geometric_distribution& __x, -                        const geometric_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const geometric_distribution& __x, -                        const geometric_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _CharT, class _Traits, class _IntType> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const geometric_distribution<_IntType>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    return __os << __x.p(); -} - -template <class _CharT, class _Traits, class _IntType> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           geometric_distribution<_IntType>& __x) -{ -    typedef geometric_distribution<_IntType> _Eng; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    double __p; -    __is >> __p; -    if (!__is.fail()) -        __x.param(param_type(__p)); -    return __is; -} - -// chi_squared_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS chi_squared_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __n_; -    public: -        typedef chi_squared_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __n = 1) : __n_(__n) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type n() const {return __n_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__n_ == __y.__n_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    chi_squared_distribution() : chi_squared_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit chi_squared_distribution(result_type __n) -        : __p_(param_type(__n)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit chi_squared_distribution(result_type __n = 1) -        : __p_(param_type(__n)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit chi_squared_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g, const param_type& __p) -        {return gamma_distribution<result_type>(__p.n() / 2, 2)(__g);} - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type n() const {return __p_.n();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const chi_squared_distribution& __x, -                        const chi_squared_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const chi_squared_distribution& __x, -                        const chi_squared_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const chi_squared_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    __os << __x.n(); -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           chi_squared_distribution<_RT>& __x) -{ -    typedef chi_squared_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __n; -    __is >> __n; -    if (!__is.fail()) -        __x.param(param_type(__n)); -    return __is; -} - -// cauchy_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS cauchy_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __a_; -        result_type __b_; -    public: -        typedef cauchy_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __a = 0, result_type __b = 1) -            : __a_(__a), __b_(__b) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type a() const {return __a_;} -        _LIBCPP_INLINE_VISIBILITY -        result_type b() const {return __b_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__a_ == __y.__a_ && __x.__b_ == __y.__b_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    cauchy_distribution() : cauchy_distribution(0) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit cauchy_distribution(result_type __a, result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit cauchy_distribution(result_type __a = 0, result_type __b = 1) -        : __p_(param_type(__a, __b)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit cauchy_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> _LIBCPP_INLINE_VISIBILITY result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type a() const {return __p_.a();} -    _LIBCPP_INLINE_VISIBILITY -    result_type b() const {return __p_.b();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return -numeric_limits<result_type>::infinity();} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const cauchy_distribution& __x, -                        const cauchy_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const cauchy_distribution& __x, -                        const cauchy_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _RealType> -template<class _URNG> -inline -_RealType -cauchy_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    uniform_real_distribution<result_type> __gen; -    // purposefully let tan arg get as close to pi/2 as it wants, tan will return a finite -    return __p.a() + __p.b() * _VSTD::tan(3.1415926535897932384626433832795 * __gen(__g)); -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const cauchy_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.a() << __sp << __x.b(); -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           cauchy_distribution<_RT>& __x) -{ -    typedef cauchy_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __a; -    result_type __b; -    __is >> __a >> __b; -    if (!__is.fail()) -        __x.param(param_type(__a, __b)); -    return __is; -} - -// fisher_f_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS fisher_f_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __m_; -        result_type __n_; -    public: -        typedef fisher_f_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __m = 1, result_type __n = 1) -            : __m_(__m), __n_(__n) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type m() const {return __m_;} -        _LIBCPP_INLINE_VISIBILITY -        result_type n() const {return __n_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__m_ == __y.__m_ && __x.__n_ == __y.__n_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    fisher_f_distribution() : fisher_f_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit fisher_f_distribution(result_type __m, result_type __n = 1) -        : __p_(param_type(__m, __n)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit fisher_f_distribution(result_type __m = 1, result_type __n = 1) -        : __p_(param_type(__m, __n)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit fisher_f_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type m() const {return __p_.m();} -    _LIBCPP_INLINE_VISIBILITY -    result_type n() const {return __p_.n();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const fisher_f_distribution& __x, -                        const fisher_f_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const fisher_f_distribution& __x, -                        const fisher_f_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _RealType> -template<class _URNG> -_RealType -fisher_f_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    gamma_distribution<result_type> __gdm(__p.m() * result_type(.5)); -    gamma_distribution<result_type> __gdn(__p.n() * result_type(.5)); -    return __p.n() * __gdm(__g) / (__p.m() * __gdn(__g)); -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const fisher_f_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    __os << __x.m() << __sp << __x.n(); -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           fisher_f_distribution<_RT>& __x) -{ -    typedef fisher_f_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __m; -    result_type __n; -    __is >> __m >> __n; -    if (!__is.fail()) -        __x.param(param_type(__m, __n)); -    return __is; -} - -// student_t_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS student_t_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        result_type __n_; -    public: -        typedef student_t_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        explicit param_type(result_type __n = 1) : __n_(__n) {} - -        _LIBCPP_INLINE_VISIBILITY -        result_type n() const {return __n_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__n_ == __y.__n_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} -    }; - -private: -    param_type __p_; -    normal_distribution<result_type> __nd_; - -public: -    // constructor and reset functions -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    student_t_distribution() : student_t_distribution(1) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit student_t_distribution(result_type __n) -        : __p_(param_type(__n)) {} -#else -    _LIBCPP_INLINE_VISIBILITY -    explicit student_t_distribution(result_type __n = 1) -        : __p_(param_type(__n)) {} -#endif -    _LIBCPP_INLINE_VISIBILITY -    explicit student_t_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {__nd_.reset();} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    result_type n() const {return __p_.n();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return -numeric_limits<result_type>::infinity();} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return numeric_limits<result_type>::infinity();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const student_t_distribution& __x, -                        const student_t_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const student_t_distribution& __x, -                        const student_t_distribution& __y) -        {return !(__x == __y);} -}; - -template <class _RealType> -template<class _URNG> -_RealType -student_t_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    gamma_distribution<result_type> __gd(__p.n() * .5, 2); -    return __nd_(__g) * _VSTD::sqrt(__p.n()/__gd(__g)); -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const student_t_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    __os << __x.n(); -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           student_t_distribution<_RT>& __x) -{ -    typedef student_t_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    typedef typename _Eng::param_type param_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    result_type __n; -    __is >> __n; -    if (!__is.fail()) -        __x.param(param_type(__n)); -    return __is; -} - -// discrete_distribution - -template<class _IntType = int> -class _LIBCPP_TEMPLATE_VIS discrete_distribution -{ -public: -    // types -    typedef _IntType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        vector<double> __p_; -    public: -        typedef discrete_distribution distribution_type; - -        _LIBCPP_INLINE_VISIBILITY -        param_type() {} -        template<class _InputIterator> -            _LIBCPP_INLINE_VISIBILITY -            param_type(_InputIterator __f, _InputIterator __l) -            : __p_(__f, __l) {__init();} -#ifndef _LIBCPP_CXX03_LANG -        _LIBCPP_INLINE_VISIBILITY -        param_type(initializer_list<double> __wl) -            : __p_(__wl.begin(), __wl.end()) {__init();} -#endif // _LIBCPP_CXX03_LANG -        template<class _UnaryOperation> -            param_type(size_t __nw, double __xmin, double __xmax, -                       _UnaryOperation __fw); - -        vector<double> probabilities() const; - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__p_ == __y.__p_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} - -    private: -        void __init(); - -        friend class discrete_distribution; - -        template <class _CharT, class _Traits, class _IT> -        friend -        basic_ostream<_CharT, _Traits>& -        operator<<(basic_ostream<_CharT, _Traits>& __os, -                   const discrete_distribution<_IT>& __x); - -        template <class _CharT, class _Traits, class _IT> -        friend -        basic_istream<_CharT, _Traits>& -        operator>>(basic_istream<_CharT, _Traits>& __is, -                   discrete_distribution<_IT>& __x); -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -    _LIBCPP_INLINE_VISIBILITY -    discrete_distribution() {} -    template<class _InputIterator> -        _LIBCPP_INLINE_VISIBILITY -        discrete_distribution(_InputIterator __f, _InputIterator __l) -            : __p_(__f, __l) {} -#ifndef _LIBCPP_CXX03_LANG -    _LIBCPP_INLINE_VISIBILITY -    discrete_distribution(initializer_list<double> __wl) -        : __p_(__wl) {} -#endif // _LIBCPP_CXX03_LANG -    template<class _UnaryOperation> -        _LIBCPP_INLINE_VISIBILITY -        discrete_distribution(size_t __nw, double __xmin, double __xmax, -                              _UnaryOperation __fw) -        : __p_(__nw, __xmin, __xmax, __fw) {} -    _LIBCPP_INLINE_VISIBILITY -    explicit discrete_distribution(const param_type& __p) -        : __p_(__p) {} -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    vector<double> probabilities() const {return __p_.probabilities();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return 0;} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return __p_.__p_.size();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const discrete_distribution& __x, -                        const discrete_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const discrete_distribution& __x, -                        const discrete_distribution& __y) -        {return !(__x == __y);} - -    template <class _CharT, class _Traits, class _IT> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const discrete_distribution<_IT>& __x); - -    template <class _CharT, class _Traits, class _IT> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               discrete_distribution<_IT>& __x); -}; - -template<class _IntType> -template<class _UnaryOperation> -discrete_distribution<_IntType>::param_type::param_type(size_t __nw, -                                                        double __xmin, -                                                        double __xmax, -                                                        _UnaryOperation __fw) -{ -    if (__nw > 1) -    { -        __p_.reserve(__nw - 1); -        double __d = (__xmax - __xmin) / __nw; -        double __d2 = __d / 2; -        for (size_t __k = 0; __k < __nw; ++__k) -            __p_.push_back(__fw(__xmin + __k * __d + __d2)); -        __init(); -    } -} - -template<class _IntType> -void -discrete_distribution<_IntType>::param_type::__init() -{ -    if (!__p_.empty()) -    { -        if (__p_.size() > 1) -        { -            double __s = _VSTD::accumulate(__p_.begin(), __p_.end(), 0.0); -            for (vector<double>::iterator __i = __p_.begin(), __e = __p_.end(); __i < __e; ++__i) -                *__i /= __s; -            vector<double> __t(__p_.size() - 1); -            _VSTD::partial_sum(__p_.begin(), __p_.end() - 1, __t.begin()); -            swap(__p_, __t); -        } -        else -        { -            __p_.clear(); -            __p_.shrink_to_fit(); -        } -    } -} - -template<class _IntType> -vector<double> -discrete_distribution<_IntType>::param_type::probabilities() const -{ -    size_t __n = __p_.size(); -    vector<double> __p(__n+1); -    _VSTD::adjacent_difference(__p_.begin(), __p_.end(), __p.begin()); -    if (__n > 0) -        __p[__n] = 1 - __p_[__n-1]; -    else -        __p[0] = 1; -    return __p; -} - -template<class _IntType> -template<class _URNG> -_IntType -discrete_distribution<_IntType>::operator()(_URNG& __g, const param_type& __p) -{ -    uniform_real_distribution<double> __gen; -    return static_cast<_IntType>( -           _VSTD::upper_bound(__p.__p_.begin(), __p.__p_.end(), __gen(__g)) - -                                                              __p.__p_.begin()); -} - -template <class _CharT, class _Traits, class _IT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const discrete_distribution<_IT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    size_t __n = __x.__p_.__p_.size(); -    __os << __n; -    for (size_t __i = 0; __i < __n; ++__i) -        __os << __sp << __x.__p_.__p_[__i]; -    return __os; -} - -template <class _CharT, class _Traits, class _IT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           discrete_distribution<_IT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    size_t __n; -    __is >> __n; -    vector<double> __p(__n); -    for (size_t __i = 0; __i < __n; ++__i) -        __is >> __p[__i]; -    if (!__is.fail()) -        swap(__x.__p_.__p_, __p); -    return __is; -} - -// piecewise_constant_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS piecewise_constant_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        vector<result_type> __b_; -        vector<result_type> __densities_; -        vector<result_type> __areas_; -    public: -        typedef piecewise_constant_distribution distribution_type; - -        param_type(); -        template<class _InputIteratorB, class _InputIteratorW> -            param_type(_InputIteratorB __fB, _InputIteratorB __lB, -                       _InputIteratorW __fW); -#ifndef _LIBCPP_CXX03_LANG -        template<class _UnaryOperation> -            param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); -#endif // _LIBCPP_CXX03_LANG -        template<class _UnaryOperation> -            param_type(size_t __nw, result_type __xmin, result_type __xmax, -                       _UnaryOperation __fw); -        param_type(param_type const&) = default; -        param_type & operator=(const param_type& __rhs); - -        _LIBCPP_INLINE_VISIBILITY -        vector<result_type> intervals() const {return __b_;} -        _LIBCPP_INLINE_VISIBILITY -        vector<result_type> densities() const {return __densities_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} - -    private: -        void __init(); - -        friend class piecewise_constant_distribution; - -        template <class _CharT, class _Traits, class _RT> -        friend -        basic_ostream<_CharT, _Traits>& -        operator<<(basic_ostream<_CharT, _Traits>& __os, -                   const piecewise_constant_distribution<_RT>& __x); - -        template <class _CharT, class _Traits, class _RT> -        friend -        basic_istream<_CharT, _Traits>& -        operator>>(basic_istream<_CharT, _Traits>& __is, -                   piecewise_constant_distribution<_RT>& __x); -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -    _LIBCPP_INLINE_VISIBILITY -    piecewise_constant_distribution() {} -    template<class _InputIteratorB, class _InputIteratorW> -        _LIBCPP_INLINE_VISIBILITY -        piecewise_constant_distribution(_InputIteratorB __fB, -                                        _InputIteratorB __lB, -                                        _InputIteratorW __fW) -        : __p_(__fB, __lB, __fW) {} - -#ifndef _LIBCPP_CXX03_LANG -    template<class _UnaryOperation> -        _LIBCPP_INLINE_VISIBILITY -        piecewise_constant_distribution(initializer_list<result_type> __bl, -                                        _UnaryOperation __fw) -        : __p_(__bl, __fw) {} -#endif // _LIBCPP_CXX03_LANG - -    template<class _UnaryOperation> -        _LIBCPP_INLINE_VISIBILITY -        piecewise_constant_distribution(size_t __nw, result_type __xmin, -                                        result_type __xmax, _UnaryOperation __fw) -        : __p_(__nw, __xmin, __xmax, __fw) {} - -    _LIBCPP_INLINE_VISIBILITY -    explicit piecewise_constant_distribution(const param_type& __p) -        : __p_(__p) {} - -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    vector<result_type> intervals() const {return __p_.intervals();} -    _LIBCPP_INLINE_VISIBILITY -    vector<result_type> densities() const {return __p_.densities();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return __p_.__b_.front();} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return __p_.__b_.back();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const piecewise_constant_distribution& __x, -                        const piecewise_constant_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const piecewise_constant_distribution& __x, -                           const piecewise_constant_distribution& __y) -        {return !(__x == __y);} - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const piecewise_constant_distribution<_RT>& __x); - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               piecewise_constant_distribution<_RT>& __x); -}; - -template<class _RealType> -typename piecewise_constant_distribution<_RealType>::param_type & -piecewise_constant_distribution<_RealType>::param_type::operator= -                                                       (const param_type& __rhs) -{ -//  These can throw -    __b_.reserve        (__rhs.__b_.size ()); -    __densities_.reserve(__rhs.__densities_.size()); -    __areas_.reserve    (__rhs.__areas_.size()); - -//  These can not throw -    __b_         = __rhs.__b_; -    __densities_ = __rhs.__densities_; -    __areas_     =  __rhs.__areas_; -    return *this; -} - -template<class _RealType> -void -piecewise_constant_distribution<_RealType>::param_type::__init() -{ -    // __densities_ contains non-normalized areas -    result_type __total_area = _VSTD::accumulate(__densities_.begin(), -                                                __densities_.end(), -                                                result_type()); -    for (size_t __i = 0; __i < __densities_.size(); ++__i) -        __densities_[__i] /= __total_area; -    // __densities_ contains normalized areas -    __areas_.assign(__densities_.size(), result_type()); -    _VSTD::partial_sum(__densities_.begin(), __densities_.end() - 1, -                                                          __areas_.begin() + 1); -    // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1] -    __densities_.back() = 1 - __areas_.back();  // correct round off error -    for (size_t __i = 0; __i < __densities_.size(); ++__i) -        __densities_[__i] /= (__b_[__i+1] - __b_[__i]); -    // __densities_ now contains __densities_ -} - -template<class _RealType> -piecewise_constant_distribution<_RealType>::param_type::param_type() -    : __b_(2), -      __densities_(1, 1.0), -      __areas_(1, 0.0) -{ -    __b_[1] = 1; -} - -template<class _RealType> -template<class _InputIteratorB, class _InputIteratorW> -piecewise_constant_distribution<_RealType>::param_type::param_type( -        _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) -    : __b_(__fB, __lB) -{ -    if (__b_.size() < 2) -    { -        __b_.resize(2); -        __b_[0] = 0; -        __b_[1] = 1; -        __densities_.assign(1, 1.0); -        __areas_.assign(1, 0.0); -    } -    else -    { -        __densities_.reserve(__b_.size() - 1); -        for (size_t __i = 0; __i < __b_.size() - 1; ++__i, ++__fW) -            __densities_.push_back(*__fW); -        __init(); -    } -} - -#ifndef _LIBCPP_CXX03_LANG - -template<class _RealType> -template<class _UnaryOperation> -piecewise_constant_distribution<_RealType>::param_type::param_type( -        initializer_list<result_type> __bl, _UnaryOperation __fw) -    : __b_(__bl.begin(), __bl.end()) -{ -    if (__b_.size() < 2) -    { -        __b_.resize(2); -        __b_[0] = 0; -        __b_[1] = 1; -        __densities_.assign(1, 1.0); -        __areas_.assign(1, 0.0); -    } -    else -    { -        __densities_.reserve(__b_.size() - 1); -        for (size_t __i = 0; __i < __b_.size() - 1; ++__i) -            __densities_.push_back(__fw((__b_[__i+1] + __b_[__i])*.5)); -        __init(); -    } -} - -#endif // _LIBCPP_CXX03_LANG - -template<class _RealType> -template<class _UnaryOperation> -piecewise_constant_distribution<_RealType>::param_type::param_type( -        size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) -    : __b_(__nw == 0 ? 2 : __nw + 1) -{ -    size_t __n = __b_.size() - 1; -    result_type __d = (__xmax - __xmin) / __n; -    __densities_.reserve(__n); -    for (size_t __i = 0; __i < __n; ++__i) -    { -        __b_[__i] = __xmin + __i * __d; -        __densities_.push_back(__fw(__b_[__i] + __d*.5)); -    } -    __b_[__n] = __xmax; -    __init(); -} - -template<class _RealType> -template<class _URNG> -_RealType -piecewise_constant_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    typedef uniform_real_distribution<result_type> _Gen; -    result_type __u = _Gen()(__g); -    ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), -                                      __u) - __p.__areas_.begin() - 1; -    return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k]; -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const piecewise_constant_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    size_t __n = __x.__p_.__b_.size(); -    __os << __n; -    for (size_t __i = 0; __i < __n; ++__i) -        __os << __sp << __x.__p_.__b_[__i]; -    __n = __x.__p_.__densities_.size(); -    __os << __sp << __n; -    for (size_t __i = 0; __i < __n; ++__i) -        __os << __sp << __x.__p_.__densities_[__i]; -    __n = __x.__p_.__areas_.size(); -    __os << __sp << __n; -    for (size_t __i = 0; __i < __n; ++__i) -        __os << __sp << __x.__p_.__areas_[__i]; -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           piecewise_constant_distribution<_RT>& __x) -{ -    typedef piecewise_constant_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    size_t __n; -    __is >> __n; -    vector<result_type> __b(__n); -    for (size_t __i = 0; __i < __n; ++__i) -        __is >> __b[__i]; -    __is >> __n; -    vector<result_type> __densities(__n); -    for (size_t __i = 0; __i < __n; ++__i) -        __is >> __densities[__i]; -    __is >> __n; -    vector<result_type> __areas(__n); -    for (size_t __i = 0; __i < __n; ++__i) -        __is >> __areas[__i]; -    if (!__is.fail()) -    { -        swap(__x.__p_.__b_, __b); -        swap(__x.__p_.__densities_, __densities); -        swap(__x.__p_.__areas_, __areas); -    } -    return __is; -} - -// piecewise_linear_distribution - -template<class _RealType = double> -class _LIBCPP_TEMPLATE_VIS piecewise_linear_distribution -{ -public: -    // types -    typedef _RealType result_type; - -    class _LIBCPP_TEMPLATE_VIS param_type -    { -        vector<result_type> __b_; -        vector<result_type> __densities_; -        vector<result_type> __areas_; -    public: -        typedef piecewise_linear_distribution distribution_type; - -        param_type(); -        template<class _InputIteratorB, class _InputIteratorW> -            param_type(_InputIteratorB __fB, _InputIteratorB __lB, -                       _InputIteratorW __fW); -#ifndef _LIBCPP_CXX03_LANG -        template<class _UnaryOperation> -            param_type(initializer_list<result_type> __bl, _UnaryOperation __fw); -#endif // _LIBCPP_CXX03_LANG -        template<class _UnaryOperation> -            param_type(size_t __nw, result_type __xmin, result_type __xmax, -                       _UnaryOperation __fw); -        param_type(param_type const&) = default; -        param_type & operator=(const param_type& __rhs); - -        _LIBCPP_INLINE_VISIBILITY -        vector<result_type> intervals() const {return __b_;} -        _LIBCPP_INLINE_VISIBILITY -        vector<result_type> densities() const {return __densities_;} - -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator==(const param_type& __x, const param_type& __y) -            {return __x.__densities_ == __y.__densities_ && __x.__b_ == __y.__b_;} -        friend _LIBCPP_INLINE_VISIBILITY -            bool operator!=(const param_type& __x, const param_type& __y) -            {return !(__x == __y);} - -    private: -        void __init(); - -        friend class piecewise_linear_distribution; - -        template <class _CharT, class _Traits, class _RT> -        friend -        basic_ostream<_CharT, _Traits>& -        operator<<(basic_ostream<_CharT, _Traits>& __os, -                   const piecewise_linear_distribution<_RT>& __x); - -        template <class _CharT, class _Traits, class _RT> -        friend -        basic_istream<_CharT, _Traits>& -        operator>>(basic_istream<_CharT, _Traits>& __is, -                   piecewise_linear_distribution<_RT>& __x); -    }; - -private: -    param_type __p_; - -public: -    // constructor and reset functions -    _LIBCPP_INLINE_VISIBILITY -    piecewise_linear_distribution() {} -    template<class _InputIteratorB, class _InputIteratorW> -        _LIBCPP_INLINE_VISIBILITY -        piecewise_linear_distribution(_InputIteratorB __fB, -                                      _InputIteratorB __lB, -                                      _InputIteratorW __fW) -        : __p_(__fB, __lB, __fW) {} - -#ifndef _LIBCPP_CXX03_LANG -    template<class _UnaryOperation> -        _LIBCPP_INLINE_VISIBILITY -        piecewise_linear_distribution(initializer_list<result_type> __bl, -                                      _UnaryOperation __fw) -        : __p_(__bl, __fw) {} -#endif // _LIBCPP_CXX03_LANG - -    template<class _UnaryOperation> -        _LIBCPP_INLINE_VISIBILITY -        piecewise_linear_distribution(size_t __nw, result_type __xmin, -                                      result_type __xmax, _UnaryOperation __fw) -        : __p_(__nw, __xmin, __xmax, __fw) {} - -    _LIBCPP_INLINE_VISIBILITY -    explicit piecewise_linear_distribution(const param_type& __p) -        : __p_(__p) {} - -    _LIBCPP_INLINE_VISIBILITY -    void reset() {} - -    // generating functions -    template<class _URNG> -        _LIBCPP_INLINE_VISIBILITY -        result_type operator()(_URNG& __g) -        {return (*this)(__g, __p_);} -    template<class _URNG> result_type operator()(_URNG& __g, const param_type& __p); - -    // property functions -    _LIBCPP_INLINE_VISIBILITY -    vector<result_type> intervals() const {return __p_.intervals();} -    _LIBCPP_INLINE_VISIBILITY -    vector<result_type> densities() const {return __p_.densities();} - -    _LIBCPP_INLINE_VISIBILITY -    param_type param() const {return __p_;} -    _LIBCPP_INLINE_VISIBILITY -    void param(const param_type& __p) {__p_ = __p;} - -    _LIBCPP_INLINE_VISIBILITY -    result_type min() const {return __p_.__b_.front();} -    _LIBCPP_INLINE_VISIBILITY -    result_type max() const {return __p_.__b_.back();} - -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator==(const piecewise_linear_distribution& __x, -                        const piecewise_linear_distribution& __y) -        {return __x.__p_ == __y.__p_;} -    friend _LIBCPP_INLINE_VISIBILITY -        bool operator!=(const piecewise_linear_distribution& __x, -                        const piecewise_linear_distribution& __y) -        {return !(__x == __y);} - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_ostream<_CharT, _Traits>& -    operator<<(basic_ostream<_CharT, _Traits>& __os, -               const piecewise_linear_distribution<_RT>& __x); - -    template <class _CharT, class _Traits, class _RT> -    friend -    basic_istream<_CharT, _Traits>& -    operator>>(basic_istream<_CharT, _Traits>& __is, -               piecewise_linear_distribution<_RT>& __x); -}; - -template<class _RealType> -typename piecewise_linear_distribution<_RealType>::param_type & -piecewise_linear_distribution<_RealType>::param_type::operator= -                                                       (const param_type& __rhs) -{ -//  These can throw -    __b_.reserve        (__rhs.__b_.size ()); -    __densities_.reserve(__rhs.__densities_.size()); -    __areas_.reserve    (__rhs.__areas_.size()); - -//  These can not throw -    __b_         = __rhs.__b_; -    __densities_ = __rhs.__densities_; -    __areas_     =  __rhs.__areas_; -    return *this; -} - - -template<class _RealType> -void -piecewise_linear_distribution<_RealType>::param_type::__init() -{ -    __areas_.assign(__densities_.size() - 1, result_type()); -    result_type _Sp = 0; -    for (size_t __i = 0; __i < __areas_.size(); ++__i) -    { -        __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) * -                        (__b_[__i+1] - __b_[__i]) * .5; -        _Sp += __areas_[__i]; -    } -    for (size_t __i = __areas_.size(); __i > 1;) -    { -        --__i; -        __areas_[__i] = __areas_[__i-1] / _Sp; -    } -    __areas_[0] = 0; -    for (size_t __i = 1; __i < __areas_.size(); ++__i) -        __areas_[__i] += __areas_[__i-1]; -    for (size_t __i = 0; __i < __densities_.size(); ++__i) -        __densities_[__i] /= _Sp; -} - -template<class _RealType> -piecewise_linear_distribution<_RealType>::param_type::param_type() -    : __b_(2), -      __densities_(2, 1.0), -      __areas_(1, 0.0) -{ -    __b_[1] = 1; -} - -template<class _RealType> -template<class _InputIteratorB, class _InputIteratorW> -piecewise_linear_distribution<_RealType>::param_type::param_type( -        _InputIteratorB __fB, _InputIteratorB __lB, _InputIteratorW __fW) -    : __b_(__fB, __lB) -{ -    if (__b_.size() < 2) -    { -        __b_.resize(2); -        __b_[0] = 0; -        __b_[1] = 1; -        __densities_.assign(2, 1.0); -        __areas_.assign(1, 0.0); -    } -    else -    { -        __densities_.reserve(__b_.size()); -        for (size_t __i = 0; __i < __b_.size(); ++__i, ++__fW) -            __densities_.push_back(*__fW); -        __init(); -    } -} - -#ifndef _LIBCPP_CXX03_LANG - -template<class _RealType> -template<class _UnaryOperation> -piecewise_linear_distribution<_RealType>::param_type::param_type( -        initializer_list<result_type> __bl, _UnaryOperation __fw) -    : __b_(__bl.begin(), __bl.end()) -{ -    if (__b_.size() < 2) -    { -        __b_.resize(2); -        __b_[0] = 0; -        __b_[1] = 1; -        __densities_.assign(2, 1.0); -        __areas_.assign(1, 0.0); -    } -    else -    { -        __densities_.reserve(__b_.size()); -        for (size_t __i = 0; __i < __b_.size(); ++__i) -            __densities_.push_back(__fw(__b_[__i])); -        __init(); -    } -} - -#endif // _LIBCPP_CXX03_LANG - -template<class _RealType> -template<class _UnaryOperation> -piecewise_linear_distribution<_RealType>::param_type::param_type( -        size_t __nw, result_type __xmin, result_type __xmax, _UnaryOperation __fw) -    : __b_(__nw == 0 ? 2 : __nw + 1) -{ -    size_t __n = __b_.size() - 1; -    result_type __d = (__xmax - __xmin) / __n; -    __densities_.reserve(__b_.size()); -    for (size_t __i = 0; __i < __n; ++__i) -    { -        __b_[__i] = __xmin + __i * __d; -        __densities_.push_back(__fw(__b_[__i])); -    } -    __b_[__n] = __xmax; -    __densities_.push_back(__fw(__b_[__n])); -    __init(); -} - -template<class _RealType> -template<class _URNG> -_RealType -piecewise_linear_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p) -{ -    typedef uniform_real_distribution<result_type> _Gen; -    result_type __u = _Gen()(__g); -    ptrdiff_t __k = _VSTD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(), -                                      __u) - __p.__areas_.begin() - 1; -    __u -= __p.__areas_[__k]; -    const result_type __dk = __p.__densities_[__k]; -    const result_type __dk1 = __p.__densities_[__k+1]; -    const result_type __deltad = __dk1 - __dk; -    const result_type __bk = __p.__b_[__k]; -    if (__deltad == 0) -        return __u / __dk + __bk; -    const result_type __bk1 = __p.__b_[__k+1]; -    const result_type __deltab = __bk1 - __bk; -    return (__bk * __dk1 - __bk1 * __dk + -        _VSTD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) / -        __deltad; -} - -template <class _CharT, class _Traits, class _RT> -basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, -           const piecewise_linear_distribution<_RT>& __x) -{ -    __save_flags<_CharT, _Traits> __lx(__os); -    typedef basic_ostream<_CharT, _Traits> _OStream; -    __os.flags(_OStream::dec | _OStream::left | _OStream::fixed | -               _OStream::scientific); -    _CharT __sp = __os.widen(' '); -    __os.fill(__sp); -    size_t __n = __x.__p_.__b_.size(); -    __os << __n; -    for (size_t __i = 0; __i < __n; ++__i) -        __os << __sp << __x.__p_.__b_[__i]; -    __n = __x.__p_.__densities_.size(); -    __os << __sp << __n; -    for (size_t __i = 0; __i < __n; ++__i) -        __os << __sp << __x.__p_.__densities_[__i]; -    __n = __x.__p_.__areas_.size(); -    __os << __sp << __n; -    for (size_t __i = 0; __i < __n; ++__i) -        __os << __sp << __x.__p_.__areas_[__i]; -    return __os; -} - -template <class _CharT, class _Traits, class _RT> -basic_istream<_CharT, _Traits>& -operator>>(basic_istream<_CharT, _Traits>& __is, -           piecewise_linear_distribution<_RT>& __x) -{ -    typedef piecewise_linear_distribution<_RT> _Eng; -    typedef typename _Eng::result_type result_type; -    __save_flags<_CharT, _Traits> __lx(__is); -    typedef basic_istream<_CharT, _Traits> _Istream; -    __is.flags(_Istream::dec | _Istream::skipws); -    size_t __n; -    __is >> __n; -    vector<result_type> __b(__n); -    for (size_t __i = 0; __i < __n; ++__i) -        __is >> __b[__i]; -    __is >> __n; -    vector<result_type> __densities(__n); -    for (size_t __i = 0; __i < __n; ++__i) -        __is >> __densities[__i]; -    __is >> __n; -    vector<result_type> __areas(__n); -    for (size_t __i = 0; __i < __n; ++__i) -        __is >> __areas[__i]; -    if (!__is.fail()) -    { -        swap(__x.__p_.__b_, __b); -        swap(__x.__p_.__densities_, __densities); -        swap(__x.__p_.__areas_, __areas); -    } -    return __is; -} - -_LIBCPP_END_NAMESPACE_STD - -_LIBCPP_POP_MACROS -  #endif // _LIBCPP_RANDOM diff --git a/libcxx/include/ranges b/libcxx/include/ranges index 8a99ee64cfc9..dd7decf66fa8 100644 --- a/libcxx/include/ranges +++ b/libcxx/include/ranges @@ -36,7 +36,7 @@ namespace std::ranges {      inline constexpr bool enable_borrowed_range = false;    template<class T> -    using iterator_t = decltype(ranges::begin(declval<R&>())); +    using iterator_t = decltype(ranges::begin(declval<T&>()));    template<range R>      using sentinel_t = decltype(ranges::end(declval<R&>()));    template<range R> diff --git a/libcxx/include/string_view b/libcxx/include/string_view index 0ad7dcce9848..a5f85e88b502 100644 --- a/libcxx/include/string_view +++ b/libcxx/include/string_view @@ -87,6 +87,8 @@ namespace std {        constexpr basic_string_view(const charT* str, size_type len);        template <class It, class End>        constexpr basic_string_view(It begin, End end); // C++20 +      template <class Range> +      constexpr basic_string_view(Range&& r); // C++23        // 7.4, basic_string_view iterator support        constexpr const_iterator begin() const noexcept; @@ -171,6 +173,8 @@ namespace std {    // basic_string_view deduction guides    template<class It, class End>      basic_string_view(It, End) -> basic_string_view<iter_value_t<It>>; // C++20 +  template<class Range> +    basic_string_view(Range&&) -> basic_string_view<ranges::range_value_t<Range>>; // C++23    // 7.11, Hash support    template <class T> struct hash; @@ -191,12 +195,13 @@ namespace std {  */ -#include <__concepts/convertible_to.h> -#include <__concepts/same_as.h>  #include <__config>  #include <__debug> +#include <__ranges/concepts.h> +#include <__ranges/data.h>  #include <__ranges/enable_borrowed_range.h>  #include <__ranges/enable_view.h> +#include <__ranges/size.h>  #include <__string>  #include <algorithm>  #include <compare> @@ -204,6 +209,7 @@ namespace std {  #include <iterator>  #include <limits>  #include <stdexcept> +#include <type_traits>  #include <version>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -282,7 +288,7 @@ public:  #if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES)      template <contiguous_iterator _It, sized_sentinel_for<_It> _End> -      requires (same_as<iter_value_t<_It>, _CharT> && !convertible_to<_End, size_type>) +      requires (is_same_v<iter_value_t<_It>, _CharT> && !is_convertible_v<_End, size_type>)      constexpr _LIBCPP_HIDE_FROM_ABI basic_string_view(_It __begin, _End __end)         : __data(_VSTD::to_address(__begin)), __size(__end - __begin)      { @@ -290,6 +296,25 @@ public:      }  #endif +#if _LIBCPP_STD_VER > 20 && !defined(_LIBCPP_HAS_NO_RANGES) +    template <class _Range> +      requires ( +        !is_same_v<remove_cvref_t<_Range>, basic_string_view> && +        ranges::contiguous_range<_Range> && +        ranges::sized_range<_Range> && +        is_same_v<ranges::range_value_t<_Range>, _CharT> && +        !is_convertible_v<_Range, const _CharT*> && +        (!requires(remove_cvref_t<_Range>& d) { +          d.operator _VSTD::basic_string_view<_CharT, _Traits>(); +        }) && +        (!requires { +         typename remove_reference_t<_Range>::traits_type; +        } || is_same_v<typename remove_reference_t<_Range>::traits_type, _Traits>) +      ) +    constexpr _LIBCPP_HIDE_FROM_ABI +    basic_string_view(_Range&& __r) : __data(ranges::data(__r)), __size(ranges::size(__r)) {} +#endif +      _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY      basic_string_view(const _CharT* __s)          : __data(__s), __size(_VSTD::__char_traits_length_checked<_Traits>(__s)) {} @@ -697,6 +722,12 @@ template <contiguous_iterator _It, sized_sentinel_for<_It> _End>    basic_string_view(_It, _End) -> basic_string_view<iter_value_t<_It>>;  #endif + +#if _LIBCPP_STD_VER > 20 && !defined(_LIBCPP_HAS_NO_RANGES) +template <ranges::contiguous_range _Range> +  basic_string_view(_Range) -> basic_string_view<ranges::range_value_t<_Range>>; +#endif +  // [string.view.comparison]  // operator ==  template<class _CharT, class _Traits> @@ -708,7 +739,9 @@ bool operator==(basic_string_view<_CharT, _Traits> __lhs,      return __lhs.compare(__rhs) == 0;  } -template<class _CharT, class _Traits> +// The dummy default template parameters are used to work around a MSVC issue with mangling, see VSO-409326 for details. +// This applies to the other sufficient overloads below for the other comparison operators. +template<class _CharT, class _Traits, int = 1>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator==(basic_string_view<_CharT, _Traits> __lhs,                  typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT @@ -717,7 +750,7 @@ bool operator==(basic_string_view<_CharT, _Traits> __lhs,      return __lhs.compare(__rhs) == 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 2>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator==(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,                  basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT @@ -737,7 +770,7 @@ bool operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_Cha      return __lhs.compare(__rhs) != 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 1>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator!=(basic_string_view<_CharT, _Traits> __lhs,                  typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT @@ -747,7 +780,7 @@ bool operator!=(basic_string_view<_CharT, _Traits> __lhs,      return __lhs.compare(__rhs) != 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 2>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator!=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,                  basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT @@ -766,7 +799,7 @@ bool operator<(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_Char      return __lhs.compare(__rhs) < 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 1>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator<(basic_string_view<_CharT, _Traits> __lhs,                  typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT @@ -774,7 +807,7 @@ bool operator<(basic_string_view<_CharT, _Traits> __lhs,      return __lhs.compare(__rhs) < 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 2>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator<(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,                  basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT @@ -791,7 +824,7 @@ bool operator> (basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_Cha      return __lhs.compare(__rhs) > 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 1>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator>(basic_string_view<_CharT, _Traits> __lhs,                  typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT @@ -799,7 +832,7 @@ bool operator>(basic_string_view<_CharT, _Traits> __lhs,      return __lhs.compare(__rhs) > 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 2>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator>(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,                  basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT @@ -816,7 +849,7 @@ bool operator<=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_Cha      return __lhs.compare(__rhs) <= 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 1>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator<=(basic_string_view<_CharT, _Traits> __lhs,                  typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT @@ -824,7 +857,7 @@ bool operator<=(basic_string_view<_CharT, _Traits> __lhs,      return __lhs.compare(__rhs) <= 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 2>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator<=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,                  basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT @@ -842,7 +875,7 @@ bool operator>=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_Cha  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 1>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator>=(basic_string_view<_CharT, _Traits> __lhs,                  typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT @@ -850,7 +883,7 @@ bool operator>=(basic_string_view<_CharT, _Traits> __lhs,      return __lhs.compare(__rhs) >= 0;  } -template<class _CharT, class _Traits> +template<class _CharT, class _Traits, int = 2>  _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY  bool operator>=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs,                  basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits index e9d5e06f36dc..bfb6fcb05134 100644 --- a/libcxx/include/type_traits +++ b/libcxx/include/type_traits @@ -1416,9 +1416,7 @@ template<class _Tp> using type_identity_t = typename type_identity<_Tp>::type;  // is_signed -// Before Clang 10, __is_signed didn't work for floating-point types or enums. -#if __has_keyword(__is_signed) &&                                              \ -    !(defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER < 1000) +#if __has_keyword(__is_signed)  template<class _Tp>  struct _LIBCPP_TEMPLATE_VIS is_signed : _BoolConstant<__is_signed(_Tp)> { }; diff --git a/libcxx/include/utility b/libcxx/include/utility index 2b3c4dfa3f0e..4fa90289a412 100644 --- a/libcxx/include/utility +++ b/libcxx/include/utility @@ -227,6 +227,7 @@ template <class T>  #include <__utility/move.h>  #include <__utility/pair.h>  #include <__utility/piecewise_construct.h> +#include <__utility/priority_tag.h>  #include <__utility/rel_ops.h>  #include <__utility/swap.h>  #include <__utility/to_underlying.h> diff --git a/libcxx/include/vector b/libcxx/include/vector index e41afbaca509..9b0092cfdbd9 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -350,23 +350,23 @@ class _LIBCPP_TEMPLATE_VIS vector      : private __vector_base<_Tp, _Allocator>  {  private: -    typedef __vector_base<_Tp, _Allocator>                           __base; -    typedef allocator<_Tp>                                           __default_allocator_type; +    typedef __vector_base<_Tp, _Allocator>                  __base; +    typedef allocator<_Tp>                                  __default_allocator_type;  public: -    typedef vector                                                   __self; -    typedef _Tp                                                      value_type; -    typedef _Allocator                                               allocator_type; -    typedef allocator_traits<allocator_type>                         __alloc_traits; -    typedef value_type&                                              reference; -    typedef const value_type&                                        const_reference; -    typedef typename __allocator_traits<allocator_type>::size_type   size_type; -    typedef typename __alloc_traits::difference_type                 difference_type; -    typedef typename __alloc_traits::pointer                         pointer; -    typedef typename __alloc_traits::const_pointer                   const_pointer; -    typedef __wrap_iter<pointer>                                     iterator; -    typedef __wrap_iter<const_pointer>                               const_iterator; -    typedef _VSTD::reverse_iterator<iterator>                        reverse_iterator; -    typedef _VSTD::reverse_iterator<const_iterator>                  const_reverse_iterator; +    typedef vector                                          __self; +    typedef _Tp                                             value_type; +    typedef _Allocator                                      allocator_type; +    typedef allocator_traits<allocator_type>                __alloc_traits; +    typedef value_type&                                     reference; +    typedef const value_type&                               const_reference; +    typedef typename __alloc_traits::size_type              size_type; +    typedef typename __alloc_traits::difference_type        difference_type; +    typedef typename __alloc_traits::pointer                pointer; +    typedef typename __alloc_traits::const_pointer          const_pointer; +    typedef __wrap_iter<pointer>                            iterator; +    typedef __wrap_iter<const_pointer>                      const_iterator; +    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator; +    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;      static_assert((is_same<typename allocator_type::value_type, value_type>::value),                    "Allocator::value_type must be same type as value_type"); @@ -395,7 +395,21 @@ public:      explicit vector(size_type __n, const allocator_type& __a);  #endif      vector(size_type __n, const value_type& __x); -    vector(size_type __n, const value_type& __x, const allocator_type& __a); + +    template <class = __enable_if_t<__is_allocator<_Allocator>::value> > +    vector(size_type __n, const value_type& __x, const allocator_type& __a) +        : __base(__a) +    { +#if _LIBCPP_DEBUG_LEVEL == 2 +      __get_db()->__insert_c(this); +#endif +      if (__n > 0) +      { +          __vallocate(__n); +          __construct_at_end(__n, __x); +      } +    } +      template <class _InputIterator>          vector(_InputIterator __first,                 typename enable_if<__is_cpp17_input_iterator  <_InputIterator>::value && @@ -1127,20 +1141,6 @@ vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x)  }  template <class _Tp, class _Allocator> -vector<_Tp, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) -    : __base(__a) -{ -#if _LIBCPP_DEBUG_LEVEL == 2 -    __get_db()->__insert_c(this); -#endif -    if (__n > 0) -    { -        __vallocate(__n); -        __construct_at_end(__n, __x); -    } -} - -template <class _Tp, class _Allocator>  template <class _InputIterator>  vector<_Tp, _Allocator>::vector(_InputIterator __first,         typename enable_if<__is_cpp17_input_iterator  <_InputIterator>::value && diff --git a/libcxx/include/version b/libcxx/include/version index 7c16ac85e430..9322c3b8c05d 100644 --- a/libcxx/include/version +++ b/libcxx/include/version @@ -41,6 +41,7 @@ __cpp_lib_bool_constant                                 201505L <type_traits>  __cpp_lib_bounded_array_traits                          201902L <type_traits>  __cpp_lib_boyer_moore_searcher                          201603L <functional>  __cpp_lib_byte                                          201603L <cstddef> +__cpp_lib_byteswap                                      202110L <bit>  __cpp_lib_char8_t                                       201811L <atomic> <filesystem> <istream>                                                                  <limits> <locale> <ostream>                                                                  <string> <string_view> @@ -72,7 +73,7 @@ __cpp_lib_exchange_function                             201304L <utility>  __cpp_lib_execution                                     201902L <execution>                                                          201603L // C++17  __cpp_lib_filesystem                                    201703L <filesystem> -__cpp_lib_format                                        201907L <format> +__cpp_lib_format                                        202106L <format>  __cpp_lib_gcd_lcm                                       201606L <numeric>  __cpp_lib_generic_associative_lookup                    201304L <map> <set>  __cpp_lib_generic_unordered_lookup                      201811L <unordered_map> <unordered_set> @@ -300,7 +301,7 @@ __cpp_lib_void_t                                        201411L <type_traits>  # undef  __cpp_lib_execution  // # define __cpp_lib_execution                            201902L  # if !defined(_LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_format) -// #   define __cpp_lib_format                             201907L +// #   define __cpp_lib_format                             202106L  # endif  # define __cpp_lib_generic_unordered_lookup             201811L  # define __cpp_lib_int_pow2                             202002L @@ -344,6 +345,7 @@ __cpp_lib_void_t                                        201411L <type_traits>  #endif  #if _LIBCPP_STD_VER > 20 +# define __cpp_lib_byteswap                             202110L  # define __cpp_lib_is_scoped_enum                       202011L  // # define __cpp_lib_stacktrace                           202011L  // # define __cpp_lib_stdatomic_h                          202011L diff --git a/libcxx/src/filesystem/filesystem_common.h b/libcxx/src/filesystem/filesystem_common.h index 70092fe4e24d..a2c340e61083 100644 --- a/libcxx/src/filesystem/filesystem_common.h +++ b/libcxx/src/filesystem/filesystem_common.h @@ -60,7 +60,7 @@ errc __win_err_to_errc(int err);  namespace { -static _LIBCPP_FORMAT_PRINTF(1, 0) string +static _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 1, 0) string  format_string_impl(const char* msg, va_list ap) {    array<char, 256> buf; @@ -84,7 +84,7 @@ format_string_impl(const char* msg, va_list ap) {    return result;  } -static _LIBCPP_FORMAT_PRINTF(1, 2) string +static _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 1, 2) string  format_string(const char* msg, ...) {    string ret;    va_list ap; @@ -172,7 +172,7 @@ struct ErrorHandler {      _LIBCPP_UNREACHABLE();    } -  _LIBCPP_FORMAT_PRINTF(3, 0) +  _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 3, 0)    void report_impl(const error_code& ec, const char* msg, va_list ap) const {      if (ec_) {        *ec_ = ec; @@ -191,7 +191,7 @@ struct ErrorHandler {      _LIBCPP_UNREACHABLE();    } -  _LIBCPP_FORMAT_PRINTF(3, 4) +  _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 3, 4)    T report(const error_code& ec, const char* msg, ...) const {      va_list ap;      va_start(ap, msg); @@ -213,7 +213,7 @@ struct ErrorHandler {      return report(make_error_code(err));    } -  _LIBCPP_FORMAT_PRINTF(3, 4) +  _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 3, 4)    T report(errc const& err, const char* msg, ...) const {      va_list ap;      va_start(ap, msg);  | 
