QBinaryTranslate/TranslateUI/TranslateBasic.h

236 lines
6.4 KiB
C++

#pragma once
#include "extract_basic.h"
#include "convert_basic.h"
#include <QVariant>
#include <QList>
/// <summary>
/// 范围字段获取上下文
/// </summary>
class ScopeFieldsGetter {
public:
/// <summary>
/// 绑定当前字段
/// </summary>
/// <param typeAlias="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 typeAlias="typeAlias"></param>
/// <param typeAlias="type"></param>
virtual void setField(const QString& typeAlias, DataType type) = 0;
virtual void clear() = 0;
};
// ================================================================
/// <summary>
/// 解释环境数据上下文
/// </summary>
class DataContext {
public:
/// <summary>
/// 设置本提取器解释数值
/// </summary>
/// <param typeAlias="value"></param>
virtual void append(const QVariant& value) = 0;
/// <summary>
/// 通过unique_key获取解释期数据
/// </summary>
/// <param typeAlias="unique_key"></param>
/// <returns></returns>
virtual QVariant get(const QString& unique_key) const = 0;
/// <summary>
/// 关联上下文
/// </summary>
/// <param typeAlias="field"></param>
/// <param typeAlias="inst"></param>
virtual void setChild(const QString& field, std::shared_ptr<DataContext> inst) = 0;
/// <summary>
/// 获取数据序列
/// </summary>
/// <returns></returns>
virtual QList<QVariant> dataSeqs() const = 0;
};
// ==================================================================
/// <summary>
/// 尺寸解析器
/// </summary>
class SizeProvider : public Serializable {
public:
virtual void bindInput(std::shared_ptr<DataContext> 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 matchType() 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:
QHash<QString, std::shared_ptr<ExtractDelegate>> _basic_extractor_types;
QHash<QString, std::shared_ptr<ExtractDelegate>> _complex_extractor_types;
std::shared_ptr<ExtractDelegate> _default_translate_rule = nullptr;
QHash<QString, std::shared_ptr<SizeProvider>> _size_provider_types;
std::shared_ptr<SizeProvider> _default_size_provider = nullptr;
QHash<QString, std::shared_ptr<RuleMatch>> _rule_match_types;
std::shared_ptr<RuleMatch> _default_rule_match = nullptr;
QList<std::shared_ptr<ExtractDelegate>> _custom_rule_types;
public:
TranslateBasic();
std::shared_ptr<SizeProvider> defaultSizeProvider() const;
QHash<QString, std::shared_ptr<SizeProvider>> sizeProviderList() const;
std::shared_ptr<RuleMatch> defaultRuleMatch() const;
QHash<QString, std::shared_ptr<RuleMatch>> ruleMatchList() const;
std::shared_ptr<ExtractDelegate> defaultExtractUnit() const;
QHash<QString, std::shared_ptr<ExtractDelegate>> basicExtractors() const;
QHash<QString, std::shared_ptr<ExtractDelegate>> totalExtractors() const;
void addDelegate(std::shared_ptr<ExtractDelegate> inst);
void removeDelegate(const QString& alias);
void replaceDelegate(const QString &name, std::shared_ptr<ExtractDelegate> inst);
QList<QString> delegateAlias() const;
std::shared_ptr<ExtractDelegate> operator[](const QString &name) const;
};
namespace size_provider {
/// <summary>
/// 常量数字提供
/// </summary>
class ConstNumberProvider : public SizeProvider {
public:
struct __Private {
QString _value_string;
} _number;
public:
QString name() const override;
void bindInput(std::shared_ptr<DataContext> 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;
};
/// <summary>
/// 解释期数字提供器
/// </summary>
class InterpretedNumberPrivider : public SizeProvider {
public:
struct __Private {
QString _field_refer;
std::shared_ptr<DataContext> _context_inst;
} _refer;
public:
QString name() const override;
void bindInput(std::shared_ptr<DataContext> 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 ValueAccessContext : public DataContext,
public std::enable_shared_from_this<ValueAccessContext> {
public:
struct __Private {
QString _current_field = "";
QVariant _current_value;
QList<std::pair<QString, std::shared_ptr<DataContext>>> _children_context;
} _cascade;
void init(const QString& field, std::shared_ptr<DataContext> parent);
void setChild(const QString& field, std::shared_ptr<DataContext> inst) override;
void append(const QVariant& value) override;
QList<QVariant> dataSeqs() const override;
public:
QVariant get(const QString& unique_key) const override;
};
class FieldManagerLayer : public ScopeFieldsSetter, public ScopeFieldsGetter {
public:
struct __Private {
QString _rule_name;
std::shared_ptr<ScopeFieldsSetter> _parent_setter = nullptr;
static QList<std::pair<QString, DataType>> _fields_map;
}_setter;
bool bindCurrent(const QString& unique_key) override;
QHash<QString, DataType> prevFields() const override;
void clear() override;
public:
FieldManagerLayer(const QString& self, std::shared_ptr<ScopeFieldsSetter> instp);
void setField(const QString& typeAlias, DataType type) override;
};