MeshLib C++ Docs
Loading...
Searching...
No Matches
MRVector.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMacros.h"
4#include "MRMeshFwd.h"
5#include "MRResizeNoInit.h"
6#include "MRPch/MRBindingMacros.h"
7#include <cassert>
8
9namespace MR
10{
13
14
21template <typename T, typename I>
22class Vector
23{
24public:
25 using value_type = typename std::vector<T>::value_type;
26 using reference = typename std::vector<T>::reference;
27 using const_reference = typename std::vector<T>::const_reference;
28 using iterator = typename std::vector<T>::iterator;
29 using const_iterator = typename std::vector<T>::const_iterator;
30
32 Vector() = default;
33
35 explicit Vector( size_t size ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::default_initializable<T> ) : vec_( size ) { }
36
38 explicit Vector( size_t size, const T & val ) : vec_( size, val ) { }
39
41 Vector( std::vector<T> && vec ) : vec_( std::move( vec ) ) { }
42
43 template< class InputIt >
44 Vector( InputIt first, InputIt last ) : vec_( first, last ) { }
45
46 Vector( std::initializer_list<T> init ) : vec_( init ) { }
47
48 [[nodiscard]] bool operator == ( const Vector & b ) const MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::equality_comparable<T> ) { return vec_ == b.vec_; }
49 [[nodiscard]] bool operator != ( const Vector & b ) const MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::equality_comparable<T> ) { return vec_ != b.vec_; }
50
51 void clear() { vec_.clear(); }
52
53 [[nodiscard]] bool empty() const { return vec_.empty(); }
54
55 [[nodiscard]] std::size_t size() const { return vec_.size(); }
56
57 void resize( size_t newSize ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::movable<T> && std::default_initializable<T> ) { vec_.resize( newSize ); }
58 void resize( size_t newSize, const T & t ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::movable<T> ) { vec_.resize( newSize, t ); }
59
61 void resizeNoInit( size_t targetSize ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::constructible_from<T, NoInit> ) { MR::resizeNoInit( vec_, targetSize ); }
62
63 [[nodiscard]] std::size_t capacity() const { return vec_.capacity(); }
64
65 void reserve( size_t capacity ) { vec_.reserve( capacity ); }
66
67 [[nodiscard]] const_reference operator[]( I i ) const MR_LIFETIMEBOUND
68 {
69 assert( i < vec_.size() );
70 return vec_[i];
71 }
73 {
74 assert( i < vec_.size() );
75 return vec_[i];
76 }
77
79 void resizeWithReserve( size_t newSize ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::default_initializable<T> )
80 {
82 resizeWithReserve( newSize, T{} );
83 }
84
86 void resizeWithReserve( size_t newSize, const T & value ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::movable<T> )
87 {
88 auto reserved = vec_.capacity();
89 if ( reserved > 0 && newSize > reserved )
90 {
91 while ( newSize > reserved )
92 reserved <<= 1;
93 vec_.reserve( reserved );
94 }
95 vec_.resize( newSize, value );
96 }
97
100 void autoResizeSet( I pos, size_t len, T val ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::movable<T> && std::is_copy_assignable_v<T> )
101 {
102 assert( pos );
103 const size_t p = pos;
104 if ( const auto sz = size(); p + len > sz )
105 {
107 resizeWithReserve( p + len, val );
108 if ( p >= sz )
109 return;
111 len = sz - p;
112 }
114 for ( size_t i = 0; i < len; ++i )
115 vec_[ p + i ] = val;
116 }
117
119 void autoResizeSet( I i, T val ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::is_copy_assignable_v<T> )
120 {
121 autoResizeSet( i, 1, val );
122 }
123
125 [[nodiscard]] reference autoResizeAt( I i ) MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::default_initializable<T> )
126 {
127 if ( i + 1 > size() )
128 resizeWithReserve( i + 1 );
129 return vec_[i];
130 }
131
132 void push_back( const T & t MR_LIFETIME_CAPTURE_BY_NESTED(this) ) { vec_.push_back( t ); }
133 void push_back( T && t MR_LIFETIME_CAPTURE_BY_NESTED(this) ) { vec_.push_back( std::move( t ) ); }
134 void pop_back() { vec_.pop_back(); }
135
136 template<typename... Args> MR_REQUIRES_IF_SUPPORTED( sizeof(T)>0 && std::constructible_from<T, Args &&...> )
137 T& emplace_back( Args&&... args ) { return vec_.emplace_back( std::forward<Args>(args)... ); }
138
139 [[nodiscard]] const_reference front() const MR_LIFETIMEBOUND { return vec_.front(); }
140 [[nodiscard]] reference front() MR_LIFETIMEBOUND { return vec_.front(); }
141 [[nodiscard]] const_reference back() const MR_LIFETIMEBOUND { return vec_.back(); }
142 [[nodiscard]] reference back() MR_LIFETIMEBOUND { return vec_.back(); }
143
145 [[nodiscard]] I beginId() const { return I( size_t(0) ); }
146
148 [[nodiscard]] I backId() const { assert( !vec_.empty() ); return I( vec_.size() - 1 ); }
149
151 [[nodiscard]] I endId() const { return I( vec_.size() ); }
152
153 [[nodiscard]] T* data() MR_LIFETIMEBOUND { return vec_.data(); }
154 [[nodiscard]] const T* data() const MR_LIFETIMEBOUND { return vec_.data(); }
155
156 void swap( Vector & b ) { vec_.swap( b.vec_ ); }
157
159 [[nodiscard]] size_t heapBytes() const { return capacity() * sizeof(T); }
160
162 std::vector<T> vec_;
163
164#if defined( MR_PARSING_FOR_ANY_BINDINGS ) || defined( MR_COMPILING_ANY_BINDINGS )
165 static_assert( sizeof(T) > 0 );
166#endif
167};
168
169template <typename T, typename I>
170[[nodiscard]] MR_BIND_IGNORE_PY inline auto begin( const Vector<T, I> & a )
171 { return a.vec_.begin(); }
172
173template <typename T, typename I>
174[[nodiscard]] MR_BIND_IGNORE_PY inline auto begin( Vector<T, I> & a )
175 { return a.vec_.begin(); }
176
177template <typename T, typename I>
178[[nodiscard]] MR_BIND_IGNORE_PY inline auto end( const Vector<T, I> & a )
179 { return a.vec_.end(); }
180
181template <typename T, typename I>
182[[nodiscard]] MR_BIND_IGNORE_PY inline auto end( Vector<T, I> & a )
183 { return a.vec_.end(); }
184
186template <typename T>
187[[nodiscard]] inline T getAt( const std::vector<T>& a, size_t id, T def = {} )
188{
189 return id < a.size() ? a[id] : def;
190}
191
193template <typename T, typename I>
194[[nodiscard]] inline T getAt( const Vector<T, I> & a, I id, T def = {} )
195{
196 return getAt( a.vec_, size_t( id ), def );
197}
198
199}
#define MR_LIFETIMEBOUND
Definition MRMacros.h:81
#define MR_LIFETIME_CAPTURE_BY_NESTED(x)
Definition MRMacros.h:86
#define MR_REQUIRES_IF_SUPPORTED(...)
Definition MRMacros.h:34
std::vector<T>-like container that requires specific indexing type,
Definition MRVector.h:23
MR_BIND_IGNORE_PY auto end(const BitSet &)
Definition MRBitSet.h:397
MR_BIND_IGNORE_PY auto begin(const BitSet &a)
Definition MRBitSet.h:395
reference back() MR_LIFETIMEBOUND
Definition MRVector.h:142
void push_back(T &&t MR_LIFETIME_CAPTURE_BY_NESTED(this))
Definition MRVector.h:133
void pop_back()
Definition MRVector.h:134
Vector()=default
creates empty vector
MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std::constructible_from< T, Args &&... >) T &emplace_back(Args &&... args)
Definition MRVector.h:136
void clear()
Definition MRVector.h:51
typename std::vector< T >::iterator iterator
Definition MRVector.h:28
std::size_t size() const
Definition MRVector.h:55
void resizeWithReserve(size_t newSize) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
doubles reserved memory until resize(newSize) can be done without reallocation
Definition MRVector.h:79
std::size_t capacity() const
Definition MRVector.h:63
void resize(size_t newSize) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
Definition MRVector.h:57
const_reference operator[](I i) const MR_LIFETIMEBOUND
Definition MRVector.h:67
reference autoResizeAt(I i) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
this accessor automatically adjusts the size of the vector
Definition MRVector.h:125
const T * data() const MR_LIFETIMEBOUND
Definition MRVector.h:154
typename std::vector< T >::reference reference
Definition MRVector.h:26
const_reference front() const MR_LIFETIMEBOUND
Definition MRVector.h:139
const_reference back() const MR_LIFETIMEBOUND
Definition MRVector.h:141
void push_back(const T &t MR_LIFETIME_CAPTURE_BY_NESTED(this))
Definition MRVector.h:132
Vector(InputIt first, InputIt last)
Definition MRVector.h:44
Vector(std::vector< T > &&vec)
moves data from the given std::vector<T>
Definition MRVector.h:41
T getAt(const Buffer< T, I > &bmap MR_LIFETIMEBOUND_NESTED, I key, T def={})
given some buffer map and a key, returns the value associated with the key, or default value if key i...
Definition MRBuffer.h:123
reference operator[](I i) MR_LIFETIMEBOUND
Definition MRVector.h:72
void reserve(size_t capacity)
Definition MRVector.h:65
I beginId() const
returns the identifier of the first element
Definition MRVector.h:145
void resizeNoInit(size_t targetSize) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
resizes the vector skipping initialization of its elements (more precisely initializing them using ( ...
Definition MRVector.h:61
size_t heapBytes() const
returns the amount of memory this object occupies on heap
Definition MRVector.h:159
I backId() const
returns the identifier of the back() element
Definition MRVector.h:148
void resizeWithReserve(size_t newSize, const T &value) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
doubles reserved memory until resize(newSize, value) can be done without reallocation
Definition MRVector.h:86
Vector(std::initializer_list< T > init)
Definition MRVector.h:46
reference front() MR_LIFETIMEBOUND
Definition MRVector.h:140
bool operator!=(const Vector &b) const MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
Definition MRVector.h:49
typename std::vector< T >::const_reference const_reference
Definition MRVector.h:27
T * data() MR_LIFETIMEBOUND
Definition MRVector.h:153
typename std::vector< T >::value_type value_type
Definition MRVector.h:25
bool operator==(const Vector &b) const MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
Definition MRVector.h:48
void autoResizeSet(I i, T val) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
sets the element #i to the given value, adjusting the size of the vector to include new element
Definition MRVector.h:119
bool empty() const
Definition MRVector.h:53
Vector(size_t size, const T &val)
creates a vector with size elements with the given value
Definition MRVector.h:38
typename std::vector< T >::const_iterator const_iterator
Definition MRVector.h:29
std::vector< T > vec_
the user can directly manipulate the vector, anyway she cannot break anything
Definition MRVector.h:162
void resizeNoInit(std::vector< T > &vec, size_t targetSize) MR_REQUIRES_IF_SUPPORTED(sizeof(T) > 0 &&std
Definition MRResizeNoInit.h:17
void swap(Vector &b)
Definition MRVector.h:156
void resize(size_t newSize, const T &t) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
Definition MRVector.h:58
void autoResizeSet(I pos, size_t len, T val) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
Definition MRVector.h:100
Vector(size_t size) MR_REQUIRES_IF_SUPPORTED(sizeof(T)>0 &&std
creates a vector with size elements with default value
Definition MRVector.h:35
I endId() const
returns backId() + 1
Definition MRVector.h:151
only for bindings generation
Definition MRCameraOrientationPlugin.h:8