13template <
typename T>
class MANTID_KERNEL_DLL MinMaxFinder {
14 std::vector<T>
const *
vec;
26 void operator()(tbb::blocked_range<size_t>
const &range) {
27 const auto [minele, maxele] = std::minmax_element(
vec->cbegin() + range.begin(),
vec->cbegin() + range.end());
34 void join(MinMaxFinder<T>
const &other) {
43template <
typename T> std::pair<T, T>
parallel_minmax(std::vector<T>
const *
const vec,
size_t const grainsize) {
44 if (
vec->size() < grainsize) {
48 MinMaxFinder<T> finder(
vec);
49 tbb::parallel_reduce(tbb::blocked_range<size_t>(0,
vec->size(), grainsize), finder);
50 return std::make_pair(finder.minval, finder.maxval);
55std::pair<T, T>
parallel_minmax(std::shared_ptr<std::vector<T>>
const &
vec,
size_t const grainsize) {
56 return parallel_minmax<T>(
vec.get(), grainsize);
60std::pair<T, T>
parallel_minmax(std::unique_ptr<std::vector<T>>
const &
vec,
size_t const grainsize) {
61 return parallel_minmax<T>(
vec.get(), grainsize);
64#define EXPORTPARALLELMINMAX(type) \
65 template std::pair<type, type> MANTID_KERNEL_DLL parallel_minmax(std::shared_ptr<std::vector<type>> const &, \
67 template std::pair<type, type> MANTID_KERNEL_DLL parallel_minmax(std::unique_ptr<std::vector<type>> const &, size_t);
73#undef EXPORTPARALLELMINMAX
std::vector< T > const * vec
#define EXPORTPARALLELMINMAX(type)
DLLExport std::string join(ITERATOR_TYPE begin, ITERATOR_TYPE end, const std::string &separator, typename std::enable_if<!(std::is_same< typename std::iterator_traits< ITERATOR_TYPE >::iterator_category, std::random_access_iterator_tag >::value)>::type *=nullptr)
Join a set or vector of (something that turns into a string) together into one string,...
std::pair< T, T > parallel_minmax(std::vector< T > const *const vec, size_t const grainsize=1000)
parallel_minmax