添加Union、List、RuleSet

This commit is contained in:
codeboss 2025-08-03 08:04:12 +08:00
parent 22b308d215
commit 455834048c
4 changed files with 399 additions and 99 deletions

View File

@ -31,6 +31,12 @@ TranslateBasic::TranslateBasic()
u_ptr = std::make_shared<BytesAsList>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsUnion>();
_extractor_types[u_ptr->name()] = u_ptr;
u_ptr = std::make_shared<BytesAsRuleSet>();
_extractor_types[u_ptr->name()] = u_ptr;
// size-provider type-list
auto sz_ptr = std::make_shared<ConstNumberProvider>();
this->_default_size_provider = sz_ptr;
@ -57,6 +63,21 @@ QHash<QString, std::shared_ptr<ExtractUnit>> TranslateBasic::extractUnitList() c
return _extractor_types;
}
void TranslateBasic::setCustomRule(const QString& name, std::shared_ptr<ExtractUnit> inst)
{
this->_extractor_types[name] = inst;
}
void TranslateBasic::removeCustomRule(const QString& name)
{
_extractor_types.remove(name);
}
QHash<QString, std::shared_ptr<RuleMatch>> TranslateBasic::customRules() const
{
return this->_custom_rule_types;
}
QHash<QString, std::shared_ptr<SizeProvider>> TranslateBasic::sizeProviderList() const
{
return _size_provider_types;
@ -67,6 +88,11 @@ QHash<QString, std::shared_ptr<RuleMatch>> TranslateBasic::ruleMatchList() const
return _rule_match_types;
}
void ConstNumberProvider::bindInput(std::shared_ptr<DataAccessContext> inst)
{
}
QString ConstNumberProvider::name() const
{
return NAME(ConstNumberProvider);
@ -101,3 +127,91 @@ std::shared_ptr<Serializable> ConstNumberProvider::newDefault() const
{
return std::make_shared<ConstNumberProvider>();
}
void InterpretedNumberPrivider::bindInput(std::shared_ptr<DataAccessContext> inst)
{
this->_refer._context_inst = inst;
}
QString InterpretedNumberPrivider::name() const
{
return NAME(InterpretedNumberPrivider);
}
#include <QMetaType>
int32_t InterpretedNumberPrivider::value(const QString& expr) const
{
auto value = this->_refer._context_inst->get(expr);
if (value.userType() == QMetaType::Int)
return value.toInt();
return 0;
}
void InterpretedNumberPrivider::setExpression(const QString& expr)
{
this->_refer._field_refer = expr;
}
QString InterpretedNumberPrivider::expression() const
{
return this->_refer._field_refer;
}
void InterpretedNumberPrivider::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
STRING_PEAK(this->_refer._field_refer, obj);
}
void InterpretedNumberPrivider::saveTo(QJsonObject& obj) const
{
STRING_SAVE(this->_refer._field_refer, obj);
}
std::shared_ptr<Serializable> InterpretedNumberPrivider::newDefault() const
{
return std::make_shared<InterpretedNumberPrivider>();
}
void ValueAccess::init(const QString& field, std::shared_ptr<DataAccessContext> parent)
{
this->_cascade._current_field = field;
if (parent)
parent->setChild(field, this->shared_from_this());
}
void ValueAccess::setChild(const QString& field, std::shared_ptr<DataAccessContext> inst)
{
this->_cascade._children_context[field] = inst;
}
void ValueAccess::append(const QVariant& value)
{
this->_cascade._current_value = value;
}
QVariant ValueAccess::get(const QString& unique_key) const
{
if (_cascade._current_field == unique_key)
return _cascade._current_value;
for (auto unit : _cascade._children_context)
{
auto value = unit->get(unique_key);
if (value.isValid())
return value;
}
return QVariant();
}
FieldSetterLayer::FieldSetterLayer(const QString& self, std::shared_ptr<ScopeFieldsSetter> instp)
{
_setter._rule_name = self;
_setter._parent_setter = instp;
}
void FieldSetterLayer::setField(const QString& name, DataType type)
{
_setter._parent_setter->setField(QString("%1.%2").arg(_setter._rule_name, name), type);
}

