From 88f63de301584d741c26c7311d9b849be38cb543 Mon Sep 17 00:00:00 2001 From: Artur Gainullin Date: Tue, 16 Apr 2019 12:27:07 -0700 Subject: [PATCH] [SYCL] Remove wrapper headers Even when compiling for the device, code meant only for host execution must be semantically analyzable. Existing wrapper headers were initially created to resolve this problem. But now -aux-triple is used to pass target triple of opposite side of compilation. Clang knows target triple for both sides of compilation so that preprocessor macros and target builtins from both sides are available. That is why there is no need in existing wrapper headers with stub definitions since they break compilation for cases when standard headers are included. Approach with -aux-triple is not complete solution. Host headers might provide definitions relying on host inline asm, intrinsics, using types not lowerable in device code. So we will need to provide a solution to overload some definitions for the device or to define only some macro for host headers. This will be resolved in other commits. Signed-off-by: Artur Gainullin --- clang/lib/Driver/ToolChains/Clang.cpp | 10 - clang/lib/Headers/CMakeLists.txt | 12 - clang/lib/Headers/sycl_wrappers/__config | 36 - clang/lib/Headers/sycl_wrappers/algorithm | 593 --------- clang/lib/Headers/sycl_wrappers/random | 1458 --------------------- 5 files changed, 2109 deletions(-) delete mode 100644 clang/lib/Headers/sycl_wrappers/__config delete mode 100644 clang/lib/Headers/sycl_wrappers/algorithm delete mode 100644 clang/lib/Headers/sycl_wrappers/random diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 034a7beb17424..b9b6856dc3405 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1168,16 +1168,6 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, if (JA.isOffloading(Action::OFK_Cuda)) getToolChain().AddCudaIncludeArgs(Args, CmdArgs); - // Add include directories for SYCL - if (!Args.hasArg(options::OPT_nobuiltininc) && - getToolChain().getTriple().isSYCLDeviceEnvironment()) { - SmallString<128> P(D.ResourceDir); - llvm::sys::path::append(P, "include"); - llvm::sys::path::append(P, "sycl_wrappers"); - CmdArgs.push_back("-internal-isystem"); - CmdArgs.push_back(Args.MakeArgString(P)); - } - // If we are offloading to a target via OpenMP we need to include the // openmp_wrappers folder which contains alternative system headers. if (JA.isDeviceOffloading(Action::OFK_OpenMP) && diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt index cf6cecaeafc21..392ca2ae391c9 100644 --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -128,12 +128,6 @@ set(ppc_wrapper_files ppc_wrappers/mmintrin.h ) -set(sycl_wrapper_files - sycl_wrappers/algorithm - sycl_wrappers/random - sycl_wrappers/__config -) - set(openmp_wrapper_files openmp_wrappers/math.h openmp_wrappers/cmath @@ -201,12 +195,6 @@ install( DESTINATION ${header_install_dir}/ppc_wrappers COMPONENT clang-resource-headers) -install( - FILES ${sycl_wrapper_files} - COMPONENT clang-resource-headers - PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ - DESTINATION lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include/sycl_wrappers) - install( FILES ${openmp_wrapper_files} DESTINATION ${header_install_dir}/openmp_wrappers diff --git a/clang/lib/Headers/sycl_wrappers/__config b/clang/lib/Headers/sycl_wrappers/__config deleted file mode 100644 index 35670334636b3..0000000000000 --- a/clang/lib/Headers/sycl_wrappers/__config +++ /dev/null @@ -1,36 +0,0 @@ -// -*- C++ -*- -//===--------------------------- __config ---------------------------------===// -// -// 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_STD_VER -# if __cplusplus <= 201103L -# define _LIBCPP_STD_VER 11 -# elif __cplusplus <= 201402L -# define _LIBCPP_STD_VER 14 -# elif __cplusplus <= 201703L -# define _LIBCPP_STD_VER 17 -# endif -#endif - -#if _LIBCPP_STD_VER > 11 -# define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr -#else -# define _LIBCPP_CONSTEXPR_AFTER_CXX11 -#endif - -#if _LIBCPP_STD_VER > 14 -# define _LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr -#else -# define _LIBCPP_CONSTEXPR_AFTER_CXX14 -#endif - -#if _LIBCPP_STD_VER > 17 -# define _LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr -#else -# define _LIBCPP_CONSTEXPR_AFTER_CXX17 -#endif diff --git a/clang/lib/Headers/sycl_wrappers/algorithm b/clang/lib/Headers/sycl_wrappers/algorithm deleted file mode 100644 index bff60089a903a..0000000000000 --- a/clang/lib/Headers/sycl_wrappers/algorithm +++ /dev/null @@ -1,593 +0,0 @@ -// -*- C++ -*- -//===-------------------------- algorithm ---------------------------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#include <__config> -#include -#include - -namespace std { - -template -bool all_of(InputIterator first, InputIterator last, Predicate pred); - -template -bool any_of(InputIterator first, InputIterator last, Predicate pred); - -template -bool none_of(InputIterator first, InputIterator last, Predicate pred); - -template -Function for_each(InputIterator first, InputIterator last, Function f); - -template -InputIterator for_each_n(InputIterator first, Size n, Function f); - -template -InputIterator find(InputIterator first, InputIterator last, const T &value); - -template -InputIterator find_if(InputIterator first, InputIterator last, Predicate pred); - -template -InputIterator find_if_not(InputIterator first, InputIterator last, - Predicate pred); - -template -ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2); - -template -ForwardIterator1 find_end(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2, - BinaryPredicate pred); - -template -ForwardIterator1 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2); - -template -ForwardIterator1 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2, - BinaryPredicate pred); - -template -ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last); - -template -ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, - BinaryPredicate pred); - -template -typename iterator_traits::difference_type -count(InputIterator first, InputIterator last, const T &value); - -template -typename iterator_traits::difference_type -count_if(InputIterator first, InputIterator last, Predicate pred); - -template -pair -mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); - -template -pair -mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, - InputIterator2 last2); // **C++14** - -template -pair -mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, - BinaryPredicate pred); - -template -pair -mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, - InputIterator2 last2, - BinaryPredicate pred); // **C++14** - -template -bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); - -template -bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, - InputIterator2 last2); // **C++14** - -template -bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, - BinaryPredicate pred); - -template -bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, - InputIterator2 last2, - BinaryPredicate pred); // **C++14** - -template -bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2); - -template -bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, - ForwardIterator2 last2); // **C++14** - -template -bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, BinaryPredicate pred); - -template -bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2, - BinaryPredicate pred); // **C++14** - -template -ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2); - -template -ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2, ForwardIterator2 last2, - BinaryPredicate pred); - -template -ForwardIterator search_n(ForwardIterator first, ForwardIterator last, - Size count, const T &value); - -template -ForwardIterator search_n(ForwardIterator first, ForwardIterator last, - Size count, const T &value, BinaryPredicate pred); - -template -OutputIterator copy(InputIterator first, InputIterator last, - OutputIterator result); - -template -OutputIterator copy_if(InputIterator first, InputIterator last, - OutputIterator result, Predicate pred); - -template -OutputIterator copy_n(InputIterator first, Size n, OutputIterator result); - -template -BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, - BidirectionalIterator1 last, - BidirectionalIterator2 result); - -template -ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, - ForwardIterator2 first2); - -template -void iter_swap(ForwardIterator1 a, ForwardIterator2 b); - -template -OutputIterator transform(InputIterator first, InputIterator last, - OutputIterator result, UnaryOperation op); - -template -OutputIterator transform(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, OutputIterator result, - BinaryOperation binary_op); - -template -void replace(ForwardIterator first, ForwardIterator last, const T &old_value, - const T &new_value); - -template -void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, - const T &new_value); - -template -OutputIterator replace_copy(InputIterator first, InputIterator last, - OutputIterator result, const T &old_value, - const T &new_value); - -template -OutputIterator replace_copy_if(InputIterator first, InputIterator last, - OutputIterator result, Predicate pred, - const T &new_value); - -template -void fill(ForwardIterator first, ForwardIterator last, const T &value); - -template -OutputIterator fill_n(OutputIterator first, Size n, const T &value); - -template -void generate(ForwardIterator first, ForwardIterator last, Generator gen); - -template -OutputIterator generate_n(OutputIterator first, Size n, Generator gen); - -template -ForwardIterator remove(ForwardIterator first, ForwardIterator last, - const T &value); - -template -ForwardIterator remove_if(ForwardIterator first, ForwardIterator last, - Predicate pred); - -template -OutputIterator remove_copy(InputIterator first, InputIterator last, - OutputIterator result, const T &value); - -template -OutputIterator remove_copy_if(InputIterator first, InputIterator last, - OutputIterator result, Predicate pred); - -template -ForwardIterator unique(ForwardIterator first, ForwardIterator last); - -template -ForwardIterator unique(ForwardIterator first, ForwardIterator last, - BinaryPredicate pred); - -template -OutputIterator unique_copy(InputIterator first, InputIterator last, - OutputIterator result); - -template -OutputIterator unique_copy(InputIterator first, InputIterator last, - OutputIterator result, BinaryPredicate pred); - -template -void reverse(BidirectionalIterator first, BidirectionalIterator last); - -template -OutputIterator reverse_copy(BidirectionalIterator first, - BidirectionalIterator last, OutputIterator result); - -template -ForwardIterator rotate(ForwardIterator first, ForwardIterator middle, - ForwardIterator last); - -template -OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle, - ForwardIterator last, OutputIterator result); - -template -void random_shuffle( - RandomAccessIterator first, - RandomAccessIterator last); // deprecated in C++14, removed in C++17 - -template -void random_shuffle( - RandomAccessIterator first, RandomAccessIterator last, - RandomNumberGenerator &rand); // deprecated in C++14, removed in C++17 - -template -SampleIterator sample(PopulationIterator first, PopulationIterator last, - SampleIterator out, Distance n, - UniformRandomBitGenerator &&g); - -template -void shuffle(RandomAccessIterator first, RandomAccessIterator last, - UniformRandomNumberGenerator &&g); - -template -bool is_partitioned(InputIterator first, InputIterator last, Predicate pred); - -template -ForwardIterator partition(ForwardIterator first, ForwardIterator last, - Predicate pred); - -template -pair -partition_copy(InputIterator first, InputIterator last, - OutputIterator1 out_true, OutputIterator2 out_false, - Predicate pred); - -template -ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, - Predicate pred); - -template -ForwardIterator partition_point(ForwardIterator first, ForwardIterator last, - Predicate pred); - -template -bool is_sorted(ForwardIterator first, ForwardIterator last); - -template -bool is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); - -template -ForwardIterator is_sorted_until(ForwardIterator first, ForwardIterator last); - -template -ForwardIterator is_sorted_until(ForwardIterator first, ForwardIterator last, - Compare comp); - -template -void sort(RandomAccessIterator first, RandomAccessIterator last); - -template -void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); - -template -void stable_sort(RandomAccessIterator first, RandomAccessIterator last); - -template -void stable_sort(RandomAccessIterator first, RandomAccessIterator last, - Compare comp); - -template -void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, - RandomAccessIterator last); - -template -void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, - RandomAccessIterator last, Compare comp); - -template -RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, - RandomAccessIterator result_first, - RandomAccessIterator result_last); - -template -RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last, - RandomAccessIterator result_first, - RandomAccessIterator result_last, - Compare comp); - -template -void nth_element(RandomAccessIterator first, RandomAccessIterator nth, - RandomAccessIterator last); - -template -void nth_element(RandomAccessIterator first, RandomAccessIterator nth, - RandomAccessIterator last, Compare comp); - -template -ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, - const T &value); - -template -ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, - const T &value, Compare comp); - -template -ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, - const T &value); - -template -ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, - const T &value, Compare comp); - -template -pair -equal_range(ForwardIterator first, ForwardIterator last, const T &value); - -template -pair -equal_range(ForwardIterator first, ForwardIterator last, const T &value, - Compare comp); - -template -bool binary_search(ForwardIterator first, ForwardIterator last, const T &value); - -template -bool binary_search(ForwardIterator first, ForwardIterator last, const T &value, - Compare comp); - -template -OutputIterator merge(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result); - -template -OutputIterator merge(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp); - -template -void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, - BidirectionalIterator last); - -template -void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, - BidirectionalIterator last, Compare comp); - -template -bool includes(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2); - -template -bool includes(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, Compare comp); - -template -OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result); - -template -OutputIterator set_union(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp); - -template -OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result); - -template -OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp); - -template -OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result); - -template -OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp); - -template -OutputIterator -set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result); - -template -OutputIterator -set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - OutputIterator result, Compare comp); - -template -void push_heap(RandomAccessIterator first, RandomAccessIterator last); - -template -void push_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp); - -template -void pop_heap(RandomAccessIterator first, RandomAccessIterator last); - -template -void pop_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp); - -template -void make_heap(RandomAccessIterator first, RandomAccessIterator last); - -template -void make_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp); - -template -void sort_heap(RandomAccessIterator first, RandomAccessIterator last); - -template -void sort_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp); - -template -bool is_heap(RandomAccessIterator first, RandomAccessIterator last); - -template -bool is_heap(RandomAccessIterator first, RandomAccessIterator last, - Compare comp); - -template -RandomAccessIterator is_heap_until(RandomAccessIterator first, - RandomAccessIterator last); - -template -RandomAccessIterator is_heap_until(RandomAccessIterator first, - RandomAccessIterator last, Compare comp); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 ForwardIterator min_element(ForwardIterator first, - ForwardIterator last); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 ForwardIterator min_element(ForwardIterator first, - ForwardIterator last, - Compare comp); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 const T &min(const T &a, const T &b); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 const T &min(const T &a, const T &b, - Compare comp); - -template _LIBCPP_CONSTEXPR_AFTER_CXX11 T min(initializer_list t); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 T min(initializer_list t, Compare comp); - -#if _LIBCPP_STD_VER > 14 -template -const T constexpr &clamp(const T &v, const T &lo, const T &hi); - -template -const T constexpr &clamp(const T &v, const T &lo, const T &hi, Compare comp); -#endif - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 ForwardIterator max_element(ForwardIterator first, - ForwardIterator last); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 ForwardIterator max_element(ForwardIterator first, - ForwardIterator last, - Compare comp); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 const T &max(const T &a, const T &b); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 const T &max(const T &a, const T &b, - Compare comp); - -template _LIBCPP_CONSTEXPR_AFTER_CXX11 T max(initializer_list t); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 T max(initializer_list t, Compare comp); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 pair -minmax_element(ForwardIterator first, ForwardIterator last); - -template -pair _LIBCPP_CONSTEXPR_AFTER_CXX11 -minmax_element(ForwardIterator first, ForwardIterator last, Compare comp); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 pair minmax(const T &a, - const T &b); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 pair -minmax(const T &a, const T &b, Compare comp); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 pair minmax(initializer_list t); - -template -_LIBCPP_CONSTEXPR_AFTER_CXX11 pair minmax(initializer_list t, - Compare comp); - -template -bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2); - -template -bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, - InputIterator2 first2, InputIterator2 last2, - Compare comp); - -template -bool next_permutation(BidirectionalIterator first, BidirectionalIterator last); - -template -bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, - Compare comp); - -template -bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last); - -template -bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, - Compare comp); - -} // namespace std diff --git a/clang/lib/Headers/sycl_wrappers/random b/clang/lib/Headers/sycl_wrappers/random deleted file mode 100644 index 797a36693e180..0000000000000 --- a/clang/lib/Headers/sycl_wrappers/random +++ /dev/null @@ -1,1458 +0,0 @@ -// -*- C++ -*- -//===--------------------------- random -----------------------------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#include -#include -#include -#include - -namespace std { - -// Engines - -template -class linear_congruential_engine { -public: - // types - typedef UIntType result_type; - - // engine characteristics - static constexpr result_type multiplier = a; - static constexpr result_type increment = c; - static constexpr result_type modulus = m; - static constexpr result_type min() { return c == 0u ? 1u : 0u; } - static constexpr result_type max() { return m - 1u; } - static constexpr result_type default_seed = 1u; - - // constructors and seeding functions - explicit linear_congruential_engine(result_type s = default_seed); - template explicit linear_congruential_engine(Sseq &q); - void seed(result_type s = default_seed); - template void seed(Sseq &q); - - // generating functions - result_type operator()(); - void discard(unsigned long long z); -}; - -template -bool operator==(const linear_congruential_engine &x, - const linear_congruential_engine &y); - -template -bool operator!=(const linear_congruential_engine &x, - const linear_congruential_engine &y); - -template -basic_ostream & -operator<<(basic_ostream &os, - const linear_congruential_engine &x); - -template -basic_istream & -operator>>(basic_istream &is, - linear_congruential_engine &x); - -template -class mersenne_twister_engine { -public: - // types - typedef UIntType result_type; - - // engine characteristics - static constexpr size_t word_size = w; - static constexpr size_t state_size = n; - static constexpr size_t shift_size = m; - static constexpr size_t mask_bits = r; - static constexpr result_type xor_mask = a; - static constexpr size_t tempering_u = u; - static constexpr result_type tempering_d = d; - static constexpr size_t tempering_s = s; - static constexpr result_type tempering_b = b; - static constexpr size_t tempering_t = t; - static constexpr result_type tempering_c = c; - static constexpr size_t tempering_l = l; - static constexpr result_type initialization_multiplier = f; - static constexpr result_type min() { return 0; } - static constexpr result_type max() { return 2 ^ w - 1; } - static constexpr result_type default_seed = 5489u; - - // constructors and seeding functions - explicit mersenne_twister_engine(result_type value = default_seed); - template explicit mersenne_twister_engine(Sseq &q); - void seed(result_type value = default_seed); - template void seed(Sseq &q); - - // generating functions - result_type operator()(); - void discard(unsigned long long z); -}; - -template -bool operator==(const mersenne_twister_engine &x, - const mersenne_twister_engine &y); - -template -bool operator!=(const mersenne_twister_engine &x, - const mersenne_twister_engine &y); - -template -basic_ostream & -operator<<(basic_ostream &os, - const mersenne_twister_engine &x); - -template -basic_istream & -operator>>(basic_istream &is, - mersenne_twister_engine &x); - -template -class subtract_with_carry_engine { -public: - // types - typedef UIntType result_type; - - // engine characteristics - static constexpr size_t word_size = w; - static constexpr size_t short_lag = s; - static constexpr size_t long_lag = r; - static constexpr result_type min(); - static constexpr result_type max(); - static constexpr result_type default_seed = 19780503u; - - // constructors and seeding functions - explicit subtract_with_carry_engine(result_type value = default_seed); - template explicit subtract_with_carry_engine(Sseq &q); - void seed(result_type value = default_seed); - template void seed(Sseq &q); - - // generating functions - result_type operator()(); - void discard(unsigned long long z); -}; - -template -bool operator==(const subtract_with_carry_engine &x, - const subtract_with_carry_engine &y); - -template -bool operator!=(const subtract_with_carry_engine &x, - const subtract_with_carry_engine &y); - -template -basic_ostream & -operator<<(basic_ostream &os, - const subtract_with_carry_engine &x); - -template -basic_istream & -operator>>(basic_istream &is, - subtract_with_carry_engine &x); - -template class discard_block_engine { -public: - // types - typedef typename Engine::result_type result_type; - - // engine characteristics - static constexpr size_t block_size = p; - static constexpr size_t used_block = r; - static constexpr result_type min() { return Engine::min(); } - static constexpr result_type max() { return Engine::max(); } - - // constructors and seeding functions - discard_block_engine(); - explicit discard_block_engine(const Engine &e); - explicit discard_block_engine(Engine &&e); - explicit discard_block_engine(result_type s); - template explicit discard_block_engine(Sseq &q); - void seed(); - void seed(result_type s); - template void seed(Sseq &q); - - // generating functions - result_type operator()(); - void discard(unsigned long long z); - - // property functions - const Engine &base() const noexcept; -}; - -template -bool operator==(const discard_block_engine &x, - const discard_block_engine &y); - -template -bool operator!=(const discard_block_engine &x, - const discard_block_engine &y); - -template -basic_ostream & -operator<<(basic_ostream &os, - const discard_block_engine &x); - -template -basic_istream &operator>>(basic_istream &is, - discard_block_engine &x); - -template -class independent_bits_engine { -public: - // types - typedef UIntType result_type; - - // engine characteristics - static constexpr result_type min() { return 0; } - static constexpr result_type max() { return 2 ^ w - 1; } - - // constructors and seeding functions - independent_bits_engine(); - explicit independent_bits_engine(const Engine &e); - explicit independent_bits_engine(Engine &&e); - explicit independent_bits_engine(result_type s); - template explicit independent_bits_engine(Sseq &q); - void seed(); - void seed(result_type s); - template void seed(Sseq &q); - - // generating functions - result_type operator()(); - void discard(unsigned long long z); - - // property functions - const Engine &base() const noexcept; -}; - -template -bool operator==(const independent_bits_engine &x, - const independent_bits_engine &y); - -template -bool operator!=(const independent_bits_engine &x, - const independent_bits_engine &y); - -template -basic_ostream & -operator<<(basic_ostream &os, - const independent_bits_engine &x); - -template -basic_istream & -operator>>(basic_istream &is, - independent_bits_engine &x); - -template class shuffle_order_engine { -public: - // types - typedef typename Engine::result_type result_type; - - // engine characteristics - static constexpr size_t table_size = k; - static constexpr result_type min() { return Engine::min; } - static constexpr result_type max() { return Engine::max; } - - // constructors and seeding functions - shuffle_order_engine(); - explicit shuffle_order_engine(const Engine &e); - explicit shuffle_order_engine(Engine &&e); - explicit shuffle_order_engine(result_type s); - template explicit shuffle_order_engine(Sseq &q); - void seed(); - void seed(result_type s); - template void seed(Sseq &q); - - // generating functions - result_type operator()(); - void discard(unsigned long long z); - - // property functions - const Engine &base() const noexcept; -}; - -template -bool operator==(const shuffle_order_engine &x, - const shuffle_order_engine &y); - -template -bool operator!=(const shuffle_order_engine &x, - const shuffle_order_engine &y); - -template -basic_ostream & -operator<<(basic_ostream &os, - const shuffle_order_engine &x); - -template -basic_istream &operator>>(basic_istream &is, - shuffle_order_engine &x); - -typedef linear_congruential_engine - minstd_rand0; -typedef linear_congruential_engine - minstd_rand; -typedef mersenne_twister_engine - mt19937; -typedef mersenne_twister_engine< - uint_fast64_t, 64, 312, 156, 31, 0xb5026f5aa96619e9, 29, 0x5555555555555555, - 17, 0x71d67fffeda60000, 37, 0xfff7eee000000000, 43, 6364136223846793005> - mt19937_64; -typedef subtract_with_carry_engine ranlux24_base; -typedef subtract_with_carry_engine ranlux48_base; -typedef discard_block_engine ranlux24; -typedef discard_block_engine ranlux48; -typedef shuffle_order_engine knuth_b; -typedef minstd_rand default_random_engine; - -// Generators - -class random_device { -public: - // types - typedef unsigned int result_type; - - // generator characteristics - static constexpr result_type min() { - return numeric_limits::min(); - } - static constexpr result_type max() { - return numeric_limits::max(); - } - - // constructors - explicit random_device(const string &token = "/dev/urandom"); - - // generating functions - result_type operator()(); - - // property functions - double entropy() const noexcept; - - // no copy functions - random_device(const random_device &) = delete; - void operator=(const random_device &) = delete; -}; - -// Utilities - -class seed_seq { -public: - // types - typedef uint_least32_t result_type; - - // constructors - seed_seq(); - template seed_seq(initializer_list il); - template - seed_seq(InputIterator begin, InputIterator end); - - // generating functions - template - void generate(RandomAccessIterator begin, RandomAccessIterator end); - - // property functions - size_t size() const; - template void param(OutputIterator dest) const; - - // no copy functions - seed_seq(const seed_seq &) = delete; - void operator=(const seed_seq &) = delete; -}; - -template -RealType generate_canonical(URNG &g); - -// Distributions - -template class uniform_int_distribution { -public: - // types - typedef IntType result_type; - - class param_type { - public: - typedef uniform_int_distribution distribution_type; - - explicit param_type(IntType a = 0, - IntType b = numeric_limits::max()); - - result_type a() const; - result_type b() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit uniform_int_distribution(IntType a = 0, - IntType b = numeric_limits::max()); - explicit uniform_int_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type a() const; - result_type b() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const uniform_int_distribution &x, - const uniform_int_distribution &y); - friend bool operator!=(const uniform_int_distribution &x, - const uniform_int_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const uniform_int_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, uniform_int_distribution &x); -}; - -template class uniform_real_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef uniform_real_distribution distribution_type; - - explicit param_type(RealType a = 0, RealType b = 1); - - result_type a() const; - result_type b() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit uniform_real_distribution(RealType a = 0.0, RealType b = 1.0); - explicit uniform_real_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type a() const; - result_type b() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const uniform_real_distribution &x, - const uniform_real_distribution &y); - friend bool operator!=(const uniform_real_distribution &x, - const uniform_real_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const uniform_real_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, uniform_real_distribution &x); -}; - -class bernoulli_distribution { -public: - // types - typedef bool result_type; - - class param_type { - public: - typedef bernoulli_distribution distribution_type; - - explicit param_type(double p = 0.5); - - double p() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit bernoulli_distribution(double p = 0.5); - explicit bernoulli_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - double p() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const bernoulli_distribution &x, - const bernoulli_distribution &y); - friend bool operator!=(const bernoulli_distribution &x, - const bernoulli_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const bernoulli_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, bernoulli_distribution &x); -}; - -template class binomial_distribution { -public: - // types - typedef IntType result_type; - - class param_type { - public: - typedef binomial_distribution distribution_type; - - explicit param_type(IntType t = 1, double p = 0.5); - - IntType t() const; - double p() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit binomial_distribution(IntType t = 1, double p = 0.5); - explicit binomial_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - IntType t() const; - double p() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const binomial_distribution &x, - const binomial_distribution &y); - friend bool operator!=(const binomial_distribution &x, - const binomial_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const binomial_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, binomial_distribution &x); -}; - -template class geometric_distribution { -public: - // types - typedef IntType result_type; - - class param_type { - public: - typedef geometric_distribution distribution_type; - - explicit param_type(double p = 0.5); - - double p() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit geometric_distribution(double p = 0.5); - explicit geometric_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - double p() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const geometric_distribution &x, - const geometric_distribution &y); - friend bool operator!=(const geometric_distribution &x, - const geometric_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const geometric_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, geometric_distribution &x); -}; - -template class negative_binomial_distribution { -public: - // types - typedef IntType result_type; - - class param_type { - public: - typedef negative_binomial_distribution distribution_type; - - explicit param_type(result_type k = 1, double p = 0.5); - - result_type k() const; - double p() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit negative_binomial_distribution(result_type k = 1, double p = 0.5); - explicit negative_binomial_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type k() const; - double p() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const negative_binomial_distribution &x, - const negative_binomial_distribution &y); - friend bool operator!=(const negative_binomial_distribution &x, - const negative_binomial_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const negative_binomial_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, - negative_binomial_distribution &x); -}; - -template class poisson_distribution { -public: - // types - typedef IntType result_type; - - class param_type { - public: - typedef poisson_distribution distribution_type; - - explicit param_type(double mean = 1.0); - - double mean() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit poisson_distribution(double mean = 1.0); - explicit poisson_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - double mean() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const poisson_distribution &x, - const poisson_distribution &y); - friend bool operator!=(const poisson_distribution &x, - const poisson_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const poisson_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, poisson_distribution &x); -}; - -template class exponential_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef exponential_distribution distribution_type; - - explicit param_type(result_type lambda = 1.0); - - result_type lambda() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit exponential_distribution(result_type lambda = 1.0); - explicit exponential_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type lambda() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const exponential_distribution &x, - const exponential_distribution &y); - friend bool operator!=(const exponential_distribution &x, - const exponential_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const exponential_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, exponential_distribution &x); -}; - -template class gamma_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef gamma_distribution distribution_type; - - explicit param_type(result_type alpha = 1, result_type beta = 1); - - result_type alpha() const; - result_type beta() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit gamma_distribution(result_type alpha = 1, result_type beta = 1); - explicit gamma_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type alpha() const; - result_type beta() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const gamma_distribution &x, - const gamma_distribution &y); - friend bool operator!=(const gamma_distribution &x, - const gamma_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const gamma_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, gamma_distribution &x); -}; - -template class weibull_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef weibull_distribution distribution_type; - - explicit param_type(result_type alpha = 1, result_type beta = 1); - - result_type a() const; - result_type b() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit weibull_distribution(result_type a = 1, result_type b = 1); - explicit weibull_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type a() const; - result_type b() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const weibull_distribution &x, - const weibull_distribution &y); - friend bool operator!=(const weibull_distribution &x, - const weibull_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const weibull_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, weibull_distribution &x); -}; - -template class extreme_value_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef extreme_value_distribution distribution_type; - - explicit param_type(result_type a = 0, result_type b = 1); - - result_type a() const; - result_type b() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit extreme_value_distribution(result_type a = 0, result_type b = 1); - explicit extreme_value_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type a() const; - result_type b() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const extreme_value_distribution &x, - const extreme_value_distribution &y); - friend bool operator!=(const extreme_value_distribution &x, - const extreme_value_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const extreme_value_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, extreme_value_distribution &x); -}; - -template class normal_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef normal_distribution distribution_type; - - explicit param_type(result_type mean = 0, result_type stddev = 1); - - result_type mean() const; - result_type stddev() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructors and reset functions - explicit normal_distribution(result_type mean = 0, result_type stddev = 1); - explicit normal_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type mean() const; - result_type stddev() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const normal_distribution &x, - const normal_distribution &y); - friend bool operator!=(const normal_distribution &x, - const normal_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const normal_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, normal_distribution &x); -}; - -template class lognormal_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef lognormal_distribution distribution_type; - - explicit param_type(result_type m = 0, result_type s = 1); - - result_type m() const; - result_type s() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit lognormal_distribution(result_type m = 0, result_type s = 1); - explicit lognormal_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type m() const; - result_type s() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const lognormal_distribution &x, - const lognormal_distribution &y); - friend bool operator!=(const lognormal_distribution &x, - const lognormal_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const lognormal_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, lognormal_distribution &x); -}; - -template class chi_squared_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef chi_squared_distribution distribution_type; - - explicit param_type(result_type n = 1); - - result_type n() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit chi_squared_distribution(result_type n = 1); - explicit chi_squared_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type n() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const chi_squared_distribution &x, - const chi_squared_distribution &y); - friend bool operator!=(const chi_squared_distribution &x, - const chi_squared_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const chi_squared_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, chi_squared_distribution &x); -}; - -template class cauchy_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef cauchy_distribution distribution_type; - - explicit param_type(result_type a = 0, result_type b = 1); - - result_type a() const; - result_type b() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit cauchy_distribution(result_type a = 0, result_type b = 1); - explicit cauchy_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type a() const; - result_type b() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const cauchy_distribution &x, - const cauchy_distribution &y); - friend bool operator!=(const cauchy_distribution &x, - const cauchy_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const cauchy_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, cauchy_distribution &x); -}; - -template class fisher_f_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef fisher_f_distribution distribution_type; - - explicit param_type(result_type m = 1, result_type n = 1); - - result_type m() const; - result_type n() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit fisher_f_distribution(result_type m = 1, result_type n = 1); - explicit fisher_f_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type m() const; - result_type n() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const fisher_f_distribution &x, - const fisher_f_distribution &y); - friend bool operator!=(const fisher_f_distribution &x, - const fisher_f_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const fisher_f_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, fisher_f_distribution &x); -}; - -template class student_t_distribution { -public: - // types - typedef RealType result_type; - - class param_type { - public: - typedef student_t_distribution distribution_type; - - explicit param_type(result_type n = 1); - - result_type n() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - explicit student_t_distribution(result_type n = 1); - explicit student_t_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - result_type n() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const student_t_distribution &x, - const student_t_distribution &y); - friend bool operator!=(const student_t_distribution &x, - const student_t_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const student_t_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, student_t_distribution &x); -}; - -template class discrete_distribution { -public: - // types - typedef IntType result_type; - - class param_type { - public: - typedef discrete_distribution distribution_type; - - param_type(); - template - param_type(InputIterator firstW, InputIterator lastW); - param_type(initializer_list wl); - template - param_type(size_t nw, double xmin, double xmax, UnaryOperation fw); - - vector probabilities() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - discrete_distribution(); - template - discrete_distribution(InputIterator firstW, InputIterator lastW); - discrete_distribution(initializer_list wl); - template - discrete_distribution(size_t nw, double xmin, double xmax, UnaryOperation fw); - explicit discrete_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - vector probabilities() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const discrete_distribution &x, - const discrete_distribution &y); - friend bool operator!=(const discrete_distribution &x, - const discrete_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, const discrete_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, discrete_distribution &x); -}; - -template class piecewise_constant_distribution { - // types - typedef RealType result_type; - - class param_type { - public: - typedef piecewise_constant_distribution distribution_type; - - param_type(); - template - param_type(InputIteratorB firstB, InputIteratorB lastB, - InputIteratorW firstW); - template - param_type(initializer_list bl, UnaryOperation fw); - template - param_type(size_t nw, result_type xmin, result_type xmax, - UnaryOperation fw); - - vector intervals() const; - vector densities() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - piecewise_constant_distribution(); - template - piecewise_constant_distribution(InputIteratorB firstB, InputIteratorB lastB, - InputIteratorW firstW); - template - piecewise_constant_distribution(initializer_list bl, - UnaryOperation fw); - template - piecewise_constant_distribution(size_t nw, result_type xmin, result_type xmax, - UnaryOperation fw); - explicit piecewise_constant_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - vector intervals() const; - vector densities() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const piecewise_constant_distribution &x, - const piecewise_constant_distribution &y); - friend bool operator!=(const piecewise_constant_distribution &x, - const piecewise_constant_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const piecewise_constant_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, - piecewise_constant_distribution &x); -}; - -template class piecewise_linear_distribution { - // types - typedef RealType result_type; - - class param_type { - public: - typedef piecewise_linear_distribution distribution_type; - - param_type(); - template - param_type(InputIteratorB firstB, InputIteratorB lastB, - InputIteratorW firstW); - template - param_type(initializer_list bl, UnaryOperation fw); - template - param_type(size_t nw, result_type xmin, result_type xmax, - UnaryOperation fw); - - vector intervals() const; - vector densities() const; - - friend bool operator==(const param_type &x, const param_type &y); - friend bool operator!=(const param_type &x, const param_type &y); - }; - - // constructor and reset functions - piecewise_linear_distribution(); - template - piecewise_linear_distribution(InputIteratorB firstB, InputIteratorB lastB, - InputIteratorW firstW); - - template - piecewise_linear_distribution(initializer_list bl, - UnaryOperation fw); - - template - piecewise_linear_distribution(size_t nw, result_type xmin, result_type xmax, - UnaryOperation fw); - - explicit piecewise_linear_distribution(const param_type &parm); - void reset(); - - // generating functions - template result_type operator()(URNG &g); - template result_type operator()(URNG &g, const param_type &parm); - - // property functions - vector intervals() const; - vector densities() const; - - param_type param() const; - void param(const param_type &parm); - - result_type min() const; - result_type max() const; - - friend bool operator==(const piecewise_linear_distribution &x, - const piecewise_linear_distribution &y); - friend bool operator!=(const piecewise_linear_distribution &x, - const piecewise_linear_distribution &y); - - template - friend basic_ostream & - operator<<(basic_ostream &os, - const piecewise_linear_distribution &x); - - template - friend basic_istream & - operator>>(basic_istream &is, - piecewise_linear_distribution &x); -}; - -} // namespace std