MeshLib
 
Loading...
Searching...
No Matches
MRMesh/MRVector.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMacros.h"
4#include "MRMeshFwd.h"
5#include <cassert>
6#include <vector>
7
8namespace MR
9{
10
17template <typename T, typename I>
18class Vector
19{
20public:
21 using value_type = typename std::vector<T>::value_type;
22 using reference = typename std::vector<T>::reference;
23 using const_reference = typename std::vector<T>::const_reference;
24 using iterator = typename std::vector<T>::iterator;
25 using const_iterator = typename std::vector<T>::const_iterator;
26
27 Vector() = default;
28 explicit Vector( size_t size ) MR_REQUIRES_IF_SUPPORTED( std::default_initializable<T> ) : vec_( size ) { }
29 explicit Vector( size_t size, const T & val ) : vec_( size, val ) { }
30 Vector( std::vector<T> && vec ) : vec_( std::move( vec ) ) { }
31 template< class InputIt >
32 Vector( InputIt first, InputIt last ) : vec_( first, last ) { }
33 Vector( std::initializer_list<T> init ) : vec_( init ) { }
34
35 [[nodiscard]] bool operator == ( const Vector & b ) const MR_REQUIRES_IF_SUPPORTED( std::equality_comparable<T> ) { return vec_ == b.vec_; }
36 [[nodiscard]] bool operator != ( const Vector & b ) const MR_REQUIRES_IF_SUPPORTED( std::equality_comparable<T> ) { return vec_ != b.vec_; }
37
38 void clear() { vec_.clear(); }
39 [[nodiscard]] bool empty() const { return vec_.empty(); }
40
41 [[nodiscard]] std::size_t size() const { return vec_.size(); }
42
43 void resize( size_t newSize ) MR_REQUIRES_IF_SUPPORTED( std::movable<T> && std::default_initializable<T> ) { vec_.resize( newSize ); }
44 void resize( size_t newSize, const T & t ) MR_REQUIRES_IF_SUPPORTED( std::movable<T> ) { vec_.resize( newSize, t ); }
45
46 // resizes the vector skipping initialization of its elements (more precisely initializing them using ( noInit ) constructor )
47 void resizeNoInit( size_t targetSize ) MR_REQUIRES_IF_SUPPORTED( std::constructible_from<T, NoInit> )
48 {
49 // allocate enough memory
50 reserve( targetSize );
51 // resize without memory access
52 while ( size() < targetSize )
54 // in case initial size was larger
55 resize( targetSize );
56 }
57
58 [[nodiscard]] std::size_t capacity() const { return vec_.capacity(); }
59 void reserve( size_t capacity ) { vec_.reserve( capacity ); }
60
61 [[nodiscard]] const_reference operator[]( I i ) const
62 {
63 assert( i < vec_.size() );
64 return vec_[i];
65 }
66 [[nodiscard]] reference operator[]( I i )
67 {
68 assert( i < vec_.size() );
69 return vec_[i];
70 }
71
73 void resizeWithReserve( size_t newSize, const T & value = T() )
74 {
75 auto reserved = vec_.capacity();
76 if ( reserved > 0 && newSize > reserved )
77 {
78 while ( newSize > reserved )
79 reserved <<= 1;
80 vec_.reserve( reserved );
81 }
82 vec_.resize( newSize, value );
83 }
84
86 void autoResizeSet( I pos, size_t len, T val )
87 {
88 assert( pos );
89 const int p{ pos };
90 if ( const auto sz = size(); p + len > sz )
91 {
92 resizeWithReserve( p + len, val );
93 if ( p >= sz )
94 return;
95 len = sz - p;
96 }
97 for ( size_t i = 0; i < len; ++i )
98 vec_[ p + i ] = val;
99 }
100 void autoResizeSet( I i, T val ) { autoResizeSet( i, 1, val ); }
101
103 [[nodiscard]] reference autoResizeAt( I i ) MR_REQUIRES_IF_SUPPORTED( std::default_initializable<T> )
104 {
105 if ( i + 1 > size() )
106 resizeWithReserve( i + 1 );
107 return vec_[i];
108 }
109
110 void push_back( const T & t ) { vec_.push_back( t ); }
111 void push_back( T && t ) { vec_.push_back( std::move( t ) ); }
112 void pop_back() { vec_.pop_back(); }
113
114 template<typename... Args>
115 T& emplace_back( Args&&... args ) { return vec_.emplace_back( std::forward<Args>(args)... ); }
116
117 [[nodiscard]] const_reference front() const { return vec_.front(); }
118 [[nodiscard]] reference front() { return vec_.front(); }
119 [[nodiscard]] const_reference back() const { return vec_.back(); }
120 [[nodiscard]] reference back() { return vec_.back(); }
122 [[nodiscard]] I beginId() const { return I( size_t(0) ); }
124 [[nodiscard]] I backId() const { assert( !vec_.empty() ); return I( vec_.size() - 1 ); }
126 [[nodiscard]] I endId() const { return I( vec_.size() ); }
127
128 [[nodiscard]] T* data() { return vec_.data(); }
129 [[nodiscard]] const T* data() const { return vec_.data(); }
130
131 void swap( Vector & b ) { vec_.swap( b.vec_ ); }
132
134 [[nodiscard]] size_t heapBytes() const { return capacity() * sizeof(T); }
135
137 std::vector<T> vec_;
138};
139
140template <typename T, typename I>
141[[nodiscard]] inline auto begin( const Vector<T, I> & a )
142 { return a.vec_.begin(); }
143
144template <typename T, typename I>
145[[nodiscard]] inline auto begin( Vector<T, I> & a )
146 { return a.vec_.begin(); }
147
148template <typename T, typename I>
149[[nodiscard]] inline auto end( const Vector<T, I> & a )
150 { return a.vec_.end(); }
151
152template <typename T, typename I>
153[[nodiscard]] inline auto end( Vector<T, I> & a )
154 { return a.vec_.end(); }
155
157template <typename T, typename I>
158[[nodiscard]] inline T getAt( const Vector<T, I> & a, I id, T def = {} )
159{
160 return ( id && id < a.size() ) ? a[id] : def;
161}
162
163} // namespace MR
#define MR_REQUIRES_IF_SUPPORTED(...)
Definition MRMacros.h:29
std::vector<T>-like container that requires specific indexing type,
Definition MRMesh/MRVector.h:19
void pop_back()
Definition MRMesh/MRVector.h:112
Vector()=default
void clear()
Definition MRMesh/MRVector.h:38
reference front()
Definition MRMesh/MRVector.h:118
Vector(size_t size) MR_REQUIRES_IF_SUPPORTED(std
Definition MRMesh/MRVector.h:28
typename std::vector< T >::iterator iterator
Definition MRMesh/MRVector.h:24
void autoResizeSet(I i, T val)
Definition MRMesh/MRVector.h:100
void resizeNoInit(size_t targetSize) MR_REQUIRES_IF_SUPPORTED(std
Definition MRMesh/MRVector.h:47
std::size_t size() const
Definition MRMesh/MRVector.h:41
std::size_t capacity() const
Definition MRMesh/MRVector.h:58
void resize(size_t newSize) MR_REQUIRES_IF_SUPPORTED(std
Definition MRMesh/MRVector.h:43
reference operator[](I i)
Definition MRMesh/MRVector.h:66
void resizeWithReserve(size_t newSize, const T &value=T())
doubles reserved memory until resize(newSize) can be done without reallocation
Definition MRMesh/MRVector.h:73
typename std::vector< T >::reference reference
Definition MRMesh/MRVector.h:22
void autoResizeSet(I pos, size_t len, T val)
sets elements [pos, pos+len) to given value, adjusting the size of the vector to include new elements
Definition MRMesh/MRVector.h:86
bool operator!=(const Vector &b) const MR_REQUIRES_IF_SUPPORTED(std
Definition MRMesh/MRVector.h:36
T * data()
Definition MRMesh/MRVector.h:128
Vector(InputIt first, InputIt last)
Definition MRMesh/MRVector.h:32
Vector(std::vector< T > &&vec)
Definition MRMesh/MRVector.h:30
void reserve(size_t capacity)
Definition MRMesh/MRVector.h:59
I beginId() const
returns the identifier of the first element
Definition MRMesh/MRVector.h:122
void push_back(const T &t)
Definition MRMesh/MRVector.h:110
reference autoResizeAt(I i) MR_REQUIRES_IF_SUPPORTED(std
this accessor automatically adjusts the size of the vector
Definition MRMesh/MRVector.h:103
size_t heapBytes() const
returns the amount of memory this object occupies on heap
Definition MRMesh/MRVector.h:134
const_reference operator[](I i) const
Definition MRMesh/MRVector.h:61
I backId() const
returns the identifier of the back() element
Definition MRMesh/MRVector.h:124
Vector(std::initializer_list< T > init)
Definition MRMesh/MRVector.h:33
bool operator==(const Vector &b) const MR_REQUIRES_IF_SUPPORTED(std
Definition MRMesh/MRVector.h:35
reference back()
Definition MRMesh/MRVector.h:120
typename std::vector< T >::const_reference const_reference
Definition MRMesh/MRVector.h:23
const T * data() const
Definition MRMesh/MRVector.h:129
void resize(size_t newSize, const T &t) MR_REQUIRES_IF_SUPPORTED(std
Definition MRMesh/MRVector.h:44
typename std::vector< T >::value_type value_type
Definition MRMesh/MRVector.h:21
bool empty() const
Definition MRMesh/MRVector.h:39
Vector(size_t size, const T &val)
Definition MRMesh/MRVector.h:29
typename std::vector< T >::const_iterator const_iterator
Definition MRMesh/MRVector.h:25
std::vector< T > vec_
the user can directly manipulate the vector, anyway she cannot break anything
Definition MRMesh/MRVector.h:137
void swap(Vector &b)
Definition MRMesh/MRVector.h:131
const_reference front() const
Definition MRMesh/MRVector.h:117
void push_back(T &&t)
Definition MRMesh/MRVector.h:111
T & emplace_back(Args &&... args)
Definition MRMesh/MRVector.h:115
const_reference back() const
Definition MRMesh/MRVector.h:119
I endId() const
returns backId() + 1
Definition MRMesh/MRVector.h:126
auto begin(const BitSet &a)
Definition MRMesh/MRBitSet.h:263
auto end(const BitSet &)
Definition MRMesh/MRBitSet.h:265
Definition MRCameraOrientationPlugin.h:8
T getAt(const Buffer< T, I > &bmap, I key)
given some buffer map and a key, returns the value associated with the key, or default value if key i...
Definition MRBuffer.h:119
constexpr NoInit noInit
Definition MRMesh/MRMeshFwd.h:57
I
Definition MRMesh/MRMeshFwd.h:88