You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
3.0 KiB
C

1 month ago
#pragma once
#include <map>
#include <string>
#include <variant>
#include <vector>
#include <cassert>
// <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using DataTableValue = std::variant<int, double, std::string>;
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>
*/
class DataColumn
{
public:
enum class DataType
{
Int,
Double,
String,
};
DataColumn(const std::string& m_name, DataType m_dataType)
: m_name(m_name), m_dataType(m_dataType)
{
}
const std::string& getName() const
{
return m_name;
}
void setName(const std::string& name)
{
m_name = name;
}
DataType getDataType() const
{
return m_dataType;
}
void setDataType(DataType dataType)
{
m_dataType = dataType;
}
private:
std::string m_name;
DataType m_dataType;
};
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>
*/
class DataRow
{
public:
/**
* ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* \param columnName <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \param value ֵ
*/
void setValue(const std::string& columnName, const DataTableValue& value)
{
m_values[columnName] = value;
}
/**
* <EFBFBD><EFBFBD>ȡָ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
*
* \param columnName <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \return
*/
const DataTableValue &value(const std::string& columnName) const
{
return m_values.at(columnName);
}
/**
* <EFBFBD><EFBFBD>ȡָ<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
*
* \param columnName <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \return
*/
DataTableValue& operator[](const std::string& columnName)
{
return m_values[columnName];
}
private:
std::map<std::string, DataTableValue> m_values;
};
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \note
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>
* 1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵʱû<EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* 2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* 3<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD>еȲ<EFBFBD><EFBFBD><EFBFBD>
* 4<EFBFBD><EFBFBD>û<EFBFBD>ж<EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* 5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱûϸ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
class DataTable
{
public:
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param column <EFBFBD><EFBFBD>
*/
void addColumn(const DataColumn& column)
{
m_columns.push_back(column);
}
/**
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
size_t columnCount() const
{
return m_columns.size();
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param row <EFBFBD><EFBFBD>
*/
void addRow(const DataRow& row)
{
m_rows.push_back(row);
}
/**
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \return
*/
size_t rowCount() const
{
return m_rows.size();
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD>ȡֵ
*
* \param rowIndex <EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʼ
* \param columnIndex <EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʼ
* \return <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ֵ
*/
const DataTableValue& getValue(int rowIndex, int columnIndex) const
{
assert(rowIndex >= 0);
assert(columnIndex >= 0);
return m_rows[rowIndex].value(m_columns[columnIndex].getName());
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*
* \param rowIndex <EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʼ
* \param columnIndex <EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʼ
* \param value ֵ
*/
void setValue(int rowIndex, int columnIndex, const DataTableValue& value)
{
assert(rowIndex >= 0);
assert(columnIndex >= 0);
m_rows[rowIndex].setValue(m_columns[columnIndex].getName(), value);
}
/**
* <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ͷ
*
* \return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ͷ
*/
std::vector<std::string> getColumnHeaders() const
{
std::vector<std::string> headers;
for (const auto& column : m_columns) {
headers.push_back(column.getName());
}
return headers;
}
private:
std::vector<DataColumn> m_columns;
std::vector<DataRow> m_rows;
};