50BidirectionalIterator
binary_merge(BidirectionalIterator first, BidirectionalIterator last, T init, BinaryOperation op,
53 assert(std::distance(first, last) > 1 &&
"Coalescence should operate on a range containing more than one element.");
54 std::shuffle(first, last, g);
55 if constexpr (std::is_invocable<T>::value)
57 *first = op(init(), *first);
61 *first = op(init, *first);
63 *first = op(*first, *(--last));
86BidirectionalIterator
binary_merge(BidirectionalIterator first, BidirectionalIterator last, Generator &g)
88 assert(std::distance(first, last) > 1 &&
"Coalescence should operate on a range containing more than one element.");
89 using T =
typename BidirectionalIterator::value_type;
90 return binary_merge(first, last, T(), std::plus<T>(), g);
115 OccupancySpectrum
const &sp, BinaryOperation op, Generator &g)
117 assert(std::distance(first, last) > 1 &&
"Coalescence should operate on a range containing more than one element.");
118 std::shuffle(first, last, g);
120 auto m_it = sp.cbegin();
121 std::advance(m_it, 2);
123 while (m_it != sp.cend())
125 for (
unsigned int i = 1; i <= *m_it; ++i)
128 if constexpr (std::is_invocable<T>::value)
130 *first = op(init(), *first);
134 *first = op(init, *first);
136 for (
int k = 1; k < j; ++k)
139 *first = op(*first, *(--last));
168 OccupancySpectrum
const &sp, Generator &g)
170 assert(std::distance(first, last) > 1 &&
"Coalescence should operate on a range containing more than one element.");
171 using T =
typename BidirectionalIterator::value_type;
BidirectionalIterator binary_merge(BidirectionalIterator first, BidirectionalIterator last, T init, BinaryOperation op, Generator &g)
merges 2 randomly selected elements in a range.
Definition merge.hpp:50
BidirectionalIterator simultaneous_multiple_merge(BidirectionalIterator first, BidirectionalIterator last, T init, OccupancySpectrum const &sp, BinaryOperation op, Generator &g)
merges randomly selected elements in a range according to an occupancy spectrum.
Definition merge.hpp:114