Header file base/numeric.hpp
#define JULES_BASE_NUMERIC_H
namespace jules
{
template <std::size_t N, typename T>
constexpr auto repeat(const T& value);
template <typename T>
auto repeat(index_t N, const T& value);
template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto length(Iter first, Sent last);
template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto length(const Rng& rng);
template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto max(Iter first, Sent last, T start = numeric_traits<T>::unbounded_min());
template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto max(const Rng& rng, T start = numeric_traits<T>::unbounded_min());
template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto min(Iter first, Sent last, T start = numeric_traits<T>::unbounded_max());
template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto min(const Rng& rng, T start = numeric_traits<T>::unbounded_max());
template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto prod(Iter first, Sent last, T start = numeric_traits<T>::multiplicative_identity());
template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto prod(const Rng& rng, T start = numeric_traits<T>::multiplicative_identity());
template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto sum(Iter first, Sent last, T start = numeric_traits<T>::additive_identity());
template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto sum(const Rng& rng, T start = numeric_traits<T>::additive_identity());
template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto count(Iter first, Sent last);
template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto count(const Rng& rng);
template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto all(Iter first, Sent last);
template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto all(const Rng& rng);
template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto none(Iter first, Sent last);
template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto none(const Rng& rng);
template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto any(Iter first, Sent last);
template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto any(const Rng& rng);
constexpr /*unspecified*/ prod_args();
template <typename T, typename ... Args>
constexpr auto prod_args(const T& arg, Args&&... args);
constexpr /*unspecified*/ sum_args();
template <typename T, typename ... Args>
constexpr auto sum_args(const T& arg, Args&&... args);
constexpr auto all_args();
template <typename ... Args>
constexpr auto all_args(bool arg, Args&&... args);
constexpr auto any_args();
template <typename ... Args>
constexpr auto any_args(bool arg, Args&&... args);
template <typename T>
constexpr auto square(const T& value);
template <typename T>
auto normal_pdf(const T& x, const T& mu, const T& sigma);
}
Function template jules::repeat [Arithmetic]
(1) template <std::size_t N, typename T>
constexpr auto repeat(const T& value);
(2) template <typename T>
auto repeat(index_t N, const T& value);
Repeats value N times.
Returns: std::array and std::vector containing the repeated value if N is a template argument or not, respectively.
Function template jules::length [Arithmetic]
(1) template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto length(Iter first, Sent last);
(2) template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto length(const Rng& rng);
Returns either the length of a Range or the distance of a pair of iterators.
Notes: The value may be negative if random-access iterators are used and first is reachable from last.
Function template jules::max [Arithmetic]
(1) template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto max(Iter first, Sent last, T start = numeric_traits<T>::unbounded_min());
(2) template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto max(const Rng& rng, T start = numeric_traits<T>::unbounded_min());
Returns either the maximum element in a Range or in the sequence [first, last).
Notes: jules::numeric_traits<T> must implement unbounded_min.
Notes: If empty, returns jules::numeric_traits<T>::unbounded_min.
Function template jules::min [Arithmetic]
(1) template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto min(Iter first, Sent last, T start = numeric_traits<T>::unbounded_max());
(2) template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto min(const Rng& rng, T start = numeric_traits<T>::unbounded_max());
Returns either the minimum element in a Range or in the sequence [first, last).
Notes: jules::numeric_traits<T> must implement unbounded_max.
Notes: If empty, returns jules::numeric_traits<T>::unbounded_max.
Function template jules::prod [Arithmetic]
(1) template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto prod(Iter first, Sent last, T start = numeric_traits<T>::multiplicative_identity());
(2) template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto prod(const Rng& rng, T start = numeric_traits<T>::multiplicative_identity());
Returns either the product of the elements in a Range or in the sequence [first, last).
Notes: jules::numeric_traits<T> must implement multiplicative_identity.
Notes: If empty, returns jules::numeric_traits<T>::multiplicative_identity.
Function template jules::sum [Arithmetic]
(1) template <typename Iter, typename Sent, typename T = range::iterator_value_t<Iter>, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto sum(Iter first, Sent last, T start = numeric_traits<T>::additive_identity());
(2) template <typename Rng, typename T = range::range_value_t<Rng>, typename = meta::requires<range::Range<Rng>>>
auto sum(const Rng& rng, T start = numeric_traits<T>::additive_identity());
Returns either the summation of the elements in a Range or in the sequence [first, last).
Notes: jules::numeric_traits<T> must implement additive_identity.
Notes: If empty, returns jules::numeric_traits<T>::additive_identity.
Function template jules::count [Logical]
(1) template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto count(Iter first, Sent last);
(2) template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto count(const Rng& rng);
Returns the number of true elements in a Range or in the sequence [first, last).
Function template jules::all [Logical]
(1) template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto all(Iter first, Sent last);
(2) template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto all(const Rng& rng);
Checks whether all elements in a Range or in the sequence [first, last) are true.
Notes: If empty, returns true.
Function template jules::none [Logical]
(1) template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto none(Iter first, Sent last);
(2) template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto none(const Rng& rng);
Checks whether all elements in a Range or in the sequence [first, last) are false.
Notes: If empty, returns true.
Function template jules::any [Logical]
(1) template <typename Iter, typename Sent, typename = meta::requires<range::Sentinel<Sent, Iter>>>
auto any(Iter first, Sent last);
(2) template <typename Rng, typename = meta::requires<range::Range<Rng>>>
auto any(const Rng& rng);
Checks whether any of the elements in a Range or in the sequence [first, last) are true.
Notes: If empty, returns false.