From e84bb426f511fc9e6b5e5abb5c38e13b0b2bbf92 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 15 Jun 2024 16:52:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=82=E5=B8=B8=E4=BF=A1=E6=81=AF=E9=99=84?= =?UTF-8?q?=E5=8A=A0=E5=BC=95=E7=94=A8=E7=8E=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libParse/parse_novel.cpp | 34 ++++++++++++++++++++++++++++++++-- libParse/parse_novel.h | 3 +++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/libParse/parse_novel.cpp b/libParse/parse_novel.cpp index 8c3817b..9572168 100644 --- a/libParse/parse_novel.cpp +++ b/libParse/parse_novel.cpp @@ -31,6 +31,25 @@ QString FragmentExistsCheck::name() const { return u8"FragmentExistsCheck"; } +QList> example_novel::FragmentGraphCheck::refers_cycle_check( + std::shared_ptr item, QList> prevs) const { + if (prevs.contains(item)) { + return prevs << item; + } + + auto next_list = item->nextList(); + if (next_list.size()) { + prevs << item; + for (auto next : next_list) { + auto ref_link = refers_cycle_check(next, prevs); + if (ref_link.size()) + return ref_link; + } + } + + return QList>(); +} + void FragmentGraphCheck::setElement(std::shared_ptr inst) { elements_store[inst->nodePeer()->signature()] = inst; @@ -165,8 +184,19 @@ void FragmentGraphCheck::validCheck(std::shared_ptr").arg(n->nodePeer()->signature()); + } + + if (cycle_link.size()) + throw new lib_parse::CheckException(error_msg); + } + } } QString example_novel::FragmentGraphCheck::name() const { diff --git a/libParse/parse_novel.h b/libParse/parse_novel.h index c81c331..65c4963 100644 --- a/libParse/parse_novel.h +++ b/libParse/parse_novel.h @@ -20,6 +20,9 @@ namespace example_novel { private: QHash> elements_store; + 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;