15 struct IteratorSwapFunction;
17 template<
typename T,
typename U>
18 concept CustomIteratorSwap = (concepts::Class<meta::RemoveCVRef<T>> || concepts::Enum<meta::RemoveCVRef<T>>) &&
19 concepts::TagInvocable<IteratorSwapFunction, T, U>;
21 template<
typename T,
typename U>
22 concept DerefIteratorSwap = concepts::Iterator<T> && concepts::Iterator<U> &&
25 template<
typename T,
typename U>
26 concept ExchangeIteratorSwap = concepts::Iterator<T> && concepts::Iterator<U> &&
32 struct IteratorSwapFunction {
33 template<
typename T,
typename U,
typename TT = meta::RemoveCVRef<T>,
typename UU = meta::RemoveCVRef<U>>
34 requires(CustomIteratorSwap<TT, UU> || DerefIteratorSwap<TT, UU> || CustomIteratorSwap<T, U>)
35 constexpr void operator()(T&& a, U&& b)
const {
36 if constexpr (CustomIteratorSwap<T, U>) {
38 }
else if constexpr (DerefIteratorSwap<TT, UU>) {
43 *b = util::move(temp);
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto iterator_swap
Definition iterator_swap.h:49
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr struct di::util::SwapFunction swap