12 using vector_type = std::vector<T>;
16 vector2d(
size_t width,
size_t height) {
17 set_size_internal(width, height);
18 data_ = vector_type(size_);
21 vector2d(
size_t width,
size_t height,
const T& init) {
22 set_size_internal(width, height);
23 data_ = vector_type(size_, init);
26 size_t width()
const {
30 size_t height()
const {
42 typename std::vector<T>::iterator begin()
noexcept {
46 typename std::vector<T>::const_iterator begin()
const noexcept {
50 typename std::vector<T>::iterator end()
noexcept {
54 typename std::vector<T>::const_iterator end()
const noexcept {
58 typename std::vector<T>::reverse_iterator rbegin()
noexcept {
59 return data_.rbegin();
62 typename std::vector<T>::const_reverse_iterator rbegin()
const noexcept {
63 return data_.rbegin();
66 typename std::vector<T>::reverse_iterator rend()
noexcept {
70 typename std::vector<T>::const_reverse_iterator rend()
const noexcept {
74 typename std::vector<T>::const_iterator cbegin()
const noexcept {
78 typename std::vector<T>::const_iterator cend()
const noexcept {
82 typename std::vector<T>::const_reverse_iterator crbegin()
const noexcept {
86 typename std::vector<T>::const_reverse_iterator crend()
const noexcept {
94 const T* data()
const {
103 void resize(
size_t width,
size_t height) {
104 set_size_internal(width, height);
108 void resize(
size_t width,
size_t height,
const T& init) {
109 set_size_internal(width, height);
110 data_.resize(size_, init);
113 T& operator[](
size_t index) {
117 T operator[](
size_t index)
const {
121 T& operator()(
size_t x,
size_t y) {
122 return data_[to_linear_index(x, y)];
125 T operator()(
size_t x,
size_t y)
const {
126 return data_[to_linear_index(x, y)];
129 void push_back(
const T& value) {
130 data_.insert(data_.end(), width_, value);
131 set_size_internal(width_, height_ + 1);
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);
141 data_.erase(data_.end() - width_, data_.end());
142 set_size_internal(width_, height_ - 1);
146 void set_size_internal(
size_t width,
size_t height) {
149 size_ = width_ * height_;
152 size_t to_linear_index(
size_t x,
size_t y)
const {
153 return x + width_ * y;