cgv
Loading...
Searching...
No Matches
vector2d.h
1#pragma once
2
3#include <vector>
4
5namespace cgv {
6namespace data {
7
8template<typename T>
9class vector2d {
10public:
11 using value_type = T;
12 using vector_type = std::vector<T>;
13
14 vector2d() {}
15
16 vector2d(size_t width, size_t height) {
17 set_size_internal(width, height);
18 data_ = vector_type(size_);
19 }
20
21 vector2d(size_t width, size_t height, const T& init) {
22 set_size_internal(width, height);
23 data_ = vector_type(size_, init);
24 }
25
26 size_t width() const {
27 return width_;
28 }
29
30 size_t height() const {
31 return height_;
32 }
33
34 size_t size() const {
35 return size_;
36 }
37
38 bool empty() const {
39 return size_ == 0;
40 }
41
42 typename std::vector<T>::iterator begin() noexcept {
43 return data_.begin();
44 }
45
46 typename std::vector<T>::const_iterator begin() const noexcept {
47 return data_.begin();
48 }
49
50 typename std::vector<T>::iterator end() noexcept {
51 return data_.end();
52 }
53
54 typename std::vector<T>::const_iterator end() const noexcept {
55 return data_.end();
56 }
57
58 typename std::vector<T>::reverse_iterator rbegin() noexcept {
59 return data_.rbegin();
60 }
61
62 typename std::vector<T>::const_reverse_iterator rbegin() const noexcept {
63 return data_.rbegin();
64 }
65
66 typename std::vector<T>::reverse_iterator rend() noexcept {
67 return data_.rend();
68 }
69
70 typename std::vector<T>::const_reverse_iterator rend() const noexcept {
71 return data_.rend();
72 }
73
74 typename std::vector<T>::const_iterator cbegin() const noexcept {
75 return begin();
76 }
77
78 typename std::vector<T>::const_iterator cend() const noexcept {
79 return end();
80 }
81
82 typename std::vector<T>::const_reverse_iterator crbegin() const noexcept {
83 return rbegin();
84 }
85
86 typename std::vector<T>::const_reverse_iterator crend() const noexcept {
87 return rend();
88 }
89
90 T* data() {
91 return data_.data();
92 }
93
94 const T* data() const {
95 return data_.data();
96 }
97
98 void clear() {
99 size_ = 0;
100 data_.clear();
101 }
102
103 void resize(size_t width, size_t height) {
104 set_size_internal(width, height);
105 data_.resize(size_);
106 }
107
108 void resize(size_t width, size_t height, const T& init) {
109 set_size_internal(width, height);
110 data_.resize(size_, init);
111 }
112
113 T& operator[](size_t index) {
114 return data_[index];
115 }
116
117 T operator[](size_t index) const {
118 return data_[index];
119 }
120
121 T& operator()(size_t x, size_t y) {
122 return data_[to_linear_index(x, y)];
123 }
124
125 T operator()(size_t x, size_t y) const {
126 return data_[to_linear_index(x, y)];
127 }
128
129 void push_back(const T& value) {
130 data_.insert(data_.end(), width_, value);
131 set_size_internal(width_, height_ + 1);
132 }
133
134 void push_back(const std::vector<T>& values) {
135 size_t count = values.size() > width_ ? width_ : values.size();
136 data_.insert(data_.end(), values.begin(), values.begin() + count);
137 set_size_internal(width_, height_ + 1);
138 }
139
140 void pop_back() {
141 data_.erase(data_.end() - width_, data_.end());
142 set_size_internal(width_, height_ - 1);
143 }
144
145private:
146 void set_size_internal(size_t width, size_t height) {
147 width_ = width;
148 height_ = height;
149 size_ = width_ * height_;
150 }
151
152 size_t to_linear_index(size_t x, size_t y) const {
153 return x + width_ * y;
154 }
155
156 size_t width_ = 0;
157 size_t height_ = 0;
158 size_t size_ = 0;
159 vector_type data_;
160};
161
162} // namespace data
163} // namespace cgv
this header is dependency free
Definition print.h:11