View File

@ -2,10 +2,102 @@
#include "extract_basic.h"
#include "convert_basic.h"
#include <QVariant>
/// <summary>
/// キュメ<EFBDAD>フミ<EFBE8C>ヒミト
/// 范围字段获取上下文
/// </summary>
class ScopeFieldsGetter {
public:
/// <summary>
/// 绑定当前字段
/// </summary>
/// <param name="unique_key"></param>
/// <returns></returns>
virtual bool bindCurrent(const QString& unique_key) = 0;
/// <summary>
/// 获取本字段可用字段
/// </summary>
/// <returns></returns>
virtual QHash<QString, DataType> prevFields() const = 0;
};
/// <summary>
/// 范围字段设置上下文
/// </summary>
class ScopeFieldsSetter {
public:
/// <summary>
/// 注册可用字段
/// </summary>
/// <param name="name"></param>
/// <param name="type"></param>
virtual void setField(const QString& name, DataType type) = 0;
};
// ================================================================
/// <summary>
/// 解释环境数据上下文
/// </summary>
class DataAccessContext {
public:
/// <summary>
/// 设置本提取器解释数值
/// </summary>
/// <param name="value"></param>
virtual void append(const QVariant& value) = 0;
/// <summary>
/// 通过unique_key获取解释期数据
/// </summary>
/// <param name="unique_key"></param>
/// <returns></returns>
virtual QVariant get(const QString& unique_key) const = 0;
/// <summary>
/// 关联上下文
/// </summary>
/// <param name="field"></param>
/// <param name="inst"></param>
virtual void setChild(const QString& field, std::shared_ptr<DataAccessContext> inst) = 0;
};
// ==================================================================
/// <summary>
/// 尺寸解析器
/// </summary>
class SizeProvider : public Serializable {
public:
virtual void bindInput(std::shared_ptr<DataAccessContext> inst) = 0;
/// <summary>
/// 解析器名称
/// </summary>
/// <returns></returns>
virtual QString name() const = 0;
/// <summary>
/// 获取值,如果该值无法预先计算得知,返回-1
/// </summary>
/// <returns>尺寸值</returns>
virtual int32_t value(const QString& expr) const = 0;
virtual void setExpression(const QString& expr) = 0;
virtual QString expression() const = 0;
};
// ====================================================================
/// <summary>
/// 规则匹配器
/// </summary>
class RuleMatch : public Serializable {
public:
virtual QString name() const = 0;
virtual std::shared_ptr<ExtractUnit> bindRule() const = 0;
virtual void bindRule(std::shared_ptr<ExtractUnit> rule) = 0;
virtual bool checkpass(const QByteArray& buffer) const = 0;
};
/// <summary>
/// 翻译环境核心
/// </summary>
class TranslateBasic {
private:
@ -18,6 +110,8 @@ private:
QHash<QString, std::shared_ptr<RuleMatch>> _rule_match_types;
std::shared_ptr<RuleMatch> _default_rule_match = nullptr;
QHash<QString, std::shared_ptr<RuleMatch>> _custom_rule_types;
public:
TranslateBasic();
@ -28,17 +122,27 @@ public:
std::shared_ptr<ExtractUnit> defaultExtractUnit() const;
QHash<QString, std::shared_ptr<ExtractUnit>> extractUnitList() const;
void setCustomRule(const QString &name, std::shared_ptr<ExtractUnit> inst);
void removeCustomRule(const QString &name);
QHash<QString, std::shared_ptr<RuleMatch>> customRules() const;
};
/// <summary>
/// 常量数字提供
/// </summary>
class ConstNumberProvider : public SizeProvider {
public:
struct __Private {
QString _value_string;
} _number;
public:
QString name() const override;
void bindInput(std::shared_ptr<DataAccessContext> inst) override;
int32_t value(const QString& expr) const override;
void setExpression(const QString& expr) override;
QString expression() const override;
@ -48,3 +152,62 @@ public:
std::shared_ptr<Serializable> newDefault() const override;
};
/// <summary>
/// 解释期数字提供器
/// </summary>
class InterpretedNumberPrivider : public SizeProvider {
public:
struct __Private {
QString _field_refer;
std::shared_ptr<DataAccessContext> _context_inst;
} _refer;
public:
QString name() const override;
void bindInput(std::shared_ptr<DataAccessContext> inst) override;
int32_t value(const QString& expr) const override;
void setExpression(const QString& expr) override;
QString expression() const 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;
};
class ValueAccess : public DataAccessContext,
std::enable_shared_from_this<ValueAccess> {
public:
struct __Private {
QString _current_field = "";
QVariant _current_value;
QHash<QString, std::shared_ptr<DataAccessContext>> _children_context;
} _cascade;
void init(const QString& field, std::shared_ptr<DataAccessContext> parent);
void setChild(const QString& field, std::shared_ptr<DataAccessContext> inst) override;
void append(const QVariant& value) override;
public:
QVariant get(const QString& unique_key) const override;
};
class FieldSetterLayer : public ScopeFieldsSetter {
public:
struct __Private {
QString _rule_name;
std::shared_ptr<ScopeFieldsSetter> _parent_setter;
}_setter;
public:
FieldSetterLayer(const QString &self, std::shared_ptr<ScopeFieldsSetter> instp);
void setField(const QString& name, DataType type) override;
};

