WsParser_VS/libParse/parse_novel.h

110 lines
3.9 KiB
C++

#pragma once
#include "libparse.h"
#include <ast_novel.h>
#include <QtCore/QString>
#include <QtCore/QHash>
#include <memory>
namespace example_novel {
class PointGraphHelper;
/**
* @brief 根元素定义
*/
class LIBPARSE_EXPORT ElementsCache {
private:
QHash<QString, std::shared_ptr<const ast_gen::SyntaxElement>> node_cache;
public:
virtual void clearCache();
virtual std::shared_ptr<const ast_gen::SyntaxElement> appendToCache(std::shared_ptr<const ast_gen::SyntaxElement> named_node);
/**
* @brief 通过节点签名获取定义节点
* @param signature 完全签名
* @return
* @throws 没有指定节点抛出异常
*/
virtual std::shared_ptr<const ast_gen::SyntaxElement> getNamedNodeBy(int paramType, const QString& signature) const;
};
/**
* @brief 剧情存在性校验器.
*/
class LIBPARSE_EXPORT FragmentExistsCheck : public lib_parse::CheckProvider {
private:
std::shared_ptr<ElementsCache> _nodes_cache;
void nodes_regist(std::shared_ptr<ElementsCache> cache, std::shared_ptr<const ast_gen::ElementAccess> target);
void exists_check(std::shared_ptr<ElementsCache> cache, std::shared_ptr<const ast_gen::ElementAccess> target) const;
public:
// 通过 CheckProvider 继承
virtual QString name() const override;
virtual void validCheck(std::shared_ptr<const ast_gen::ElementAccess> root) const override;
};
/**
* @brief 情节节点校验.
*/
class LIBPARSE_EXPORT FragmentGraphCheck : public lib_parse::CheckProvider, public std::enable_shared_from_this<FragmentGraphCheck> {
private:
QHash<QString, std::shared_ptr<PointGraphHelper>> elements_store;
QList<std::shared_ptr<const PointGraphHelper>> fragments_sort_list;
QList<std::shared_ptr<PointGraphHelper>> refers_cycle_check(
std::shared_ptr<PointGraphHelper> item, QList<std::shared_ptr<PointGraphHelper>> prevs = QList<std::shared_ptr<PointGraphHelper>>()) const;
public:
void setElement(std::shared_ptr<PointGraphHelper> inst);
std::shared_ptr<PointGraphHelper> getElement(const QString &signature) const;
QList<std::shared_ptr<PointGraphHelper>> getHangoutNodes();
bool nodeDismantle(std::shared_ptr<PointGraphHelper> inst);
QList<std::shared_ptr<const PointGraphHelper>> fragmentsSequence() const;
// CheckProvider interface
public:
virtual void validCheck(std::shared_ptr<const ast_gen::ElementAccess> root) const override;
virtual QString name() const override;
};
class PointGraphHelper : public std::enable_shared_from_this<PointGraphHelper> {
private:
std::shared_ptr<const example_novel::PointDefines> node_peer;
QList<std::shared_ptr<PointGraphHelper>> next_nodes;
uint indegree = 0;
public:
PointGraphHelper(std::shared_ptr<const example_novel::PointDefines> node);
std::shared_ptr<const example_novel::PointDefines> nodePeer() const;
void appendNext(std::shared_ptr<PointGraphHelper> node);
QList<std::shared_ptr<PointGraphHelper>> nextList() const;
uint& inDegree();
};
/**
* @brief 故事线排序校验.
*/
class LIBPARSE_EXPORT StoryOrderCheck : public lib_parse::CheckProvider {
private:
uint sort_index = 1;
/**
* 获取合适的文档节点.
*
* \param pnode
* \return
*/
QList<std::shared_ptr<const ast_gen::ElementAccess>> valid_docs_peak(std::shared_ptr<const ast_gen::ElementAccess> pnode) const;
public:
// 通过 CheckProvider 继承
QString name() const override;
void validCheck(std::shared_ptr<const ast_gen::ElementAccess> root) const override;
};
} // namespace example_novel