为集成化序列化和反序列话构建

This commit is contained in:
codeboss 2025-08-02 10:42:39 +08:00
parent 0e68e0c66e
commit 33cb4a12b5
9 changed files with 139 additions and 124 deletions

View File

@ -66,7 +66,7 @@ void SequenceRulesView::peersRuleChanged(const QModelIndex& idx)
if (typeid(*new_inst.get()) == typeid(BytesAsList)) {
auto conv = std::dynamic_pointer_cast<BytesAsList>(new_inst);
if (!conv->elementRule()) {
conv->setElementRule(this->base->defaultRule());
conv->appendElementRule(this->base->defaultRule());
}
if (!conv->sizeProvider()) {
@ -153,59 +153,6 @@ void SequenceRulesView::removeTranslateUnit()
_sequence_model->removeRow(idx_curr.row());
}
TranslateBasic::TranslateBasic()
{
// extractor type-list
std::shared_ptr<ExtractUnit> u_ptr = std::make_shared<BytesAsBitCombine>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsInteger>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsUnsigned>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsString>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsHex>();
_extractor_types[u_ptr->name()] = u_ptr;
this->_default_translate_rule = u_ptr;
u_ptr = std::make_shared<BytesAsFloat>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsDouble>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsList>();
_extractor_types[u_ptr->name()] = u_ptr;
// size-provider type-list
auto sz_ptr = std::make_shared<ConstNumberProvider>();
this->_default_size_provider = sz_ptr;
_size_provider_types[sz_ptr->name()] = sz_ptr;
}
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
{
return _default_translate_rule;
}
std::shared_ptr<SizeProvider> TranslateBasic::defaultSizeProvider() const
{
return _default_size_provider;
}
QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extactors() const
{
return _extractor_types;
}
QHash<QString, std::shared_ptr<SizeProvider>> TranslateBasic::sizeProviders() const
{
return _size_provider_types;
}
RuleSelectDelegate::RuleSelectDelegate(std::shared_ptr<TranslateBasic> ins)
:_kernel(ins) {
@ -239,23 +186,3 @@ void RuleSelectDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptio
{
editor->setGeometry(option.rect);
}
QString ConstNumberProvider::name() const
{
return NAME(ConstNumberProvider);
}
int32_t ConstNumberProvider::value(const QString& expr) const
{
return expr.toInt();
}
void ConstNumberProvider::setExpression(const QString& expr)
{
this->_number_value = expr;
}
QString ConstNumberProvider::expression() const
{
return this->_number_value;
}

View File

@ -52,18 +52,6 @@ public:
virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
};
class ConstNumberProvider : public SizeProvider {
private:
QString _number_value;
public:
QString name() const override;
int32_t value(const QString& expr) const override;
void setExpression(const QString &expr) override;
QString expression() const override;
};
/// <summary>
/// ÐòÁл¯¹æÔòÊÓͼ
/// </summary>

View File

@ -1 +1,78 @@
#include "TranslateBasic.h"
using namespace extract;
TranslateBasic::TranslateBasic()
{
// extractor type-list
std::shared_ptr<ExtractUnit> u_ptr = std::make_shared<BytesAsBitCombine>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsInteger>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsUnsigned>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsString>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsHex>();
_extractor_types[u_ptr->name()] = u_ptr;
this->_default_translate_rule = u_ptr;
u_ptr = std::make_shared<BytesAsFloat>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsDouble>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsList>();
_extractor_types[u_ptr->name()] = u_ptr;
// size-provider type-list
auto sz_ptr = std::make_shared<ConstNumberProvider>();
this->_default_size_provider = sz_ptr;
_size_provider_types[sz_ptr->name()] = sz_ptr;
}
std::shared_ptr<ExtractUnit> TranslateBasic::defaultRule() const
{
return _default_translate_rule;
}
std::shared_ptr<SizeProvider> TranslateBasic::defaultSizeProvider() const
{
return _default_size_provider;
}
QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extactors() const
{
return _extractor_types;
}
QHash<QString, std::shared_ptr<SizeProvider>> TranslateBasic::sizeProviders() const
{
return _size_provider_types;
}
QString ConstNumberProvider::name() const
{
return NAME(ConstNumberProvider);
}
int32_t ConstNumberProvider::value(const QString& expr) const
{
return expr.toInt();
}
void ConstNumberProvider::setExpression(const QString& expr)
{
this->_number_value = expr;
}
QString ConstNumberProvider::expression() const
{
return this->_number_value;
}

View File

@ -22,3 +22,15 @@ public:
QHash<QString, std::shared_ptr<ExtractUnit>> extactors() const;
QHash<QString, std::shared_ptr<SizeProvider>> sizeProviders() const;
};
class ConstNumberProvider : public SizeProvider {
private:
QString _number_value;
public:
QString name() const override;
int32_t value(const QString& expr) const override;
void setExpression(const QString& expr) override;
QString expression() const override;
};

