dl
dl_table.h
浏览该文件的文档.
1
12#pragma once
13
14#include <cstddef>
15#include <span>
16#include <vector>
17#include <cassert>
18
19#include "dl_type.h"
21
22namespace dl
23{
25template<typename T>
26class Table2
27{
28public:
33 _w{ 0 }
34 {}
35
39 Table2(const Size& size)
40 {
41 _init(size);
42 }
43
47 Table2(const Size& size, const T* p)
48 {
49 _init(size);
50
51 for (size_t i = 0; i < _data.size(); ++i)
52 {
53 _data[i] = *(p + i);
54 }
55 }
56
61 void Resize(const Size& size)
62 {
63 assert(_w == 0);
64 _init(size);
65 }
66
70 std::span<T> operator[](std::size_t j)
71 {
72 assert(j < _ptrLine.size());
73 return { _ptrLine[j], _wLine };
74 }
75
78 const std::span<T> operator[](std::size_t j) const
79 {
80 assert(j < _ptrLine.size());
81 return { _ptrLine[j], _wLine };
82 }
83
88 /*T& operator[](std::size_t j, std::size_t i)
89 {
90 assert(j < _ptrLine.size());
91 assert(i < _w);
92 return _ptrLine[j][i];
93 }*/
94
95 const T& Get(std::size_t j, std::size_t i) const
96 {
97 assert(j < _ptrLine.size());
98 assert(i < _w);
99 return _ptrLine[j][i];
100 }
101
105 void Fill(const T& v)
106 {
107 for (auto& iter : _data)
108 iter = v;
109 }
110
115 void PushBack(std::vector<T>& vec)
116 {
117 assert(vec.size() == _w);
118 _data.insert(_data.end(), vec.begin(), vec.end());
119 _rebuild_ptr_line(_ptrLine.size() + 1);
120 }
121
122
123 bool IsEmpty() const { return _data.empty(); }
124
125 const std::byte* GetBuffer() const
126 {
127 return (const std::byte*)_data.data();
128 }
129
131 {
132 return _data.data();
133 }
134
135 const T* GetData() const
136 {
137 return _data.data();
138 }
139
140 unsigned GetWidth() const
141 {
142 return _w;
143 }
144
145 unsigned GetHeight() const
146 {
147 return (unsigned)_ptrLine.size();
148 }
149
150 Size GetSize() const
151 {
152 return { GetWidth(), GetHeight() };
153 }
154
155 // 由于标准库 size与 length等价,不使用length命令
156 unsigned GetSizeMul() const
157 {
158 return GetWidth() * GetHeight();
159 }
160
161 size_t GetSizeByte()
162 {
163 return _data.size() * sizeof(T);
164 }
165
166 auto begin()
167 {
168 return _data.begin();
169 }
170 auto end()
171 {
172 return _data.end();
173 }
174private:
175 std::vector<T> _data;
176 std::vector<T*> _ptrLine; // 行指针
177 std::vector<std::size_t> _wLine;// 行宽
178
179 void _init(const Size& size)
180 {
181 _w = size[0];
182 _data.resize(Accumulate::Mul(size));
183 _rebuild_ptr_line(size[1]);
184 }
185 // 重建行指针
186 void _rebuild_ptr_line(std::size_t h)
187 {
188 _ptrLine.resize(h);
189 for (size_t i = 0; i < _ptrLine.size(); ++i)
190 _ptrLine[i] = _data.data() + i;
191 }
192};
193
194
195}
bool IsEmpty() const
const std::span< T > operator[](std::size_t j) const
返回第j行
void Resize(const Size &size)
调整为指定大小
Size GetSize() const
std::span< T > operator[](std::size_t j)
返回第j行
unsigned GetHeight() const
void PushBack(std::vector< T > &vec)
插入行
Table2()
空构造
unsigned GetSizeMul() const
size_t GetSizeByte()
const std::byte * GetBuffer() const
void Fill(const T &v)
填充值
Table2(const Size &size, const T *p)
以指定大小构造,并传入指针赋值初始化
unsigned GetWidth() const
const T * GetData() const
Table2(const Size &size)
以指定大小构造
const T & Get(std::size_t j, std::size_t i) const
返回第j行 第i个
通用类型
constexpr auto Mul(const C &container)
求积product
PointU Size