15 #include <type_traits>
17 #include <sdsl/suffix_arrays.hpp>
23 namespace seqan3::detail
39 SEQAN3_CONCEPT sdsl_index = requires (t sdsl_index)
41 typename t::size_type;
43 { sdsl_index.size() } ->
typename t::size_type;
45 { sdsl_index.comp2char[0] } -> uint8_t;
46 { sdsl_index.char2comp[0] } -> uint8_t;
50 requires requires (t sdsl_index,
typename t::char_type
const c,
typename t::size_type
const lb,
51 typename t::size_type
const rb, sdsl::int_vector<8>
const text)
53 { sdsl_index.bwt.rank(lb, c) };
54 { sdsl_index.wavelet_tree.lex_count(lb, rb, c) };
55 { sdsl::construct_im(sdsl_index, text, 0) };
102 typename t::alphabet_type;
103 typename t::size_type;
104 typename t::cursor_type;
115 { index.begin() } ->
typename t::cursor_type;
117 { index.size() } ->
typename t::size_type;
118 { index.empty() } -> bool;
149 template <
typename t>
153 typename t::index_type;
154 typename t::size_type;
158 requires requires (
typename t::index_type
const index) { { t(index) } };
160 requires requires (t cur,
161 typename t::index_type::alphabet_type
const c,
167 { cur.extend_right() } -> bool;
168 { cur.extend_right(c) } -> bool;
169 { cur.extend_right(
seq) } -> bool;
170 { cur.cycle_back() } -> bool;
171 { cur.path_label(text) } ->
auto;
174 { cur.last_rank() } ->
typename t::size_type;
175 { cur.query_length() } ->
typename t::size_type;
176 { cur.count() } ->
typename t::size_type;
180 { cur.lazy_locate() } ->
auto;
205 template <
typename t>
209 typename t::cursor_type;
210 typename t::fwd_cursor_type;
211 typename t::rev_cursor_type;
216 { index.fwd_begin() } ->
typename t::fwd_cursor_type;
217 { index.rev_begin() } ->
typename t::rev_cursor_type;
245 template <
typename t>
251 requires requires (
typename t::index_type
const index) { { t(index) } };
253 requires requires (t cur,
254 typename t::index_type::alphabet_type
const c,
257 { cur.extend_left() } -> bool;
258 { cur.extend_left(c) } -> bool;
259 { cur.extend_left(
seq) } -> bool;
260 { cur.cycle_front() } -> bool;