From a3e255a991420abd99ff99d274bdc4841b6a54cb Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Sat, 4 May 2024 23:34:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AE=97=E6=B3=95=E6=94=B9?= =?UTF-8?q?=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WsNovelParser/WsNovelParser.vcxproj.user | 4 +-- libParse/libParse.vcxproj.user | 4 +-- libParse/parse_novel.cpp | 46 ++++++++++++++++-------- libParse/parse_novel.h | 2 +- libSyntax/libSyntax.vcxproj.user | 4 +-- libToken/libToken.vcxproj.user | 4 +-- 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user index d23b474..854e739 100644 --- a/WsNovelParser/WsNovelParser.vcxproj.user +++ b/WsNovelParser/WsNovelParser.vcxproj.user @@ -6,9 +6,9 @@ -path "D:\手作小说\科学+修仙+创造世界" - 2024-05-04T09:33:58.7289365Z + 2024-05-04T13:29:44.1342154Z - 2024-05-04T09:33:58.9501188Z + 2024-05-04T13:29:44.5012357Z \ No newline at end of file diff --git a/libParse/libParse.vcxproj.user b/libParse/libParse.vcxproj.user index 60dd58e..bd0d99d 100644 --- a/libParse/libParse.vcxproj.user +++ b/libParse/libParse.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-05-04T09:33:59.3486956Z + 2024-05-04T13:29:47.7605591Z - 2024-05-04T09:33:59.5091441Z + 2024-05-04T13:29:47.9767101Z \ No newline at end of file diff --git a/libParse/parse_novel.cpp b/libParse/parse_novel.cpp index e5edd4e..43564cc 100644 --- a/libParse/parse_novel.cpp +++ b/libParse/parse_novel.cpp @@ -122,39 +122,51 @@ void FragmentOrdersCheck::elements_link_build(const QList>& tracks, std::shared_ptr current, int story_sort_source) +template +void cast(InputIt Begin, InputIt End, OutputIt Dst, Operate fn) { + while (Begin != End) { + *Dst++ = fn(*Begin++); + } +} + + +void FragmentOrdersCheck::sort_cycle_check(const QList>& tracks, std::shared_ptr _current, int story_sort_source) { - if (!current) + if (!_current || !_current->next()) return; - if (tracks.contains(current)) { + auto target = _current->next(); + + if (tracks.contains(peaks_appoint_element(target))) { QString error_cycle; for (auto& it : tracks) error_cycle += u8"->" + it->nodeBind()->element()->signature() + u8"\n"; - error_cycle += u8"->" + current->nodeBind()->element()->signature() + u8""; + error_cycle += u8"->" + target->nodeBind()->element()->signature() + u8""; throw new lib_parse::CheckException(u8"Parse[0x0003]쳣\n" + error_cycle); } auto nlist = tracks; + nlist.append(peaks_appoint_element(target)); - if (current->nodeType() == example_novel::FragmentSortHelper::Type::REFER) { - decltype (current->siblings()) fork_list; - for (auto& vit : current->siblings()) { + if (target->nodeType() == example_novel::FragmentSortHelper::Type::REFER) { + decltype (target->siblings()) sibling_forks; + + auto siblings = target->siblings(); + for (auto& vit : siblings) { if (vit->storySort() <= story_sort_source) - fork_list << vit; + sibling_forks << vit; } - for (auto& fork : fork_list) { + for (auto& fork : sibling_forks) { sort_cycle_check(nlist, fork, story_sort_source); } } - nlist.append(peaks_appoint_element(current)); - sort_cycle_check(nlist, current->next(), story_sort_source); + sort_cycle_check(nlist, target, story_sort_source); } -std::shared_ptr example_novel::FragmentOrdersCheck::peaks_appoint_element(std::shared_ptr refer_n) +std::shared_ptr example_novel::FragmentOrdersCheck::peaks_appoint_element(std::shared_ptr refer_n) const { if (refer_n->nodeType() == example_novel::FragmentSortHelper::Type::ELEMENT) return refer_n; @@ -230,8 +242,14 @@ void FragmentOrdersCheck::validCheck(std::shared_ptr(this)->elements_link_build(this->stories_list); - for (auto& s : this->stories_list) - const_cast(this)->sort_cycle_check(QList>(), s->fragmentSort(), s->sortValue()); + for (auto& s : this->stories_list) { + if(!s->fragmentSort()) + continue; + + QList> tracks; + tracks << peaks_appoint_element(s->fragmentSort()); + const_cast(this)->sort_cycle_check(tracks, s->fragmentSort(), s->sortValue()); + } } StorySortHelper::StorySortHelper(std::shared_ptr story_bind) { diff --git a/libParse/parse_novel.h b/libParse/parse_novel.h index 9902e5c..ecd761b 100644 --- a/libParse/parse_novel.h +++ b/libParse/parse_novel.h @@ -25,7 +25,7 @@ namespace example_novel { void sort_cycle_check(const QList>& tracks, std::shared_ptr current, int story_sort_source); - std::shared_ptr peaks_appoint_element(std::shared_ptr refer_n); + std::shared_ptr peaks_appoint_element(std::shared_ptr refer_n) const; // CheckProvider interface public: diff --git a/libSyntax/libSyntax.vcxproj.user b/libSyntax/libSyntax.vcxproj.user index 6181bc2..63be189 100644 --- a/libSyntax/libSyntax.vcxproj.user +++ b/libSyntax/libSyntax.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-05-04T09:33:59.5719569Z + 2024-05-04T13:29:47.3997896Z - 2024-05-04T09:33:59.7159031Z + 2024-05-04T13:29:47.5416879Z \ No newline at end of file diff --git a/libToken/libToken.vcxproj.user b/libToken/libToken.vcxproj.user index 507fd1f..b7fb4f7 100644 --- a/libToken/libToken.vcxproj.user +++ b/libToken/libToken.vcxproj.user @@ -2,9 +2,9 @@ - 2024-05-04T09:33:59.0218626Z + 2024-05-04T13:29:46.3016809Z - 2024-05-04T09:33:59.1804633Z + 2024-05-04T13:29:46.7433247Z \ No newline at end of file