completely genericized octa::swap (no need for global overloads ever)

master
Daniel Kolesa 2015-05-26 21:28:12 +01:00
parent 42167fdc5a
commit e9367246b5
4 changed files with 21 additions and 21 deletions

View File

@ -62,11 +62,6 @@ namespace octa {
T p_buf[(N > 0) ? N : 1]; T p_buf[(N > 0) ? N : 1];
}; };
template<typename T, size_t N>
void swap(Array<T, N> &a, Array<T, N> &b) {
a.swap(b);
}
} }
#endif #endif

View File

@ -617,11 +617,6 @@ namespace octa {
} }
}; };
template<typename T>
void swap(Function<T> &a, Function<T> &b) {
a.swap(b);
}
template<typename T> template<typename T>
bool operator==(nullptr_t, const Function<T> &rhs) { return !rhs; } bool operator==(nullptr_t, const Function<T> &rhs) { return !rhs; }

View File

@ -36,12 +36,32 @@ namespace octa {
/* swap */ /* swap */
template<typename T> void swap(T &a, T &b) { template<typename T>
struct __OctaSwapTest {
template<typename U, void (U::*)(U &)> struct __OctaTest {};
template<typename U> static char __octa_test(__OctaTest<U, &U::swap> *);
template<typename U> static int __octa_test(...);
static constexpr bool value = (sizeof(__octa_test<T>(0)) == sizeof(char));
};
template<typename T> inline void __octa_swap(T &a, T &b, EnableIf<
__OctaSwapTest<T>::value, bool
> = true) {
a.swap(b);
}
template<typename T> inline void __octa_swap(T &a, T &b, EnableIf<
!__OctaSwapTest<T>::value, bool
> = true) {
T c(move(a)); T c(move(a));
a = move(b); a = move(b);
b = move(c); b = move(c);
} }
template<typename T> void swap(T &a, T &b) {
__octa_swap(a, b);
}
template<typename T, size_t N> void swap(T (&a)[N], T (&b)[N]) { template<typename T, size_t N> void swap(T (&a)[N], T (&b)[N]) {
for (size_t i = 0; i < N; ++i) { for (size_t i = 0; i < N; ++i) {
swap(a[i], b[i]); swap(a[i], b[i]);
@ -103,11 +123,6 @@ namespace octa {
octa::swap(second, v.second); octa::swap(second, v.second);
} }
}; };
template<typename T, typename U>
void swap(Pair<T, U> &a, Pair<T, U> &b) {
a.swap(b);
}
} }
#endif #endif

View File

@ -311,11 +311,6 @@ namespace octa {
octa::swap(p_buf, v.p_buf); octa::swap(p_buf, v.p_buf);
} }
}; };
template<typename T>
void swap(Vector<T> &a, Vector<T> &b) {
a.swap(b);
}
} }
#endif #endif