27#include "vtkCommonCoreModule.h"
37#ifndef DOXYGEN_SHOULD_SKIP_THIS
44VTK_ABI_NAMESPACE_BEGIN
46class vtkSMPTools_Has_Initialize
48 typedef char (&no_type)[1];
49 typedef char (&yes_type)[2];
50 template <
typename U,
void (U::*)()>
55 static yes_type check(V<U, &U::Initialize>*);
57 static no_type check(...);
60 static bool const value =
sizeof(check<T>(
nullptr)) ==
sizeof(yes_type);
64class vtkSMPTools_Has_Initialize_const
66 typedef char (&no_type)[1];
67 typedef char (&yes_type)[2];
68 template <
typename U,
void (U::*)() const>
73 static yes_type check(V<U, &U::Initialize>*);
75 static no_type check(...);
78 static bool const value =
sizeof(check<T>(0)) ==
sizeof(yes_type);
81template <
typename Functor,
bool Init>
82struct vtkSMPTools_FunctorInternal;
84template <
typename Functor>
85struct vtkSMPTools_FunctorInternal<Functor, false>
88 vtkSMPTools_FunctorInternal(Functor& f)
95 auto& SMPToolsAPI = vtkSMPToolsAPI::GetInstance();
96 SMPToolsAPI.For(first, last, grain, *
this);
98 vtkSMPTools_FunctorInternal<Functor, false>& operator=(
99 const vtkSMPTools_FunctorInternal<Functor, false>&);
100 vtkSMPTools_FunctorInternal(
const vtkSMPTools_FunctorInternal<Functor, false>&);
103template <
typename Functor>
104struct vtkSMPTools_FunctorInternal<Functor, true>
107 vtkSMPThreadLocal<unsigned char> Initialized;
108 vtkSMPTools_FunctorInternal(Functor& f)
115 unsigned char& inited = this->Initialized.
Local();
118 this->F.Initialize();
121 this->F(first, last);
125 auto& SMPToolsAPI = vtkSMPToolsAPI::GetInstance();
126 SMPToolsAPI.For(first, last, grain, *
this);
129 vtkSMPTools_FunctorInternal<Functor, true>& operator=(
130 const vtkSMPTools_FunctorInternal<Functor, true>&);
131 vtkSMPTools_FunctorInternal(
const vtkSMPTools_FunctorInternal<Functor, true>&);
134template <
typename Functor>
135class vtkSMPTools_Lookup_For
137 static bool const init = vtkSMPTools_Has_Initialize<Functor>::value;
140 typedef vtkSMPTools_FunctorInternal<Functor, init>
type;
143template <
typename Functor>
144class vtkSMPTools_Lookup_For<Functor const>
146 static bool const init = vtkSMPTools_Has_Initialize_const<Functor>::value;
149 typedef vtkSMPTools_FunctorInternal<Functor const, init>
type;
152template <
typename Iterator,
typename Functor,
bool Init>
153struct vtkSMPTools_RangeFunctor;
155template <
typename Iterator,
typename Functor>
156struct vtkSMPTools_RangeFunctor<Iterator, Functor, false>
160 vtkSMPTools_RangeFunctor(Iterator& begin, Functor& f)
167 Iterator itFirst(Begin);
168 std::advance(itFirst, first);
169 Iterator itLast(itFirst);
170 std::advance(itLast, last - first);
171 this->F(itFirst, itLast);
175template <
typename Iterator,
typename Functor>
176struct vtkSMPTools_RangeFunctor<Iterator, Functor, true>
180 vtkSMPTools_RangeFunctor(Iterator& begin, Functor& f)
185 void Initialize() { this->F.Initialize(); }
188 Iterator itFirst(Begin);
189 std::advance(itFirst, first);
190 Iterator itLast(itFirst);
191 std::advance(itLast, last - first);
192 this->F(itFirst, itLast);
194 void Reduce() { this->F.Reduce(); }
197template <
typename Iterator,
typename Functor>
198class vtkSMPTools_Lookup_RangeFor
200 static bool const init = vtkSMPTools_Has_Initialize<Functor>::value;
203 typedef vtkSMPTools_RangeFunctor<Iterator, Functor, init>
type;
206template <
typename Iterator,
typename Functor>
207class vtkSMPTools_Lookup_RangeFor<Iterator, Functor const>
209 static bool const init = vtkSMPTools_Has_Initialize_const<Functor>::value;
212 typedef vtkSMPTools_RangeFunctor<Iterator, Functor const, init>
type;
216using resolvedNotInt =
typename std::enable_if<!std::is_integral<T>::value,
void>::type;
223VTK_ABI_NAMESPACE_BEGIN
237 template <
typename Functor>
240 typename vtk::detail::smp::vtkSMPTools_Lookup_For<Functor>::type fi(f);
241 fi.For(first, last, grain);
244 template <
typename Functor>
247 typename vtk::detail::smp::vtkSMPTools_Lookup_For<Functor const>::type fi(f);
248 fi.For(first, last, grain);
262 template <
typename Functor>
268 template <
typename Functor>
311 template <
typename Iter,
typename Functor>
312 static vtk::detail::smp::resolvedNotInt<Iter>
For(
313 Iter begin, Iter end,
vtkIdType grain, Functor& f)
315 vtkIdType size = std::distance(begin, end);
316 typename vtk::detail::smp::vtkSMPTools_Lookup_RangeFor<Iter, Functor>::type fi(begin, f);
320 template <
typename Iter,
typename Functor>
321 static vtk::detail::smp::resolvedNotInt<Iter>
For(
322 Iter begin, Iter end,
vtkIdType grain, Functor
const& f)
324 vtkIdType size = std::distance(begin, end);
325 typename vtk::detail::smp::vtkSMPTools_Lookup_RangeFor<Iter, Functor const>::type fi(begin, f);
364 template <
typename Iter,
typename Functor>
365 static vtk::detail::smp::resolvedNotInt<Iter>
For(Iter begin, Iter end, Functor& f)
370 template <
typename Iter,
typename Functor>
371 static vtk::detail::smp::resolvedNotInt<Iter>
For(Iter begin, Iter end, Functor
const& f)
484 Config(
int maxNumberOfThreads, std::string backend,
bool nestedParallelism)
490#ifndef DOXYGEN_SHOULD_SKIP_THIS
492 : MaxNumberOfThreads(API.GetInternalDesiredNumberOfThread())
535 template <
typename T>
557 template <
typename InputIt,
typename OutputIt,
typename Functor>
558 static void Transform(InputIt inBegin, InputIt inEnd, OutputIt outBegin, Functor transform)
561 SMPToolsAPI.Transform(inBegin, inEnd, outBegin, transform);
580 template <
typename InputIt1,
typename InputIt2,
typename OutputIt,
typename Functor>
582 InputIt1 inBegin1, InputIt1 inEnd, InputIt2 inBegin2, OutputIt outBegin, Functor transform)
585 SMPToolsAPI.Transform(inBegin1, inEnd, inBegin2, outBegin, transform);
602 template <
typename Iterator,
typename T>
603 static void Fill(Iterator begin, Iterator end,
const T& value)
606 SMPToolsAPI.Fill(begin, end, value);
614 template <
typename RandomAccessIterator>
615 static void Sort(RandomAccessIterator begin, RandomAccessIterator end)
618 SMPToolsAPI.Sort(begin, end);
627 template <
typename RandomAccessIterator,
typename Compare>
628 static void Sort(RandomAccessIterator begin, RandomAccessIterator end, Compare comp)
631 SMPToolsAPI.Sort(begin, end, comp);
646 template <
typename RandomAccessIterator,
typename ValueType>
647 static ValueType ExclusiveScan(
648 RandomAccessIterator begin, RandomAccessIterator end, ValueType init);
664template <
typename RandomAccessIterator,
typename ValueType>
666 RandomAccessIterator begin, RandomAccessIterator end, ValueType init)
669 typename std::iterator_traits<RandomAccessIterator>::difference_type num =
670 std::distance(begin, end);
674 ValueType retVal = *(end - 1);
679 ValueType val, sum = init;
680 for (
auto iter = begin; iter != end; ++iter)
700 std::vector<ValueType> batchOffsets(numBatches);
701 int batchSize =
static_cast<int>(std::ceil(
static_cast<double>(num) / numBatches));
707 auto beginBatch = begin + (batchId * batchSize);
708 auto endBatch = begin + (endBatchId * batchSize);
709 endBatch = (endBatch > end ? end : endBatch);
711 ValueType val, sum{};
712 for (
auto iter = beginBatch; iter < endBatch; ++iter)
718 batchOffsets[batchId] = sum;
724 ValueType val, count = init;
725 for (
int batchNum = 0; batchNum < numBatches; ++batchNum)
727 val = batchOffsets[batchNum];
728 batchOffsets[batchNum] = count;
736 auto beginBatch = begin + (batchId * batchSize);
737 auto endBatch = begin + (endBatchId * batchSize);
738 endBatch = (endBatch > end ? end : endBatch);
740 ValueType offset = batchOffsets[batchId];
741 for (
auto iter = beginBatch; iter < endBatch; ++iter)
748 return (retVal += *(end - 1));
T & Local()
This needs to be called mainly within a threaded execution path.
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.