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{
9
13template<typename T>
14MinMaxArg<T, size_t> parallelMinMaxArg( const T* data, size_t size, const BitSet* region = nullptr, const T* topExcluding = nullptr )
15{
16 using I = size_t;
17 return tbb::parallel_reduce( tbb::blocked_range<I>( I(0), size ), MinMaxArg<T, I>{},
18 [&] ( const tbb::blocked_range<I> range, MinMaxArg<T, I> curr )
19 {
20 for ( I i = range.begin(); i < range.end(); i++ )
21 {
22 if ( region && !region->test( i ) )
23 continue;
24 T val = data[i];
25 if ( topExcluding )
26 {
27 T absVal = val;
28 if constexpr ( !std::is_unsigned_v<T> )
29 absVal = (T)std::abs( val );
30 if ( absVal >= *topExcluding )
31 continue;
32 }
33 curr.include( val, i );
34 }
35 return curr;
36 },
37 [&] ( MinMaxArg<T, I> a, const MinMaxArg<T, I>& b )
38 {
39 a.include( b );
40 return a;
41 } );
42}
43
47template<typename T, typename Itag>
48MinMaxArg<T, Id<Itag>> parallelMinMaxArg( const Vector<T, Id<Itag>>& vec, const TaggedBitSet<Itag>* region = nullptr, const T* topExcluding = nullptr )
49{
50 auto mma = parallelMinMaxArg( vec.data(), vec.size(), region, topExcluding );
51 return
52 {
53 .min = mma.min,
54 .max = mma.max,
55 .minArg = Id<Itag>( mma.minArg ),
56 .maxArg = Id<Itag>( mma.maxArg )
57 };
58}
59
63template<typename T>
64std::pair<T, T> parallelMinMax( const T* data, size_t size, const BitSet* region = nullptr, const T * topExcluding = nullptr )
65{
66 auto mma = parallelMinMaxArg( data, size, region, topExcluding );
67 return { mma.min, mma.max };
68}
69
73template<typename T>
74std::pair<T, T> parallelMinMax( const std::vector<T>& vec, const BitSet* region = nullptr, const T * topExcluding = nullptr )
75{
76 return parallelMinMax( vec.data(), vec.size(), region, topExcluding );
77}
78
82template<typename T, typename Itag>
83std::pair<T, T> parallelMinMax( const Vector<T, Id<Itag>>& vec, const TaggedBitSet<Itag>* region = nullptr, const T* topExcluding = nullptr )
84{
85 return parallelMinMax( vec.data(), vec.size(), region, topExcluding );
86}
87
88} //namespace MR
container of bits
Definition MRMesh/MRBitSet.h:27
Definition MRMesh/MRId.h:13
container of bits representing specific indices (faces, verts or edges)
Definition MRMesh/MRBitSet.h:127
std::vector<T>-like container that requires specific indexing type,
Definition MRMesh/MRVector.h:20
ImVec2 size(const ViewportRectangle &rect)
Definition MRViewport.h:29
std::pair< T, T > parallelMinMax(const T *data, size_t size, const BitSet *region=nullptr, const T *topExcluding=nullptr)
Definition MRParallelMinMax.h:64
MinMaxArg< T, size_t > parallelMinMaxArg(const T *data, size_t size, const BitSet *region=nullptr, const T *topExcluding=nullptr)
Definition MRParallelMinMax.h:14
I
Definition MRMesh/MRMeshFwd.h:121
Definition MRMinMaxArg.h:13
void include(const std::pair< T, I > &p)
changes min(Arg) and max(Arg) if necessary to include given point
Definition MRMinMaxArg.h:22