diff --git a/BAN/include/BAN/Iterators.h b/BAN/include/BAN/Iterators.h index 5c01d549..36af28bf 100644 --- a/BAN/include/BAN/Iterators.h +++ b/BAN/include/BAN/Iterators.h @@ -1,10 +1,41 @@ #pragma once #include +#include namespace BAN { + template + It next(It it, size_t count) + { + for (size_t i = 0; i < count; i++) + ++it; + return it; + } + + template + requires requires(It it, size_t n) { requires is_same_v; } + It next(It it, size_t count) + { + return it + count; + } + + template + It prev(It it, size_t count) + { + for (size_t i = 0; i < count; i++) + --it; + return it; + } + + template + requires requires(It it, size_t n) { requires is_same_v; } + It prev(It it, size_t count) + { + return it - count; + } + template class IteratorSimpleGeneral { diff --git a/BAN/include/BAN/Sort.h b/BAN/include/BAN/Sort.h index e30e5fb5..22af766d 100644 --- a/BAN/include/BAN/Sort.h +++ b/BAN/include/BAN/Sort.h @@ -10,7 +10,7 @@ namespace BAN void sort_exchange(It begin, It end, Comp comp = {}) { for (It lhs = begin; lhs != end; ++lhs) - for (It rhs = lhs; ++rhs != end;) + for (It rhs = next(lhs, 1); rhs != end; ++rhs) if (!comp(*lhs, *rhs)) swap(*lhs, *rhs); } @@ -21,7 +21,7 @@ namespace BAN template It sort_quick_partition(It begin, It end, Comp comp) { - It pivot = end; --pivot; + It pivot = prev(end, 1); It it1 = begin; for (It it2 = begin; it2 != pivot; ++it2)