From df5a826d23e9de4fc2fe5a368b3da49b23eb5eea Mon Sep 17 00:00:00 2001 From: Simon Gene Gottlieb Date: Fri, 14 Jul 2023 13:14:48 +0200 Subject: [PATCH] feat: FMIndex can use other CSA, and selectLeftCursor --- src/fmindex-collection/FMIndex.h | 9 ++++---- .../search/SearchNoErrors.h | 15 ++++++------ src/fmindex-collection/search/SelectCursor.h | 23 +++++++++++++++---- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/fmindex-collection/FMIndex.h b/src/fmindex-collection/FMIndex.h index 8e9fa5bb..b44a6cb0 100644 --- a/src/fmindex-collection/FMIndex.h +++ b/src/fmindex-collection/FMIndex.h @@ -12,17 +12,16 @@ namespace fmindex_collection { -template +template struct FMIndex { static size_t constexpr Sigma = Table::Sigma; using TTable = Table; Table occ; - CSA csa; + TCSA csa; - - FMIndex(std::span bwt, CSA _csa) + FMIndex(std::span bwt, TCSA _csa) : occ{bwt} , csa{std::move(_csa)} {} @@ -44,7 +43,7 @@ struct FMIndex { auto [bwt, csa] = [&, &inputText=inputText, &inputSizes=inputSizes] () { auto sa = createSA(inputText, threadNbr); auto bwt = createBWT(inputText, sa); - auto csa = CSA{std::move(sa), samplingRate, inputSizes}; + auto csa = TCSA{std::move(sa), samplingRate, inputSizes}; return std::make_tuple(std::move(bwt), std::move(csa)); }(); diff --git a/src/fmindex-collection/search/SearchNoErrors.h b/src/fmindex-collection/search/SearchNoErrors.h index 9309e253..abec4a82 100644 --- a/src/fmindex-collection/search/SearchNoErrors.h +++ b/src/fmindex-collection/search/SearchNoErrors.h @@ -13,9 +13,9 @@ namespace fmindex_collection::search_no_errors { -template -void search(index_t const & index, query_t && query, delegate_t && delegate) { - using cursor_t = LeftBiFMIndexCursor; +template +auto search(index_t const & index, query_t && query) { + using cursor_t = select_left_cursor_t; static_assert(not cursor_t::Reversed, "reversed fmindex is not supported"); auto cur = cursor_t{index}; @@ -23,10 +23,10 @@ void search(index_t const & index, query_t && query, delegate_t && delegate) { auto r = query[query.size() - i - 1]; cur = cur.extendLeft(r); if (cur.empty()) { - return; + return cur; } } - delegate(cur); + return cur; } template @@ -34,9 +34,8 @@ void search(index_t const & index, queries_t && queries, delegate_t && delegate) for (size_t qidx{0}; qidx < queries.size(); ++qidx) { auto const& query = queries[qidx]; - search(index, query, [&qidx, &delegate](auto cursor) { - delegate(qidx, cursor); - }); + auto cursor = search(index, query); + delegate(qidx, cursor); } } diff --git a/src/fmindex-collection/search/SelectCursor.h b/src/fmindex-collection/search/SelectCursor.h index 894e9be3..a5b6da76 100644 --- a/src/fmindex-collection/search/SelectCursor.h +++ b/src/fmindex-collection/search/SelectCursor.h @@ -21,9 +21,9 @@ struct SelectIndexCursor> { using cursor_t = BiFMIndexCursor>; }; -template -struct SelectIndexCursor> { - using cursor_t = FMIndexCursor>; +template +struct SelectIndexCursor> { + using cursor_t = FMIndexCursor>; }; template @@ -31,8 +31,23 @@ struct SelectIndexCursor> { using cursor_t = ReverseFMIndexCursor>; }; +template +struct SelectLeftIndexCursor; + +template +struct SelectLeftIndexCursor> { + using cursor_t = LeftBiFMIndexCursor>; +}; + +template +struct SelectLeftIndexCursor> { + using cursor_t = FMIndexCursor>; +}; + +template +using select_cursor_t = typename SelectIndexCursor::cursor_t; template -using select_cursor_t = typename SelectIndexCursor::cursor_t; +using select_left_cursor_t = typename SelectLeftIndexCursor::cursor_t; }