diff --git a/include/rexy/algorithm.hpp b/include/rexy/algorithm.hpp index 6a52132..681ca21 100644 --- a/include/rexy/algorithm.hpp +++ b/include/rexy/algorithm.hpp @@ -21,13 +21,15 @@ #include "utility.hpp" //swap #include //SIZE_MAX -#include "detail/algorithm.hpp" #include //size_t - #include +#include "detail/algorithm.hpp" + namespace rexy{ + //Requires Iterators to be LegacyRandomAccessIterators + //right is one past the end of the list template constexpr void quicksort(Iter left, Iter right, const Compare& cmp) noexcept(noexcept(detail::qs_partition(left, right, cmp))) @@ -40,63 +42,67 @@ namespace rexy{ } } + //Requires Iterators to be LegacyRandomAccessIterators template constexpr HIter two_way_search(const HIter& hstart, const HIter& hend, const NIter& nstart, const NIter& nend){ size_t j = 0; size_t i = 0; size_t nlen = nend - nstart; size_t hlen = hend - hstart; - auto [max_suffix, period] = detail::critical_factorization(nstart, nend); + auto [suffix, period] = detail::critical_factorization(nstart, nend); - if(detail::iter_compare(nstart, nstart + period, max_suffix)){ + if(detail::iter_compare(nstart, nstart + period, suffix)){ size_t memory = SIZE_MAX; while(j <= hlen - nlen){ - i = max(max_suffix, memory) + 1; + i = max(suffix, memory) + 1; //right side while(i < nlen && nstart[i] == hstart[i + j]){ ++i; } if(i >= nlen){ - i = max_suffix; + i = suffix; //left side while(i > memory && nstart[i] == hstart[i + j]){ --i; } if(i <= memory){ - return hstart + j; //? + return hstart + j; } j += period; memory = nlen - period - 1; }else{ - j += (i - max_suffix); + j += (i - suffix); memory = SIZE_MAX; } } }else{ - period = max(max_suffix + 1, nlen - max_suffix - 1) + 1; + period = max(suffix + 1, nlen - suffix - 1) + 1; j = 0; while(j <= hlen - nlen){ - i = max_suffix + 1; + i = suffix + 1; + //right side while(i < nlen && nstart[i] == hstart[i + j]){ ++i; } if(i >= nlen){ - i = max_suffix; + i = suffix; + //left side while(i != SIZE_MAX && nstart[i] == hstart[i + j]){ --i; } if(i == SIZE_MAX){ - return hstart + j; //? + return hstart + j; } j += period; }else{ - j += (i - max_suffix); + j += (i - suffix); } } } return hend; } + //searcher for use with generic search wrappers struct two_way_searcher{ template constexpr HIter operator()(const HIter& hstart, const HIter& hend, const NIter& nstart, const NIter& nend)const{