This commit is contained in:
codeboss 2025-08-05 20:51:12 +08:00
parent 818ebc219d
commit c51ead0f01
6 changed files with 51 additions and 44 deletions

View File

@ -36,7 +36,7 @@ void IntDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewIt
void RuleSetCustom::targetRuleRefresh(const QModelIndex& idx) void RuleSetCustom::targetRuleRefresh(const QModelIndex& idx)
{ {
auto rule_insv = _view._ruleset->_bind[idx.row()]; auto rule_insv = (*_view._ruleset)[idx.row()];
auto offset_index = idx.sibling(idx.row(), 1); auto offset_index = idx.sibling(idx.row(), 1);
auto offset_number = offset_index.data(Qt::DisplayRole).toInt(); auto offset_number = offset_index.data(Qt::DisplayRole).toInt();
@ -65,7 +65,7 @@ void RuleSetCustom::peersRuleChanged(const QModelIndex& idx)
auto rule_nm = _view.base->extractUnitList()[rule_name]; auto rule_nm = _view.base->extractUnitList()[rule_name];
auto new_inst = std::dynamic_pointer_cast<ExtractUnit>(rule_nm->newDefault()); auto new_inst = std::dynamic_pointer_cast<ExtractUnit>(rule_nm->newDefault());
_view._ruleset->_bind.replace(idx.row(), std::make_pair(field_name, new_inst)); _view._ruleset->replace(idx.row(), std::make_pair(field_name, new_inst));
// ¶ÔListUnitÖ´ÐÐÌØÊâ³õʼ»¯²½Öè // ¶ÔListUnitÖ´ÐÐÌØÊâ³õʼ»¯²½Öè
if (typeid(*new_inst.get()) == typeid(BytesAsList)) { if (typeid(*new_inst.get()) == typeid(BytesAsList)) {
@ -117,7 +117,7 @@ RuleSetCustom::RuleSetCustom(std::shared_ptr<TranslateBasic> base,
if (!curr.isValid()) if (!curr.isValid())
return; return;
emit this->currentRuleChanged(_view._ruleset->_bind[curr.row()].second, curr); emit this->currentRuleChanged(_view._ruleset->operator[](curr.row()).second, curr);
}); });
} }
@ -133,8 +133,8 @@ void RuleSetCustom::customTranslateRuleEdit(const QPoint& pos)
void RuleSetCustom::addTranslateUnit() void RuleSetCustom::addTranslateUnit()
{ {
auto curr_rule = _view.base->defaultExtractUnit()->newDefault(); auto curr_rule = _view.base->defaultExtractUnit()->newDefault();
this->_view._ruleset->_bind.append( this->_view._ruleset->append(
QString(u8"rule_%1").arg(_view._ruleset->_bind.sub_units.size()), QString(u8"rule_%1").arg(_view._ruleset->memberCount()),
std::static_pointer_cast<ExtractUnit>(curr_rule)); std::static_pointer_cast<ExtractUnit>(curr_rule));
auto hex_rule = std::static_pointer_cast<BytesAsHex>(curr_rule); auto hex_rule = std::static_pointer_cast<BytesAsHex>(curr_rule);
@ -149,7 +149,7 @@ void RuleSetCustom::removeTranslateUnit()
if (!idx_curr.isValid()) if (!idx_curr.isValid())
return; return;
_view._ruleset->_bind.removeAt(idx_curr.row()); _view._ruleset->removeAt(idx_curr.row());
_view._seqs_model->removeRow(idx_curr.row()); _view._seqs_model->removeRow(idx_curr.row());
} }
@ -157,9 +157,8 @@ void RuleSetCustom::membersPresent(std::shared_ptr<extract::BytesAsRuleSet> rule
{ {
model->removeRows(0, model->rowCount()); model->removeRows(0, model->rowCount());
auto units = ruleset->_bind.sub_units; for (auto uidx = 0; uidx < ruleset->memberCount(); ++uidx) {
for (auto uidx = 0; uidx < units.size(); ++uidx) { auto u_pair = ruleset->operator[](uidx);
auto u_pair = units.at(uidx);
QList<QStandardItem*> new_row; QList<QStandardItem*> new_row;
new_row << new QStandardItem(u_pair.first); new_row << new QStandardItem(u_pair.first);

View File

@ -86,7 +86,7 @@ void StructuralRuleView::cacheRefresh(const QModelIndex& curr, ListUnitConfigura
auto field_idx = curr.sibling(curr.row(), 0); auto field_idx = curr.sibling(curr.row(), 0);
this->_current_fields_cache->bindCurrent(field_idx.data(Qt::DisplayRole).toString()); this->_current_fields_cache->bindCurrent(field_idx.data(Qt::DisplayRole).toString());
auto ins = this->_rule_base->_bind[curr.row()]; auto ins = this->_rule_base->operator[](curr.row());
auto conv = std::dynamic_pointer_cast<extract::BytesAsList>(ins.second); auto conv = std::dynamic_pointer_cast<extract::BytesAsList>(ins.second);
if (conv) { if (conv) {
t->currentRuleAccept(conv, curr, this->_current_fields_cache); t->currentRuleAccept(conv, curr, this->_current_fields_cache);

View File

@ -195,7 +195,7 @@ std::shared_ptr<Serializable> InterpretedNumberPrivider::newDefault() const
return std::make_shared<InterpretedNumberPrivider>(); return std::make_shared<InterpretedNumberPrivider>();
} }
void ValueAccess::init(const QString& field, std::shared_ptr<DataAccessContext> parent) void ValueAccessContext::init(const QString& field, std::shared_ptr<DataAccessContext> parent)
{ {
this->_cascade._current_field = field; this->_cascade._current_field = field;
@ -203,17 +203,17 @@ void ValueAccess::init(const QString& field, std::shared_ptr<DataAccessContext>
parent->setChild(field, this->shared_from_this()); parent->setChild(field, this->shared_from_this());
} }
void ValueAccess::setChild(const QString& field, std::shared_ptr<DataAccessContext> inst) void ValueAccessContext::setChild(const QString& field, std::shared_ptr<DataAccessContext> inst)
{ {
this->_cascade._children_context[field] = inst; this->_cascade._children_context[field] = inst;
} }
void ValueAccess::append(const QVariant& value) void ValueAccessContext::append(const QVariant& value)
{ {
this->_cascade._current_value = value; this->_cascade._current_value = value;
} }
QVariant ValueAccess::get(const QString& unique_key) const QVariant ValueAccessContext::get(const QString& unique_key) const
{ {
if (_cascade._current_field == unique_key) if (_cascade._current_field == unique_key)
return _cascade._current_value; return _cascade._current_value;

View File

@ -184,7 +184,8 @@ namespace size_provider {
}; };
} }
class ValueAccess : public DataAccessContext, std::enable_shared_from_this<ValueAccess> { class ValueAccessContext : public DataAccessContext,
public std::enable_shared_from_this<ValueAccessContext> {
public: public:
struct __Private { struct __Private {
QString _current_field = ""; QString _current_field = "";

View File

@ -421,7 +421,7 @@ void BytesAsList::parse(const QByteArray& bytes, std::shared_ptr<DataAccessConte
for (auto idx = 0; idx < size_value; ++idx) { for (auto idx = 0; idx < size_value; ++idx) {
auto secn = bytes.mid(unit_size * idx, unit_size); auto secn = bytes.mid(unit_size * idx, unit_size);
auto slice_context = std::make_shared<ValueAccess>(); auto slice_context = std::make_shared<ValueAccessContext>();
slice_context->init(QString("ls<%1>").arg(idx), out); slice_context->init(QString("ls<%1>").arg(idx), out);
this->_list._bind_unit->parse(secn, slice_context); this->_list._bind_unit->parse(secn, slice_context);
} }
@ -463,7 +463,7 @@ void BytesAsUnion::parse(const QByteArray& bytes, std::shared_ptr<DataAccessCont
{ {
for (auto u : this->elementRules()) for (auto u : this->elementRules())
if (u->checkpass(bytes)) { if (u->checkpass(bytes)) {
auto enum_context = std::make_shared<ValueAccess>(); auto enum_context = std::make_shared<ValueAccessContext>();
enum_context->init(u->name(), out); enum_context->init(u->name(), out);
u->bindRule()->parse(bytes, enum_context); u->bindRule()->parse(bytes, enum_context);
} }
@ -559,8 +559,8 @@ void BytesAsUnion::registSubField(std::shared_ptr<ScopeFieldsSetter> inst)
void BytesAsRuleSet::registSubField(std::shared_ptr<ScopeFieldsSetter> inst) void BytesAsRuleSet::registSubField(std::shared_ptr<ScopeFieldsSetter> inst)
{ {
for (auto rl_key : this->_bind.fieldNames()){ for (auto rl_key : this->fieldNames()){
auto rlinst = this->_bind[rl_key]; auto rlinst = (*this)[rl_key];
inst->setField(rl_key, rlinst->outType()); inst->setField(rl_key, rlinst->outType());
auto layer = std::make_shared<FieldManagerLayer>(rl_key, inst); auto layer = std::make_shared<FieldManagerLayer>(rl_key, inst);
rlinst->registSubField(layer); rlinst->registSubField(layer);
@ -570,11 +570,11 @@ void BytesAsRuleSet::registSubField(std::shared_ptr<ScopeFieldsSetter> inst)
void BytesAsRuleSet::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const void BytesAsRuleSet::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{ {
auto bufx = bytes; auto bufx = bytes;
for (auto keym : this->_bind.fieldNames()) { for (auto keym : this->fieldNames()) {
auto rule_context = std::make_shared<ValueAccess>(); auto rule_context = std::make_shared<ValueAccessContext>();
rule_context->init(keym, out); rule_context->init(keym, out);
auto rule = this->_bind[keym]; auto rule = (*this)[keym];
bufx = bufx.mid(rule->offsetSpan()); bufx = bufx.mid(rule->offsetSpan());
auto count = rule->countWithin(); auto count = rule->countWithin();
auto secx = bufx.mid(0, count); auto secx = bufx.mid(0, count);
@ -658,39 +658,39 @@ std::shared_ptr<Serializable> BytesAsRuleSet::newDefault() const
return std::make_shared<BytesAsRuleSet>(); return std::make_shared<BytesAsRuleSet>();
} }
std::pair<QString, std::shared_ptr<ExtractUnit>> BytesAsRuleSet::__Private::operator[](int index) const std::pair<QString, std::shared_ptr<ExtractUnit>> BytesAsRuleSet::operator[](int index) const
{ {
return this->sub_units[index]; return this->_bind.sub_units[index];
} }
void BytesAsRuleSet::__Private::replace(int index, std::pair<QString, std::shared_ptr<ExtractUnit>> inst) void BytesAsRuleSet::replace(int index, std::pair<QString, std::shared_ptr<ExtractUnit>> inst)
{ {
this->sub_units.replace(index, inst); this->_bind.sub_units.replace(index, inst);
} }
extract::BytesAsRuleSet::__Private& BytesAsRuleSet::__Private::append(const QString& nm, std::shared_ptr<ExtractUnit> u) extract::BytesAsRuleSet& BytesAsRuleSet::append(const QString& nm, std::shared_ptr<ExtractUnit> u)
{ {
this->sub_units.append(std::make_pair(nm, u)); this->_bind.sub_units.append(std::make_pair(nm, u));
return *this; return *this;
} }
void BytesAsRuleSet::__Private::removeAt(int index) void BytesAsRuleSet::removeAt(int index)
{ {
this->sub_units.removeAt(index); this->_bind.sub_units.removeAt(index);
} }
QList<QString> BytesAsRuleSet::__Private::fieldNames() const QList<QString> BytesAsRuleSet::fieldNames() const
{ {
QList<QString> fields_store; QList<QString> fields_store;
for (auto fpair : this->sub_units) { for (auto fpair : this->_bind.sub_units) {
fields_store << fpair.first; fields_store << fpair.first;
} }
return fields_store;; return fields_store;;
} }
std::shared_ptr<ExtractUnit> BytesAsRuleSet::__Private::operator[](const QString& field) const std::shared_ptr<ExtractUnit> BytesAsRuleSet::operator[](const QString& field) const
{ {
for (auto pair : this->sub_units) { for (auto pair : this->_bind.sub_units) {
if(pair.first == field) if(pair.first == field)
return pair.second; return pair.second;
} }
@ -707,3 +707,8 @@ QString BytesAsRuleSet::customName() const
{ {
return _bind._name_store; return _bind._name_store;
} }
int BytesAsRuleSet::memberCount() const
{
return _bind.sub_units.size();
}

View File

@ -69,7 +69,7 @@ namespace extract {
virtual bool setCountWithin(int bytes); virtual bool setCountWithin(int bytes);
// ExtractUnit =========================== // ExtractUnit ===========================
QString name() const override; QString name() const override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override; void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override;
virtual DataType outType() const; virtual DataType outType() const;
/// <summary> /// <summary>
@ -252,25 +252,27 @@ namespace extract {
class BytesAsRuleSet : public ExtractUnit { class BytesAsRuleSet : public ExtractUnit {
public: private:
struct __Private { struct __Private {
int _byte_offset = 0, _byte_count = 1; int _byte_offset = 0, _byte_count = 1;
QString _name_store; QString _name_store;
QList<std::pair<QString, std::shared_ptr<ExtractUnit>>> sub_units; QList<std::pair<QString, std::shared_ptr<ExtractUnit>>> sub_units;
QList<QString> fieldNames() const;
std::shared_ptr<ExtractUnit> operator[](const QString &field) const;
std::pair<QString, std::shared_ptr<ExtractUnit>> operator[](int index) const;
void replace(int index, std::pair<QString, std::shared_ptr<ExtractUnit>> inst);
void removeAt(int index);
__Private& append(const QString& nm, std::shared_ptr<ExtractUnit> u);
}_bind; }_bind;
public:
void setCustomName(const QString& name); void setCustomName(const QString& name);
QString customName() const; QString customName() const;
QList<QString> fieldNames() const;
std::shared_ptr<ExtractUnit> operator[](const QString& field) const;
int memberCount() const;
std::pair<QString, std::shared_ptr<ExtractUnit>> operator[](int index) const;
void replace(int index, std::pair<QString, std::shared_ptr<ExtractUnit>> inst);
void removeAt(int index);
BytesAsRuleSet& append(const QString& nm, std::shared_ptr<ExtractUnit> u);
public: public:
QString name() const override; QString name() const override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override; void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override;