View File

@ -11,6 +11,7 @@
#define STRING_PEAK(codec_name) codec_name = obj[NAME(codec_name)].toString();
#define STRING_SAVE(codec_name) obj[NAME(codec_name)] = codec_name;
class TranslateBasic;
/// <summary>
/// 序列化实体
/// </summary>
@ -21,7 +22,7 @@ public:
/// 反序列化
/// </summary>
/// <param name="obj"></param>
virtual void loadFrom(const QJsonObject& obj) = 0;
virtual void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) = 0;
/// <summary>
/// 序列化
/// </summary>

View File

@ -24,7 +24,7 @@ DataType AbstractValueConvert::outType() const
return _out_type;
}
void AbstractValueConvert::loadFrom(const QJsonObject& obj)
void AbstractValueConvert::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
auto int_in_type = (int)_in_type;
INT32_PEAK(int_in_type);

View File

@ -28,7 +28,7 @@ namespace convert {
DataType inType() const override;
DataType outType() const override;
void loadFrom(const QJsonObject& obj) override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};

View File

@ -42,7 +42,8 @@ int AbstractExtractor::countWithin() const
return this->_abs_data.byte_count;
}
void AbstractExtractor::loadFrom(const QJsonObject& obj)
void AbstractExtractor::loadFrom(
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
INT32_PEAK(_abs_data.byte_offset);
INT32_PEAK(_abs_data.byte_count);
@ -82,7 +83,7 @@ BytesAsBitCombine::BytesAsBitCombine()
bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
{
if (bit_index >= 0 && bit_index <= this->countWithin() * 8) {
_combines._switch_options[bit_index] = keyword;
_combine._switch_options[bit_index] = keyword;
return true;
}
return false;
@ -90,17 +91,17 @@ bool BytesAsBitCombine::setSwitchOption(int bit_index, const QString& keyword)
QHash<int, QString> BytesAsBitCombine::switchOptions() const
{
return _combines._switch_options;
return _combine._switch_options;
}
void BytesAsBitCombine::clearOptions()
{
_combines._switch_options.clear();
_combine._switch_options.clear();
}
QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
{
auto keys = _combines._switch_options.keys();
auto keys = _combine._switch_options.keys();
std::sort(keys.begin(), keys.end());
QString result;
@ -109,23 +110,24 @@ QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
auto bit_idx = idx % 8;
auto char_v = bytes.at(byte_idx);
if (char_v & (0x1u << bit_idx))
result += QString("%1<%2>;").arg(_combines._switch_options[idx], "Y");
result += QString("%1<%2>;").arg(_combine._switch_options[idx], "Y");
else
result += QString("%1<%2>;").arg(_combines._switch_options[idx], "N");
result += QString("%1<%2>;").arg(_combine._switch_options[idx], "N");
}
return result;
}
void BytesAsBitCombine::loadFrom(const QJsonObject& obj)
void BytesAsBitCombine::loadFrom(
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
AbstractExtractor::loadFrom(obj);
AbstractExtractor::loadFrom(core, obj);
QStringList value_list;
STRLIST_PEAK(value_list);
_combines._switch_options.clear();
_combine._switch_options.clear();
for (auto pair : value_list) {
auto items = pair.split("=");
_combines._switch_options[items.first().toInt()] = items.last();
_combine._switch_options[items.first().toInt()] = items.last();
}
}
@ -134,9 +136,9 @@ void BytesAsBitCombine::saveTo(QJsonObject& obj) const
AbstractExtractor::saveTo(obj);
QStringList value_list;
for (auto key : _combines._switch_options.keys()) {
for (auto key : _combine._switch_options.keys()) {
auto pair_str = QString("%1=%2").arg(key)
.arg(_combines._switch_options[key]);
.arg(_combine._switch_options[key]);
value_list << pair_str;
}
STRLIST_SAVE(value_list);
@ -207,9 +209,9 @@ QVariant BytesAsString::parse(const QByteArray& bytes) const
return _strings._conv_with->toUnicode(bytes);
}
void BytesAsString::loadFrom(const QJsonObject& obj)
void BytesAsString::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
AbstractExtractor::loadFrom(obj);
AbstractExtractor::loadFrom(core, obj);
QString codec_name;
STRING_PEAK(codec_name);
@ -302,7 +304,7 @@ std::shared_ptr<ExtractUnit> BytesAsList::elementRule() const
return this->_list._bind_unit;
}
bool BytesAsList::setElementRule(std::shared_ptr<ExtractUnit> u)
bool BytesAsList::appendElementRule(std::shared_ptr<ExtractUnit> u)
{
this->_list._bind_unit = u;
return true;
@ -345,25 +347,32 @@ int BytesAsList::countWithin() const
* this->_list._bind_unit->countWithin();
}
void BytesAsList::loadFrom(const QJsonObject& obj)
#include "TranslateBasic.h"
void BytesAsList::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
INT32_PEAK(_list._bytes_offset);
QString bind_unit_name = "";
QString bind_size_provider_name = "";
STRING_PEAK(bind_unit_name);
STRING_PEAK(bind_size_provider_name);
this->_list._bind_size_v = core->sizeProviders()[bind_size_provider_name];
this->_list._bind_unit = core->extactors()[bind_unit_name];
QString bind_provider_expr = "";
STRING_SAVE(bind_provider_expr);
if (this->_list._bind_size_v)
this->_list._bind_size_v->setExpression(bind_provider_expr);
}
void BytesAsList::saveTo(QJsonObject& obj) const
{
INT32_SAVE(_list._bytes_offset);
QString bind_unit_name = "";
if (this->_list._bind_unit)
bind_unit_name = this->_list._bind_unit->name();
STRING_SAVE(bind_unit_name);
INT32_SAVE(_list._bytes_offset);
QString bind_size_provider_name = "";
QString bind_provider_expr = "";
if (this->_list._bind_size_v) {
@ -425,9 +434,11 @@ QVariant BytesAsUnion::parse(const QByteArray& bytes) const
return QVariant();
}
void BytesAsUnion::loadFrom(const QJsonObject& obj)
void BytesAsUnion::loadFrom(
std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
throw std::logic_error("The method or operation is not implemented.");
INT32_PEAK(_union.byte_count);
INT32_PEAK(_union.byte_offset);
}
void BytesAsUnion::saveTo(QJsonObject& obj) const
@ -446,7 +457,7 @@ QList<std::shared_ptr<RuleMatch>> BytesAsUnion::elementRules() const
return _union._rule_list;
}
bool BytesAsUnion::setElementRule(std::shared_ptr<RuleMatch> u)
bool BytesAsUnion::appendElementRule(std::shared_ptr<RuleMatch> u)
{
this->_union._rule_list << u;
return true;

View File

@ -96,7 +96,7 @@ namespace extract {
int countWithin() const override;
// Serializable ==============================
void loadFrom(const QJsonObject& obj) override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
};
@ -118,7 +118,7 @@ namespace extract {
public:
struct __Private {
QHash<int, QString> _switch_options;
} _combines;
} _combine;
BytesAsBitCombine();
@ -130,7 +130,7 @@ namespace extract {
QVariant parse(const QByteArray& bytes) const override;
// Serializable ==============================
void loadFrom(const QJsonObject& obj) override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
@ -184,7 +184,7 @@ namespace extract {
QVariant parse(const QByteArray& bytes) const override;
// Serializable ==============================
void loadFrom(const QJsonObject& obj) override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
@ -217,7 +217,7 @@ namespace extract {
public:
bool setOffsetSpan(int value);
std::shared_ptr<ExtractUnit> elementRule() const;
bool setElementRule(std::shared_ptr<ExtractUnit> u);
bool appendElementRule(std::shared_ptr<ExtractUnit> u);
std::shared_ptr<SizeProvider> sizeProvider() const;
bool setSizeProvider(std::shared_ptr<SizeProvider> ins);
@ -227,7 +227,7 @@ namespace extract {
int offsetSpan() const override;
int countWithin() const override;
void loadFrom(const QJsonObject& obj) override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
QVariant parse(const QByteArray& bytes) const override;
@ -238,7 +238,7 @@ namespace extract {
class BytesAsUnion : public ExtractUnit {
public:
struct __Private {
int byte_offset, byte_count;
int byte_offset = 0, byte_count = 1;
QList<std::shared_ptr<RuleMatch>> _rule_list;
} _union;
@ -247,7 +247,7 @@ namespace extract {
void clearRules();
QList<std::shared_ptr<RuleMatch>> elementRules() const;
bool setElementRule(std::shared_ptr<RuleMatch> u);
bool appendElementRule(std::shared_ptr<RuleMatch> u);
public:
QString name() const override;
@ -257,11 +257,10 @@ namespace extract {
int countWithin() const override;
QVariant parse(const QByteArray& bytes) const override;
void loadFrom(const QJsonObject& obj) override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
std::shared_ptr<Serializable> newDefault() const override;
std::shared_ptr<Serializable> newDefault() const override;
};
}