#pragma once #include "extract_basic.h" #include "convert_basic.h" #include /// /// 范围字段获取上下文 /// class ScopeFieldsGetter { public: /// /// 绑定当前字段 /// /// /// virtual bool bindCurrent(const QString& unique_key) = 0; /// /// 获取本字段可用字段 /// /// virtual QHash prevFields() const = 0; }; /// /// 范围字段设置上下文 /// class ScopeFieldsSetter { public: /// /// 注册可用字段 /// /// /// virtual void setField(const QString& name, DataType type) = 0; }; // ================================================================ /// /// 解释环境数据上下文 /// class DataAccessContext { public: /// /// 设置本提取器解释数值 /// /// virtual void append(const QVariant& value) = 0; /// /// 通过unique_key获取解释期数据 /// /// /// virtual QVariant get(const QString& unique_key) const = 0; /// /// 关联上下文 /// /// /// virtual void setChild(const QString& field, std::shared_ptr inst) = 0; }; // ================================================================== /// /// 尺寸解析器 /// class SizeProvider : public Serializable { public: virtual void bindInput(std::shared_ptr inst) = 0; /// /// 解析器名称 /// /// virtual QString name() const = 0; /// /// 获取值,如果该值无法预先计算得知,返回-1 /// /// 尺寸值 virtual int32_t value(const QString& expr) const = 0; virtual void setExpression(const QString& expr) = 0; virtual QString expression() const = 0; }; // ==================================================================== /// /// 规则匹配器 /// class RuleMatch : public Serializable { public: virtual QString name() const = 0; virtual std::shared_ptr bindRule() const = 0; virtual void bindRule(std::shared_ptr rule) = 0; virtual bool checkpass(const QByteArray& buffer) const = 0; }; /// /// 翻译环境核心 /// class TranslateBasic { private: QHash> _extractor_types; std::shared_ptr _default_translate_rule = nullptr; QHash> _size_provider_types; std::shared_ptr _default_size_provider = nullptr; QHash> _rule_match_types; std::shared_ptr _default_rule_match = nullptr; QHash> _custom_rule_types; public: TranslateBasic(); std::shared_ptr defaultSizeProvider() const; QHash> sizeProviderList() const; std::shared_ptr defaultRuleMatch() const; QHash> ruleMatchList() const; std::shared_ptr defaultExtractUnit() const; QHash> extractUnitList() const; void setCustomRule(const QString& name, std::shared_ptr inst); void removeCustomRule(const QString& name); QHash> customRules() const; }; /// /// 常量数字提供 /// class ConstNumberProvider : public SizeProvider { public: struct __Private { QString _value_string; } _number; public: QString name() const override; void bindInput(std::shared_ptr 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 core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; /// /// 解释期数字提供器 /// class InterpretedNumberPrivider : public SizeProvider { public: struct __Private { QString _field_refer; std::shared_ptr _context_inst; } _refer; public: QString name() const override; void bindInput(std::shared_ptr 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 core, const QJsonObject& obj) override; void saveTo(QJsonObject& obj) const override; std::shared_ptr newDefault() const override; }; class ValueAccess : public DataAccessContext, std::enable_shared_from_this { public: struct __Private { QString _current_field = ""; QVariant _current_value; QHash> _children_context; } _cascade; void init(const QString& field, std::shared_ptr parent); void setChild(const QString& field, std::shared_ptr 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 _parent_setter; }_setter; public: FieldSetterLayer(const QString& self, std::shared_ptr instp); void setField(const QString& name, DataType type) override; };