#pragma once #include "libparse.h" #include #include #include #include namespace example_novel { class PointGraphHelper; /** * @brief 根元素定义 */ class LIBPARSE_EXPORT ElementsCache { private: QHash> node_cache; public: virtual void clearCache(); virtual std::shared_ptr appendToCache(std::shared_ptr named_node); /** * @brief 通过节点签名获取定义节点 * @param signature 完全签名 * @return * @throws 没有指定节点抛出异常 */ virtual std::shared_ptr getNamedNodeBy(int paramType, const QString& signature) const; }; /** * @brief 剧情存在性校验器. */ class LIBPARSE_EXPORT FragmentExistsCheck : public lib_parse::CheckProvider { private: std::shared_ptr _nodes_cache; void nodes_regist(std::shared_ptr cache, std::shared_ptr target); void exists_check(std::shared_ptr cache, std::shared_ptr target) const; public: FragmentExistsCheck(); // 通过 CheckProvider 继承 virtual QString name() const override; virtual void validCheck(std::shared_ptr root) const override; }; /** * @brief 情节节点校验. */ class LIBPARSE_EXPORT PointGraphCheck : public lib_parse::CheckProvider, public std::enable_shared_from_this { private: QHash> elements_store; QList> fragments_sort_list; QList> refers_cycle_check( std::shared_ptr item, QList> prevs = QList>()) const; public: void setElement(std::shared_ptr inst); std::shared_ptr getElement(const QString &signature) const; QList> getHangoutNodes(); bool nodeDismantle(std::shared_ptr inst); QList> pointsSequence() const; // CheckProvider interface public: virtual void validCheck(std::shared_ptr root) const override; virtual QString name() const override; }; class PointGraphHelper : public std::enable_shared_from_this { private: std::shared_ptr node_peer; QList> next_nodes; uint indegree = 0; public: PointGraphHelper(std::shared_ptr node); std::shared_ptr nodePeer() const; void appendNext(std::shared_ptr node); QList> nextList() const; uint& inDegree(); }; /** * @brief 故事线排序校验. */ class LIBPARSE_EXPORT StoryOrderCheck : public lib_parse::CheckProvider { private: uint sort_index = 1; /** * 获取合适的文档节点. * * \param pnode * \return */ QList> valid_docs_peak(std::shared_ptr pnode) const; public: // 通过 CheckProvider 继承 QString name() const override; void validCheck(std::shared_ptr root) const override; }; class FragmentNode : public std::enable_shared_from_this { private: std::shared_ptr _src_fragm = nullptr; QList> _next_fragms; int _layer_number = -1; public: FragmentNode(std::shared_ptr bind); std::shared_ptr bind() const; void setLayer(int number); int layerNumber() const; QList> referNodes() const; void appendNext(std::shared_ptr ins); }; /** * @brief 情节时间顺序校验 */ class LIBPARSE_EXPORT FragmentLayerCheck : public lib_parse::CheckProvider { private: QHash> _node_set; QList> _story_start; /** * @brief 故事线转换 */ std::shared_ptr _sets_fill(std::shared_ptr node); /// /// 引用网络重构 /// /// 传入情节定义结点 void _refers_rebuild(std::shared_ptr node); /// /// 节点层级重排 /// /// 目标结点 /// 目标层级 void node_relayer(std::shared_ptr node, int curr = 0); /// /// 层级确认 /// /// 故事线 void layer_check(std::shared_ptr node); void story_layer_check(std::shared_ptr story); void sibling_element_compair(const QString& story, std::shared_ptr prev, std::shared_ptr curr); public: // 通过 CheckProvider 继承 QString name() const override; void validCheck(std::shared_ptr root) const override; }; } // namespace example_novel