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;