MeshLib C++ Docs
Loading...
Searching...
No Matches
MRFewSmallest.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMeshFwd.h"
4#include <algorithm>
5#include <cassert>
6#include <vector>
7
8namespace MR
9{
12
13
15template<typename T>
17{
18public:
20
22 explicit FewSmallest( size_t maxElms ) { reset( maxElms ); }
23
25 void reset( size_t maxElms );
26
28 size_t maxElms() const { return maxElms_; }
29
31 bool empty() const { return heap_.empty(); }
32
34 size_t size() const { return heap_.size(); }
35
37 bool full() const { return size() == maxElms(); }
38
40 const std::vector<T> & get() const { return heap_; }
41
43 const T & top() const { assert( !heap_.empty() ); return heap_.front(); }
44
46 const T & topOr( const T & emptyRes ) const { return !heap_.empty() ? heap_.front() : emptyRes; }
47
49 void push( T t );
50
52 void clear() { heap_.clear(); }
53
54private:
55 std::vector<T> heap_;
56 size_t maxElms_ = 0;
57};
58
59template<typename T>
60void FewSmallest<T>::reset( size_t maxElms )
61{
62 heap_.clear();
63 heap_.reserve( maxElms );
64 maxElms_ = maxElms;
65}
66
67template<typename T>
69{
70 assert( heap_.size() <= maxElms() );
71 if ( heap_.size() == maxElms() )
72 {
73 if ( t < heap_.front() )
74 {
75 std::pop_heap( heap_.begin(), heap_.end() );
76 assert( t < heap_.back() );
77 heap_.back() = std::move( t );
78 std::push_heap( heap_.begin(), heap_.end() );
79 }
80 return;
81 }
82 heap_.push_back( std::move( t ) );
83 std::push_heap( heap_.begin(), heap_.end() );
84}
85
86}
the class stores some number of smallest elements from a larger number of candidates
Definition MRFewSmallest.h:17
void push(T t)
considers one more element, storing it if it is within the smallest
Definition MRFewSmallest.h:68
FewSmallest(size_t maxElms)
configure the object to store at most given number of elements
Definition MRFewSmallest.h:22
const T & top() const
returns the largest among stored smallest elements
Definition MRFewSmallest.h:43
void reset(size_t maxElms)
clears the content and reconfigure the object to store at most given number of elements
Definition MRFewSmallest.h:60
const T & topOr(const T &emptyRes) const
returns the largest among stored smallest elements or given element if this is empty
Definition MRFewSmallest.h:46
bool empty() const
returns whether the container is currently empty
Definition MRFewSmallest.h:31
const std::vector< T > & get() const
returns the smallest elements found so far
Definition MRFewSmallest.h:40
size_t maxElms() const
returns the maximum number of elements to be stored here
Definition MRFewSmallest.h:28
size_t size() const
returns current number of stored element
Definition MRFewSmallest.h:34
bool full() const
returns whether we have already maximum number of elements stored
Definition MRFewSmallest.h:37
void clear()
removes all stored elements
Definition MRFewSmallest.h:52
FewSmallest()
Definition MRFewSmallest.h:19
only for bindings generation
Definition MRCameraOrientationPlugin.h:8