37 template <
bool Reverse,
bool AnyOf,
typename Iter,
typename End>
38 static constexpr std::size_t find_impl(
39 Iter first, End last, std::string_view keyword, std::size_t index, std::size_t depth = 0)
noexcept {
41 std::size_t current_depth{};
43 constexpr auto next_iter = [](
auto& iter) {
44 if constexpr (Reverse) {
52 auto match_string = [&](
auto& iter) {
53 if constexpr (AnyOf) {
54 return current_depth == depth && keyword.find_first_of(*iter) != std::string_view::npos;
56 return current_depth == depth
58 iter + std::min(std::distance(iter, last),
static_cast<std::ptrdiff_t
>(keyword.size())),
64 auto&& [real_first, real_last] = [&] {
65 if constexpr (Reverse) {
66 return std::pair{std::prev(last),
68 first, index == std::string_view::npos ? 0 :
static_cast<std::ptrdiff_t
>(index)))};
70 return std::pair{std::next(first,
static_cast<std::ptrdiff_t
>(index)), last};
74 for (
auto iter = real_first; iter != real_last; next_iter(iter)) {
75 if (language_tokens::left_enclosing_tokens.contains(*iter)) {
80 if (current_depth != 0 && language_tokens::right_enclosing_tokens.contains(*iter)
81 && last_char != language_tokens::arrow.front()) {
88 if (match_string(iter)) {
90 return std::distance(first, iter) + (AnyOf ? 1 : keyword.size());
94 return std::string_view::npos;
131 constexpr std::size_t find_at_depth(std::string_view str, std::string_view keyword, std::size_t depth = 0,