View File

@ -55,18 +55,24 @@ void AbstractExtractor::saveTo(QJsonObject& obj) const
INT32_SAVE(_abs_data.byte_count, obj);
}
void AbstractExtractor::registSubField(std::shared_ptr<ScopeFieldsSetter> inst)
{
}
BytesAsHex::BytesAsHex()
: AbstractExtractor(NAME(BytesAsHex), DataType::TextString) {
setCountWithin(1);
}
QVariant BytesAsHex::parse(const QByteArray& bytes) const
#include "TranslateBasic.h"
void BytesAsHex::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
QString result;
for (auto char_v : bytes) {
result += QString("%1").arg(char_v, 2, 16, QChar('0'));
}
return result;
out->append(result);
}
std::shared_ptr<Serializable> BytesAsHex::newDefault() const
@ -99,7 +105,7 @@ void BytesAsBitCombine::clearOptions()
_combine._switch_options.clear();
}
QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
void BytesAsBitCombine::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
auto keys = _combine._switch_options.keys();
std::sort(keys.begin(), keys.end());
@ -114,7 +120,7 @@ QVariant BytesAsBitCombine::parse(const QByteArray& bytes) const
else
result += QString("%1<%2>;").arg(_combine._switch_options[idx], "N");
}
return result;
out->append(result);
}
#include <QJsonArray>
@ -168,7 +174,7 @@ bool BytesAsInteger::setCountWithin(int bytes)
return AbstractExtractor::setCountWithin(bytes);
}
QVariant BytesAsInteger::parse(const QByteArray& bytes) const
void BytesAsInteger::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
auto last = bytes[bytes.size() - 1];
auto mark = last == 0 ? 0 : last / std::abs(last);
@ -187,9 +193,9 @@ QVariant BytesAsInteger::parse(const QByteArray& bytes) const
value = value << 8;
value += (uchar)vchar;
}
return *((long long*)(&value));
}
out->append(*((long long*)(&value)));
}
#include <QTextCodec>
@ -208,9 +214,10 @@ QString BytesAsString::codecName() const
return this->_strings._conv_with->name();
}
QVariant BytesAsString::parse(const QByteArray& bytes) const
void BytesAsString::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
return _strings._conv_with->toUnicode(bytes);
auto v = _strings._conv_with->toUnicode(bytes);
out->append(v);
}
void BytesAsString::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
@ -235,9 +242,9 @@ std::shared_ptr<Serializable> BytesAsString::newDefault() const
return std::make_shared<BytesAsString>();
}
QVariant BytesAsFloat::parse(const QByteArray& bytes) const
void BytesAsFloat::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
return *((float*)bytes.data());
out->append(*((float*)bytes.data()));
}
std::shared_ptr<Serializable> BytesAsFloat::newDefault() const
@ -256,9 +263,9 @@ std::shared_ptr<Serializable> BytesAsDouble::newDefault() const
return std::make_shared<BytesAsDouble>();
}
QVariant BytesAsDouble::parse(const QByteArray& bytes) const
void BytesAsDouble::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
return *((double*)bytes.data());
out->append(*((double*)bytes.data()));
}
BytesAsDouble::BytesAsDouble()
@ -279,7 +286,7 @@ bool BytesAsUnsigned::setCountWithin(int bytes)
return AbstractExtractor::setCountWithin(count);
}
QVariant BytesAsUnsigned::parse(const QByteArray& bytes) const
void BytesAsUnsigned::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
unsigned long long value = 0;
for (auto vidx = bytes.size() - 1; vidx >= 0; vidx--) {
@ -287,7 +294,7 @@ QVariant BytesAsUnsigned::parse(const QByteArray& bytes) const
value = value << 8;
value += (uchar)vchar;
}
return value;
out->append(value);
}
std::shared_ptr<Serializable> BytesAsUnsigned::newDefault() const
@ -405,21 +412,19 @@ void BytesAsList::saveTo(QJsonObject& obj) const
OBJECT_SAVE(size_provider_obj, obj);
}
QVariant BytesAsList::parse(const QByteArray& bytes) const
void BytesAsList::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
QVariantList value_list;
auto expr = this->_list._bind_size_v->expression();
auto size_value = this->_list._bind_size_v->value(expr);
auto unit_size = this->_list._bind_unit->countWithin();
for (auto idx = 0; idx < size_value; ++idx) {
auto secn = bytes.mid(unit_size * idx, unit_size);
auto value_v = this->_list._bind_unit->parse(secn);
value_list << value_v;
}
return value_list;
auto slice_context = std::make_shared<ValueAccess>();
slice_context->init(QString("ls<%1>").arg(idx), out);
this->_list._bind_unit->parse(secn, slice_context);
}
}
std::shared_ptr<Serializable> BytesAsList::newDefault() const
@ -427,6 +432,13 @@ std::shared_ptr<Serializable> BytesAsList::newDefault() const
return std::make_shared<BytesAsList>();
}
void BytesAsList::registSubField(std::shared_ptr<ScopeFieldsSetter> inst)
{
inst->setField("ls", this->_list._bind_unit->outType());
auto layer = std::make_shared<FieldSetterLayer>("ls", inst);
this->_list._bind_unit->registSubField(layer);
}
QString BytesAsUnion::name() const
{
return NAME(BytesAsUnion);
@ -447,13 +459,14 @@ int BytesAsUnion::countWithin() const
return _union.byte_count;
}
QVariant BytesAsUnion::parse(const QByteArray& bytes) const
void BytesAsUnion::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
for (auto u : this->elementRules())
if (u->checkpass(bytes))
return u->bindRule()->parse(bytes);
return QVariant();
if (u->checkpass(bytes)) {
auto enum_context = std::make_shared<ValueAccess>();
enum_context->init(u->name(), out);
u->bindRule()->parse(bytes, enum_context);
}
}
void BytesAsUnion::loadFrom(
@ -535,43 +548,68 @@ bool BytesAsUnion::setOffsetSpan(int value)
return true;
}
void extract::BytesAsSubRule::setActualName(const QString& name)
void BytesAsUnion::registSubField(std::shared_ptr<ScopeFieldsSetter> inst)
{
this->_rules._actual_name = name;
for (auto rl : this->_union._rule_list) {
inst->setField(rl->name(), rl->bindRule()->outType());
auto layer = std::make_shared<FieldSetterLayer>(rl->name(), inst);
rl->bindRule()->registSubField(layer);
}
}
QString BytesAsSubRule::name() const
void BytesAsRuleSet::registSubField(std::shared_ptr<ScopeFieldsSetter> inst)
{
return this->_rules._actual_name;
for (auto rl_key : this->_rules._sub_rules.keys()){
auto rlinst = this->_rules._sub_rules[rl_key];
inst->setField(rl_key, rlinst->outType());
auto layer = std::make_shared<FieldSetterLayer>(rl_key, inst);
rlinst->registSubField(layer);
}
}
DataType BytesAsSubRule::outType() const
void BytesAsRuleSet::parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const
{
auto bufx = bytes;
for (auto keym : this->_rules._sub_rules.keys()) {
auto rule_context = std::make_shared<ValueAccess>();
rule_context->init(keym, out);
auto rule = this->_rules._sub_rules[keym];
bufx = bufx.mid(rule->offsetSpan());
auto count = rule->countWithin();
auto secx = bufx.mid(0, count);
rule->parse(secx, rule_context);
bufx = bufx.mid(count);
}
}
QString BytesAsRuleSet::name() const
{
return NAME(BytesAsRuleSet);
}
DataType BytesAsRuleSet::outType() const
{
return DataType::SUB_RULE;
}
bool BytesAsSubRule::setOffsetSpan(int bytes)
bool BytesAsRuleSet::setOffsetSpan(int bytes)
{
this->_rules._byte_offset = bytes;
return true;
}
int BytesAsSubRule::offsetSpan() const
int BytesAsRuleSet::offsetSpan() const
{
return this->_rules._byte_offset;
}
int BytesAsSubRule::countWithin() const
int BytesAsRuleSet::countWithin() const
{
return this->_rules._byte_count;
}
QVariant BytesAsSubRule::parse(const QByteArray& bytes) const
{
throw std::logic_error("The method or operation is not implemented.");
}
void BytesAsSubRule::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
void BytesAsRuleSet::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj)
{
INT32_PEAK(_rules._byte_count, obj);
INT32_PEAK(_rules._byte_offset, obj);
@ -581,26 +619,29 @@ void BytesAsSubRule::loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonO
for (auto index = 0; index < array.size(); ++index) {
auto rule_obj = array.at(index);
QString match_name;
QString match_name, key;
QJsonObject match_obj;
STRING_PEAK(match_name, rule_obj);
STRING_PEAK(key, rule_obj);
OBJECT_PEAK(match_obj, rule_obj);
auto xdev = core->extractUnitList()[match_name]->newDefault();
xdev->loadFrom(core, match_obj);
_rules._sub_rules.append(std::dynamic_pointer_cast<ExtractUnit>(xdev));
_rules._sub_rules[key] = std::dynamic_pointer_cast<ExtractUnit>(xdev);
}
}
void BytesAsSubRule::saveTo(QJsonObject& obj) const
void BytesAsRuleSet::saveTo(QJsonObject& obj) const
{
INT32_SAVE(_rules._byte_count, obj);
INT32_SAVE(_rules._byte_offset, obj);
QJsonArray array;
for (auto info : _rules._sub_rules) {
for (auto key : _rules._sub_rules.keys()) {
QJsonObject rule_obj, match_obj;
auto info = _rules._sub_rules[key];
STRING_SAVE(key, rule_obj);
QString match_name = info->name();
STRING_SAVE(match_name, rule_obj);
info->saveTo(match_obj);
@ -611,7 +652,7 @@ void BytesAsSubRule::saveTo(QJsonObject& obj) const
ARRAY_SAVE(array, obj);
}
std::shared_ptr<Serializable> BytesAsSubRule::newDefault() const
std::shared_ptr<Serializable> BytesAsRuleSet::newDefault() const
{
return std::make_shared<BytesAsSubRule>();
return std::make_shared<BytesAsRuleSet>();
}

View File

@ -3,12 +3,17 @@
#include "common.h"
#include <QHash>
class SizeProvider;
class RuleMatch;
class ScopeFieldsSetter;
class DataAccessContext;
/// <summary>
/// 럇陋데禱녜蹶쌈왯
/// </summary>
class ExtractUnit : public Serializable {
public:
virtual ~ExtractUnit() = default;
/// <summary>
/// 데禱츰냔
@ -16,6 +21,12 @@ public:
/// <returns></returns>
virtual QString name() const = 0;
/// <summary>
/// ×¢²á×ÔÉí
/// </summary>
/// <param name="inst"></param>
virtual void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) = 0;
/// <summary>
///
/// </summary>
@ -42,37 +53,9 @@ public:
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
virtual QVariant parse(const QByteArray& bytes) const = 0;
virtual void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const = 0;
};
/// <summary>
/// 尺寸解析器
/// </summary>
class SizeProvider : public Serializable {
public:
virtual QString name() const = 0;
/// <summary>
/// 获取值,如果该值无法预先计算得知,返回-1
/// </summary>
/// <returns>尺寸值</returns>
virtual int32_t value(const QString& expr) const = 0;
virtual void setExpression(const QString& expr) = 0;
virtual QString expression() const = 0;
};
/// <summary>
/// 规则匹配器
/// </summary>
class RuleMatch : public Serializable {
public:
virtual QString name() const = 0;
virtual std::shared_ptr<ExtractUnit> bindRule() const = 0;
virtual void bindRule(std::shared_ptr<ExtractUnit> rule) = 0;
virtual bool checkpass(const QByteArray& buffer) const = 0;
};
namespace extract {
class AbstractExtractor : public ExtractUnit {
public:
@ -87,6 +70,7 @@ namespace extract {
// ExtractUnit ===========================
QString name() const override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override;
virtual DataType outType() const;
/// <summary>
/// <20>零튤盧俚쌘鑒좆
@ -108,7 +92,7 @@ namespace extract {
public:
BytesAsHex();
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
@ -128,7 +112,7 @@ namespace extract {
virtual void clearOptions();
// ExtractUnit ============================
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
// Serializable ==============================
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
@ -145,7 +129,7 @@ namespace extract {
// ExtractUnit ============================
bool setCountWithin(int bytes) override;
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
// Serializable ==============================
std::shared_ptr<Serializable> newDefault() const override;
@ -160,7 +144,7 @@ namespace extract {
// ExtractUnit ============================
bool setCountWithin(int bytes) override;
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
// Serializable ==============================
std::shared_ptr<Serializable> newDefault() const override;
@ -182,7 +166,7 @@ namespace extract {
QString codecName() const;
// ExtractUnit ============================
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
// Serializable ==============================
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
@ -194,7 +178,7 @@ namespace extract {
public:
BytesAsFloat();
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
@ -202,7 +186,7 @@ namespace extract {
public:
BytesAsDouble();
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
@ -224,6 +208,7 @@ namespace extract {
public:
QString name() const override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override;
DataType outType() const override;
int offsetSpan() const override;
int countWithin() const override;
@ -231,7 +216,7 @@ namespace extract {
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
std::shared_ptr<Serializable> newDefault() const override;
};
@ -252,12 +237,13 @@ namespace extract {
public:
QString name() const override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override;
DataType outType() const override;
bool setOffsetSpan(int value);
int offsetSpan() const override;
int countWithin() const override;
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;
@ -265,19 +251,16 @@ namespace extract {
};
class BytesAsSubRule : public ExtractUnit {
class BytesAsRuleSet : public ExtractUnit {
public:
struct __Private {
int _byte_offset = 0, _byte_count = 1;
QList<std::shared_ptr<ExtractUnit>> _sub_rules;
QString _actual_name;
QHash<QString, std::shared_ptr<ExtractUnit>> _sub_rules;
}_rules;
void setActualName(const QString &name);
public:
QString name() const override;
void registSubField(std::shared_ptr<ScopeFieldsSetter> inst) override;
DataType outType() const override;
bool setOffsetSpan(int bytes) override;
int offsetSpan() const override;
@ -285,8 +268,7 @@ namespace extract {
std::shared_ptr<Serializable> newDefault() const override;
QVariant parse(const QByteArray& bytes) const override;
void parse(const QByteArray& bytes, std::shared_ptr<DataAccessContext> out) const override;
void loadFrom(std::shared_ptr<TranslateBasic> core, const QJsonObject& obj) override;
void saveTo(QJsonObject& obj) const override;