di 0.1.0
Loading...
Searching...
No Matches
swap.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/util.h"
8#include "di/util/forward.h"
9
10namespace di::util {
11constexpr inline struct SwapFunction {
12 template<typename T, typename U>
14 constexpr void operator()(T&& a, U&& b) const {
15 di::function::tag_invoke(*this, util::forward<T>(a), util::forward<U>(b));
16 }
17
18 template<typename T, typename U>
19 requires(requires(T& a, T& b) { a.swap(b); })
20 constexpr void operator()(T& a, T& b) {
21 a.swap(b);
22 }
23
24 template<typename T, typename U>
27 constexpr void operator()(T& a, U& b) const {
28 auto temp = auto(util::forward<T>(a));
29 a = util::forward<U>(b);
30 b = util::forward<T>(temp);
31 }
33}
34
35namespace di::concepts {
36template<typename T>
37concept Swappable = requires(T& a, T& b) { di::util::swap(a, b); };
38
39template<typename T, typename U>
40concept SwappableWith = requires(T&& a, U&& b) {
41 di::util::swap(util::forward<T>(a), util::forward<T>(a));
42 di::util::swap(util::forward<T>(a), util::forward<U>(b));
43 di::util::swap(util::forward<U>(b), util::forward<T>(a));
44 di::util::swap(util::forward<U>(b), util::forward<U>(b));
45};
46}
47
48namespace di {
51using util::swap;
52}
Definition operations.h:11
Definition operations.h:49
Definition swap.h:40
Definition swap.h:37
Definition tag_invoke.h:33
Definition any_storable.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition vocab.h:96
constexpr struct di::util::SwapFunction swap
Definition any_storable.h:9
constexpr struct di::util::SwapFunction swap
Definition swap.h:11