#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; }; } // namespace example_novel