From 85b3470e864e782cd9656dbaab8a50e5fead251c Mon Sep 17 00:00:00 2001 From: cxl Date: Thu, 22 Sep 2016 11:03:11 +0000 Subject: [PATCH] Core: SubRangeOf git-svn-id: svn://ultimatepp.org/upp/trunk@10232 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Core/CoAlgo.h | 18 +++++++++++++++++- uppsrc/Core/Range.h | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/uppsrc/Core/CoAlgo.h b/uppsrc/Core/CoAlgo.h index 730770db6..8f3e8d24e 100644 --- a/uppsrc/Core/CoAlgo.h +++ b/uppsrc/Core/CoAlgo.h @@ -13,7 +13,23 @@ void CoLoopI(Iter begin, Iter end, const Lambda& lambda, int max_chunk = INT_MAX } template -void CoLoop(Range r, const Lambda& lambda, int max_chunk = INT_MAX) +void CoLoop(Range& r, const Lambda& lambda, int max_chunk = INT_MAX) +{ + size_t chunk = max(r.GetCount() / CPU_Cores(), 1); + chunk = min(chunk, (size_t)max_chunk); + CoWork co; + auto begin = r.begin(); + auto end = r.end(); + while(begin < end) { + co & [=] { + lambda(SubRange(begin, begin + min(chunk, size_t(end - begin)))); + }; + begin += chunk; + } +} + +template +void CoLoop(const Range& r, const Lambda& lambda, int max_chunk = INT_MAX) { size_t chunk = max(r.GetCount() / CPU_Cores(), 1); chunk = min(chunk, (size_t)max_chunk); diff --git a/uppsrc/Core/Range.h b/uppsrc/Core/Range.h index 2fb0138fa..2dff84032 100644 --- a/uppsrc/Core/Range.h +++ b/uppsrc/Core/Range.h @@ -51,6 +51,8 @@ auto SubRange(const C& c, int pos, int count) -> decltype(SubRange(c.begin() + p return SubRange(c.begin() + pos, count); } +template using SubRangeOf = decltype(SubRange(((C *)0)->begin(), ((C *)0)->end())); + template struct ConstRangeClass { T value;