DAWorkbench 0.0.1
DAWorkbench API
载入中...
搜索中...
未找到
DAColumnTable.hpp
1#ifndef DACOLUMNTABLE_H
2#define DACOLUMNTABLE_H
3// std
4#include <memory>
5// DA
6#include "da_algorithm.hpp"
7#include "DAVector.hpp"
8// Qt
9#include <QDebug>
10namespace DA
11{
12
17template< typename T >
19{
20public:
31 typedef T Type;
32 typedef DAColumnTable< T > TableType;
33 typedef DAVector< T > SeriesType;
34 typedef std::shared_ptr< SeriesType > SeriesPtr;
35 typedef typename DAVector< T >::iterator SeriesIterator;
36 typedef typename DAVector< T >::const_iterator SeriesConstIterator;
37 typedef std::shared_ptr< TableType > TablePtr;
38
39 static SeriesPtr makeSeries();
40 static SeriesPtr makeSeries(const QString& n);
41 static SeriesPtr makeSeries(std::initializer_list< T > args);
42 static TablePtr makeTable();
43
45 DAColumnTable(int rows, int columns);
46 void resize(int r, int c);
47 void reserve(int size);
48 //判断是否存在field
49 bool haveFieldid(const QString& field) const;
54 int rowCount() const;
55
60 int columnCount() const;
65 void fill(const T& v);
66 const T& at(int r, int c) const;
67 T& at(int r, int c);
68 T cell(int r, int c) const;
69 int nameToIndex(const QString& n) const;
70 SeriesPtr& column(int r);
71 const SeriesPtr& column(int r) const;
72 SeriesPtr& column(const QString& n);
73 const SeriesPtr& column(const QString& n) const;
74 //
75 SeriesPtr appendColumn(const QString& name);
76 SeriesPtr appendColumn(const QString& name, int size);
77 void appendColumn(SeriesPtr col);
78 void appendColumn(std::initializer_list< T > datas, const QString& colName);
79 template< typename Ite1, typename Ite2 >
80 void appendRow(Ite1 b, Ite2 e);
81 void appendRow(std::initializer_list< T > rowDatas);
82 //返回一列数据,返回一个SeriesPtr,这个seriesPtr的写操作不会影响table
83 SeriesPtr row(int c) const;
84
85 SeriesType& operator[](int c);
86 const SeriesType& operator[](int c) const;
87 SeriesType& operator[](const QString& colname);
88 const SeriesType& operator[](const QString& colname) const;
89
93 void fixSize();
98 void setMode(Mode m);
99 Mode getMode() const;
100
104 void clear();
105
106 void setName(const QString& n);
107 QString getName() const;
112 QStringList columnNames() const;
117 void setColumnNames(const QStringList& ns);
118
124
129 bool isCaseSensitivity() const;
130 //移除
131 void remove(const QString& name);
132 void remove(int colIndex);
133
134private:
136 size_t m_rows;
137 Mode m_mode;
138 SeriesPtr m_nullseries;
139 CaseSensitivity m_caseSensitivity;
140};
141
142//==============================================================
143// DAColumnTable
144//==============================================================
145
146template< typename T >
147typename DAColumnTable< T >::SeriesPtr DAColumnTable< T >::makeSeries()
148{
149 return (std::make_shared< SeriesType >());
150}
151
152template< typename T >
153typename DAColumnTable< T >::SeriesPtr DAColumnTable< T >::makeSeries(const QString& n)
154{
155 return (std::make_shared< SeriesType >(n));
156}
157
158template< typename T >
159typename DAColumnTable< T >::SeriesPtr DAColumnTable< T >::makeSeries(std::initializer_list< T > args)
160{
161 return (std::make_shared< SeriesType >(args));
162}
163
164template< typename T >
165typename DAColumnTable< T >::TablePtr DAColumnTable< T >::makeTable()
166{
167 return (std::make_shared< typename DAColumnTable< T >::TableType >());
168}
169
170template< typename T >
171DAColumnTable< T >::DAColumnTable() : m_rows(0), m_mode(FixedMode), m_caseSensitivity(CaseInsensitive)
172{
173}
174
175template< typename T >
176DAColumnTable< T >::DAColumnTable(int rows, int columns) : m_mode(FixedMode), m_caseSensitivity(CaseInsensitive)
177{
178 m_d.clear();
179 m_d.reserve(columns);
180 for (int i = 0; i < columns; ++i) {
181 m_d.push_back(SeriesType(rows));
182 }
183 m_rows = rows;
184}
185
191template< typename T >
193{
194 m_d.resize(c);
195 for (SeriesPtr& col : m_d) {
196 if (col == nullptr) {
197 col = makeSeries();
198 }
199 col->resize(r);
200 }
201 m_rows = r;
202}
203
204template< typename T >
205void DAColumnTable< T >::reserve(int size)
206{
207 for (SeriesPtr p : m_d) {
208 p->reserve(size);
209 }
210}
211
212template< typename T >
213bool DAColumnTable< T >::haveFieldid(const QString& field) const
214{
215 Qt::CaseSensitivity cs = isCaseSensitivity() ? Qt::CaseSensitive : Qt::CaseInsensitive;
216 for (const SeriesPtr& col : qAsConst(m_d)) {
217 if (col == nullptr) {
218 continue;
219 }
220 if (col->name().compare(field, cs) == 0) {
221 return true;
222 }
223 }
224 return (false);
225}
226
227template< typename T >
229{
230 return m_rows;
231}
232
233template< typename T >
235{
236 return (m_d.size());
237}
238
239template< typename T >
241{
242 for (SeriesPtr c : m_d) {
243 c->fill(v);
244 }
245}
246
247template< typename T >
248const T& DAColumnTable< T >::at(int r, int c) const
249{
250 return (m_d.at(c)->at(r));
251}
252
253template< typename T >
254T& DAColumnTable< T >::at(int r, int c)
255{
256 return (m_d[ c ]->operator[](r));
257}
258
265template< typename T >
266T DAColumnTable< T >::cell(int r, int c) const
267{
268 if (c < m_d.size()) {
269 const SeriesPtr& cc = column(c);
270 if (r < cc->size()) {
271 return (cc->at(r));
272 }
273 }
274 return (T());
275}
276
277template< typename T >
278int DAColumnTable< T >::nameToIndex(const QString& n) const
279{
280 int c = columnCount();
281 Qt::CaseSensitivity cs = isCaseSensitivity() ? Qt::CaseSensitive : Qt::CaseInsensitive;
282
283 for (int i = 0; i < c; ++i) {
284 if (column(i)->name().compare(n, cs) == 0) {
285 return (i);
286 }
287 }
288 return (-1);
289}
295template< typename T >
296typename DAColumnTable< T >::SeriesPtr& DAColumnTable< T >::column(int c)
297{
298 return (m_d[ c ]);
299}
305template< typename T >
306const typename DAColumnTable< T >::SeriesPtr& DAColumnTable< T >::column(int c) const
307{
308 return (m_d[ c ]);
309}
310
311template< typename T >
312typename DAColumnTable< T >::SeriesPtr& DAColumnTable< T >::column(const QString& n)
313{
314 int c = nameToIndex(n);
315
316 if ((c < 0) || (c >= columnCount())) {
317 return (m_nullseries);
318 }
319 return (column(c));
320}
321
322template< typename T >
323const typename DAColumnTable< T >::SeriesPtr& DAColumnTable< T >::column(const QString& n) const
324{
325 int c = nameToIndex(n);
326
327 if ((c < 0) || (c >= columnCount())) {
328 return (m_nullseries);
329 }
330 return (column(c));
331}
332
333template< typename T >
334typename DAColumnTable< T >::SeriesPtr DAColumnTable< T >::appendColumn(const QString& name)
335{
336 return appendColumn(name, m_rows);
337}
338
339template< typename T >
340typename DAColumnTable< T >::SeriesPtr DAColumnTable< T >::appendColumn(const QString& name, int size)
341{
342 SeriesPtr s = makeSeries(name);
343 s->resize(size);
344 appendColumn(s);
345 return s;
346}
347
348template< typename T >
349void DAColumnTable< T >::appendColumn(DAColumnTable< T >::SeriesPtr col)
350{
351 size_t s = col->size();
352
353 if ((s == m_rows) || (0 == m_rows)) {
354 m_d.push_back(col);
355 m_rows = s;
356 } else if (s < m_rows) { //在结尾补充
357 col->resize(m_rows);
358 m_d.push_back(col);
359 } else { // s>m_columns
360 if (getMode() == ExpandMode) {
361 m_d.push_back(col);
362 fixSize();
363 } else {
364 //固定模式的插入
365 col->resize(m_rows);
366 m_d.push_back(col);
367 }
368 }
369}
370
371template< typename T >
372void DAColumnTable< T >::appendColumn(std::initializer_list< T > datas, const QString& colName)
373{
374 SeriesPtr c = makeSeries(datas);
375
376 c->setName(colName);
377 appendColumn(c);
378}
379
380template< typename T >
381template< typename Ite1, typename Ite2 >
382void DAColumnTable< T >::appendRow(Ite1 b, Ite2 e)
383{
384 const int cc = columnCount();
385 auto it = b;
386
387 for (int i = 0; i < cc; ++i) {
388 it = b + i;
389 if (it < e) {
390 column(i)->push_back(*it);
391 } else {
392 column(i)->push_back(T());
393 }
394 }
395 ++m_rows;
396}
397
398template< typename T >
399void DAColumnTable< T >::appendRow(std::initializer_list< T > rowDatas)
400{
401 const int cc = columnCount();
402
403 for (int i = 0; i < cc; ++i) {
404 if (i < rowDatas.size()) {
405 column(i)->push_back(rowDatas[ i ]);
406 } else {
407 column(i)->push_back(T());
408 }
409 }
410 ++m_rows;
411}
412
413template< typename T >
414typename DAColumnTable< T >::SeriesPtr DAColumnTable< T >::row(int r) const
415{
416 int csize = columnCount();
417 SeriesPtr rs = std::make_shared< SeriesType >(csize);
418
419 for (int c = 0; c < csize; ++c) {
420 rs->operator[](c) = cell(r, c);
421 }
422 return (rs);
423}
424
425template< typename T >
426typename DAColumnTable< T >::SeriesType& DAColumnTable< T >::operator[](int c)
427{
428 return (*(column(c)));
429}
430
431template< typename T >
432const typename DAColumnTable< T >::SeriesType& DAColumnTable< T >::operator[](int c) const
433{
434 return (*(column(c)));
435}
436template< typename T >
437typename DAColumnTable< T >::SeriesType& DAColumnTable< T >::operator[](const QString& colname)
438{
439 return (*(column(colname)));
440}
441
442template< typename T >
443const typename DAColumnTable< T >::SeriesType& DAColumnTable< T >::operator[](const QString& colname) const
444{
445 return (*(column(colname)));
446}
447
448template< typename T >
450{
451 std::vector< int > ss;
452 ss.reserve(m_d.size());
453
454 for (const SeriesPtr& c : qAsConst(m_d)) {
455 ss.push_back(c->size());
456 }
457 int maxsize = *(std::max_element(ss.begin(), ss.end()));
458
459 for (SeriesPtr& c : m_d) {
460 if (c->size() < maxsize) {
461 c->resize(maxsize);
462 }
463 }
464 m_rows = maxsize;
465}
466
467template< typename T >
469{
470 m_mode = m;
471}
472
473template< typename T >
475{
476 return (m_mode);
477}
478
479template< typename T >
481{
482 m_d.clear();
483 m_rows = 0;
484}
485
486template< typename T >
487void DAColumnTable< T >::setName(const QString& n)
488{
489 m_d.setName(n);
490}
491
492template< typename T >
493QString DAColumnTable< T >::getName() const
494{
495 return (m_d.getName());
496}
497
498template< typename T >
500{
501 QStringList r;
502
503 for (const SeriesPtr& p : qAsConst(m_d)) {
504 r.append(p->getName());
505 }
506 return (r);
507}
508
509template< typename T >
510void DAColumnTable< T >::setColumnNames(const QStringList& ns)
511{
512 auto cc = std::min(ns.size(), columnCount());
513 for (int i = 0; i < cc; ++i) {
514 column(i)->setName(ns[ i ]);
515 }
516}
517
518template< typename T >
523
524template< typename T >
526{
527 return (m_caseSensitivity == CaseSensitive);
528}
529
530template< typename T >
531void DAColumnTable< T >::remove(const QString& name)
532{
533 int r = nameToIndex(name);
534 if (r < 0) {
535 return;
536 }
537 remove(r);
538}
539
540template< typename T >
541void DAColumnTable< T >::remove(int colIndex)
542{
543 m_d.remove(colIndex);
544 if (0 == m_d.size()) {
545 m_rows = 0;
546 }
547}
548
549} // end DA
550
551#endif // DACOLUMNTABLE_H
列族表
Definition DAColumnTable.hpp:19
bool isCaseSensitivity() const
判断是否大小写敏感
Definition DAColumnTable.hpp:525
void resize(int r, int c)
改变table 的大小
Definition DAColumnTable.hpp:192
int rowCount() const
表的行数
Definition DAColumnTable.hpp:228
Mode
Definition DAColumnTable.hpp:22
@ FixedMode
固定模式,表的列不会随着行的变化而变化(默认)
Definition DAColumnTable.hpp:23
@ ExpandMode
扩展模式,表的列是浮动的,如果插入一行比原来要宽,会自动扩充表的列数
Definition DAColumnTable.hpp:24
T cell(int r, int c) const
获取单元格
Definition DAColumnTable.hpp:266
void clear()
清空
Definition DAColumnTable.hpp:480
SeriesPtr & column(int r)
获取列引用
Definition DAColumnTable.hpp:296
void setColumnNames(const QStringList &ns)
设置行名,如果是个空的表会生成一个默认行
Definition DAColumnTable.hpp:510
int columnCount() const
表的列数
Definition DAColumnTable.hpp:234
QStringList columnNames() const
colNames
Definition DAColumnTable.hpp:499
CaseSensitivity
Definition DAColumnTable.hpp:27
@ CaseSensitive
大小写敏感
Definition DAColumnTable.hpp:29
@ CaseInsensitive
大小写不敏感
Definition DAColumnTable.hpp:28
void setCaseSensitivity(CaseSensitivity cs)
设置名字查询时是否对大小写敏感
Definition DAColumnTable.hpp:519
void fixSize()
以最大列数进行列数修正,保证所有行同列
Definition DAColumnTable.hpp:449
void fill(const T &v)
填充元素
Definition DAColumnTable.hpp:240
void setMode(Mode m)
设置表格的模式
Definition DAColumnTable.hpp:468
系列数据,系列允许设置名字
Definition da_data_table.hpp:19
序列化类都是带异常的,使用中需要处理异常
Definition AppMainWindow.cpp:44