7#ifndef _TPF_SPLIT_RANGES_HPP
8#define _TPF_SPLIT_RANGES_HPP
15 #if _MSVC_LANG < 201703L
16 #error This libary requires C++17 Standard (Visual Studio 2017).
20 #if __cplusplus < 201703
21 #error This library requires C++17 Standard (GNU g++ version 8.0 or clang++ version 8.0 above)
50 template<
typename T> std::string
53 std::ostringstream os;
56 os.imbue(std::locale(
""));
57 os <<
"[" << rg.first <<
", " << rg.second <<
") - count: " << (rg.second - rg.first);
62 template<
typename T> rngvctr<T>
65 template<
typename T> rngvctr<T>
68 template<
typename T> std::string
69 display_ranges(
const rngvctr<T>& rngs,
int width=9,
bool thousands=
true);
88 if(min_span == (T)(-1))
91 if(min_span == 0) min_span = dist;
94 T rnd = dist % min_span;
95 T
count = dist / min_span;
101 for (T i{}; i <
count; ++i)
104 rng.emplace_back(prev, prev + min_span);
114 T span1 = min_span + 1;
117 for (T i{}; i < rnd; ++i)
120 rng.emplace_back(prev, prev + span1);
125 for (T i{}; i <
count; ++i)
128 rng.emplace_back(prev, prev + min_span);
148 T span = dist /
count;
149 T rnd = dist %
count;
156 for (T i{}; i <
count; ++i)
159 rng.emplace_back(prev, prev + span);
170 for (T i{}; i < rnd; ++i)
173 rng.emplace_back(prev, prev + span1);
179 for (T i{}; i <
count; ++i)
182 rng.emplace_back(prev, prev + span);
196 template<
typename T> std::string
201 std::ostringstream os;
204 os.imbue(std::locale(
""));
206 os <<
"Range count: " << rngs.size() <<
", "<<
207 "Max range: " << (rngs[0].second - rngs[0].first) <<
208 " elements, Min range: " << (rngs.back().second - rngs.back().first)
211 size_t count = (size_t)rngs.size();
213 for(
size_t i = 0; i<
count; ++i)
215 os<<std::setw(3)<<i<<
": [" << std::setw(width)
216 << rngs[(size_t)i].first <<
", " << std::setw(width)
217 << rngs[(size_t)i].second <<
") "<< std::setw(width)
218 <<(rngs[(size_t)i].second - rngs[(
size_t)i].first)
225 return std::string(
"Range empty.");
230 return (
size_t) std::thread::hardware_concurrency();
233 template<
typename RangeType,
typename BinOperation,
typename SumupOperation,
234 typename = std::enable_if_t<tpf::types::is_integer_v<RangeType>>>
236 BinOperation&& bin_opr, SumupOperation&& sumup,
239 using return_t =
decltype(bin_opr(start, end));
247 using future_t = std::future<return_t>;
248 using futures_t = std::vector<future_t>;
252 if constexpr (!std::is_void_v<return_t>)
255 return bin_opr(start, end);
258 size_t count = ranges.size();
260 for(
size_t i{1}; i <
count; ++i)
261 futures.emplace_back(std::async(std::launch::async,
262 bin_opr, ranges[i].first, ranges[i].second));
265 bin_opr(ranges.front().first, ranges.front().second);
267 for(
auto& f: futures)
268 sum = sumup(
sum, f.get());
279 size_t count = ranges.size();
281 for(
size_t i{1}; i <
count; ++i)
282 futures.emplace_back(std::async(std::launch::async,
283 bin_opr, ranges[i].first, ranges[i].second));
285 bin_opr(ranges.front().first, ranges.front().second);
287 for(
auto& f: futures)
294 template<
typename ContainerType,
typename BinOperation,
typename SumupOperation,
297 BinOperation&& bin_opr, SumupOperation&& sumup,
300 using return_t =
decltype(bin_opr(
size_t{},
size_t{}));
301 size_t end = container.size();
303 if constexpr(!std::is_void_v<return_t>)
306 std::forward<BinOperation>(bin_opr), std::forward<SumupOperation>(sumup),
312 std::forward<BinOperation>(bin_opr), std::forward<SumupOperation>(sumup),
return_t sum(int a, int b)
constexpr size_t InvalidIndex
auto parallel_reduce(RangeType start, RangeType end, BinOperation &&bin_opr, SumupOperation &&sumup, size_t use_thread_count=tpf::InvalidIndex)
rngvctr< T > split_range_span(T st, T ed, T min_span=(T)(-1))
rngvctr< size_t > range_vctr_t
rngvctr< T > split_range_half(T st, T ed)
std::string display_range(const range< T > &rg, bool thousands=true)
std::string display_ranges(const rngvctr< T > &rngs, int width=9, bool thousands=true)
size_t cpu_thread_count() noexcept
rngvctr< T > split_range_count(T st, T ed, T count=(T)(-1))
std::deque< range< T > > rngvctr
hidden::enable_if_container_type_t< Type, ReturnType > enable_if_container_type_t
Includes subnamespace conversion.
Type functions are implemented.