MeshLib C++ Docs
Loading...
Searching...
No Matches
MRParallelMinMax.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRParallelFor.h"
4#include "MRMinMaxArg.h"
5#include "MRBitSet.h"
6
7namespace MR
8{
11
12
16template<typename T>
17MinMaxArg<T, size_t> parallelMinMaxArg( const T* data, size_t size, const BitSet* region = nullptr, const T* topExcluding = nullptr )
18{
19 using I = size_t;
20 return tbb::parallel_reduce( tbb::blocked_range<I>( I(0), size ), MinMaxArg<T, I>{},
21 [&] ( const tbb::blocked_range<I> range, MinMaxArg<T, I> curr )
22 {
23 for ( I i = range.begin(); i < range.end(); i++ )
24 {
25 if ( region && !region->test( i ) )
26 continue;
27 T val = data[i];
28 if ( topExcluding )
29 {
30 T absVal = val;
31 if constexpr ( !std::is_unsigned_v<T> )
32 absVal = (T)std::abs( val );
33 if ( absVal >= *topExcluding )
34 continue;
35 }
36 curr.include( val, i );
37 }
38 return curr;
39 },
40 [&] ( MinMaxArg<T, I> a, const MinMaxArg<T, I>& b )
41 {
42 a.include( b );
43 return a;
44 } );
45}
46
50template<typename T, typename Itag>
51MinMaxArg<T, Id<Itag>> parallelMinMaxArg( const Vector<T, Id<Itag>>& vec, const TaggedBitSet<Itag>* region = nullptr, const T* topExcluding = nullptr )
52{
53 auto mma = parallelMinMaxArg( vec.data(), vec.size(), region, topExcluding );
54 return
55 {
56 .min = mma.min,
57 .max = mma.max,
58 .minArg = Id<Itag>( mma.minArg ),
59 .maxArg = Id<Itag>( mma.maxArg )
60 };
61}
62
66template<typename T>
67std::pair<T, T> parallelMinMax( const T* data, size_t size, const BitSet* region = nullptr, const T * topExcluding = nullptr )
68{
69 auto mma = parallelMinMaxArg( data, size, region, topExcluding );
70 return { mma.min, mma.max };
71}
72
76template<typename T>
77std::pair<T, T> parallelMinMax( const std::vector<T>& vec, const BitSet* region = nullptr, const T * topExcluding = nullptr )
78{
79 return parallelMinMax( vec.data(), vec.size(), region, topExcluding );
80}
81
85template<typename T, typename Itag>
86std::pair<T, T> parallelMinMax( const Vector<T, Id<Itag>>& vec, const TaggedBitSet<Itag>* region = nullptr, const T* topExcluding = nullptr )
87{
88 return parallelMinMax( vec.data(), vec.size(), region, topExcluding );
89}
90
91}
Definition MRBitSet.h:24
stores index of some element, it is made as template class to avoid mixing faces, edges and vertices
Definition MRId.h:19
std::vector<T>-like container that requires specific indexing type,
Definition MRVector.h:23
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:32
std::pair< T, T > parallelMinMax(const T *data, size_t size, const BitSet *region=nullptr, const T *topExcluding=nullptr)
Definition MRParallelMinMax.h:67
MinMaxArg< T, size_t > parallelMinMaxArg(const T *data, size_t size, const BitSet *region=nullptr, const T *topExcluding=nullptr)
Definition MRParallelMinMax.h:17
void include(const std::pair< T, I > &p)
changes min(Arg) and max(Arg) if necessary to include given point
Definition MRMinMaxArg.h:91
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRMinMaxArg.h:82