5 #ifndef VCCC_ALGORITHM_SHIFT_HPP
6 #define VCCC_ALGORITHM_SHIFT_HPP
23 constexpr
void move_nocheck(It
first, It last, It dest) {
24 while (
first != last) {
25 *dest = std::move(*
first);
35 template<
typename ForwardIt>
47 ForwardIt shift_first =
first;
52 for (; shift_first != last; ++shift_first, (void) ++
first) {
53 *
first = std::move(*shift_first);
60 template<
typename B
idiIt>
61 constexpr BidiIt shift_right_impl_bidi(
62 BidiIt
first, BidiIt last,
63 typename cxx20_iterator_traits<BidiIt>::difference_type n,
66 if (n >= last -
first)
68 auto shift_last = last - n;
69 while (
first != shift_last) {
70 *--last = std::move(*--shift_last);
75 template<
typename B
idiIt>
76 constexpr BidiIt shift_right_impl_bidi(
77 BidiIt
first, BidiIt last,
78 typename cxx20_iterator_traits<BidiIt>::difference_type n,
81 auto shift_last = last;
83 if (shift_last ==
first)
87 while (
first != shift_last) {
88 *--last = std::move(*--shift_last);
93 template<
typename B
idiIt>
94 constexpr BidiIt shift_right_impl(
95 BidiIt
first, BidiIt last,
96 typename cxx20_iterator_traits<BidiIt>::difference_type n,
99 return shift_right_impl_bidi(
first, last, n, LegacyRandomAccessIterator<BidiIt>{});
102 template<
typename ForwardIt>
103 constexpr ForwardIt shift_right_impl(
104 ForwardIt
first, ForwardIt last,
105 typename cxx20_iterator_traits<ForwardIt>::difference_type n,
118 for (; trail != result; ++trail, (void) ++lead) {
120 vccc::detail::move_nocheck(
first, trail, result);
126 for (
auto mid =
first; mid != result; ++mid, (void) ++trail, ++lead) {
128 trail = vccc::detail::move_nocheck(mid, result, trail);
129 vccc::detail::move_nocheck(
first, mid, trail);
142 template<
typename ForwardIt>
constexpr ForwardIt shift_left(ForwardIt first, ForwardIt last, typename cxx20_iterator_traits< ForwardIt >::difference_type n)
Definition: shift.hpp:36
constexpr ForwardIt shift_right(ForwardIt first, ForwardIt last, typename cxx20_iterator_traits< ForwardIt >::difference_type n)
Definition: shift.hpp:143
constexpr VCCC_INLINE_OR_STATIC detail::advance_niebloid advance
Definition: advance.hpp:158
constexpr std::enable_if_t< conjunction< is_swappable< T >, is_swappable< U > >::value > swap(compressed_pair< T, U > &lhs, compressed_pair< T, U > &rhs) noexcept(conjunction< is_nothrow_swappable< T >, is_nothrow_swappable< U >>::value)
Definition: compressed_pair.hpp:108
Definition: matrix.hpp:495
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 0 > first
Definition: key_value.hpp:34
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
Definition: legacy_bidirectional_iterator.hpp:70
Definition: legacy_forward_iterator.hpp:49
Definition: value_swappable.hpp:29
Definition: cxx20_iterator_traits.hpp:188
Definition: disjunction.hpp:22