Fix template related compilation errors of VC++.
This commit is contained in:
parent
9ac0591386
commit
597e17b540
2 changed files with 33 additions and 3 deletions
|
@ -5,8 +5,37 @@
|
||||||
#ifndef ATOM_COMMON_SWAP_OR_ASSIGN_H_
|
#ifndef ATOM_COMMON_SWAP_OR_ASSIGN_H_
|
||||||
#define ATOM_COMMON_SWAP_OR_ASSIGN_H_
|
#define ATOM_COMMON_SWAP_OR_ASSIGN_H_
|
||||||
|
|
||||||
|
#include "base/compiler_specific.h"
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
template<typename T> inline
|
||||||
|
void SwapOrAssign(T& v1, const T& v2) {
|
||||||
|
__if_exists(T::swap) {
|
||||||
|
v1.swap(const_cast<T&>(v2));
|
||||||
|
}
|
||||||
|
|
||||||
|
__if_not_exists(T::swap) {
|
||||||
|
v1 = v2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T> inline
|
||||||
|
void SwapOrAssign(T*& v1, T* v2) {
|
||||||
|
v1 = v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void SwapOrAssign(int& v1, int v2) {
|
||||||
|
v1 = v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void SwapOrAssign(bool& v1, bool v2) {
|
||||||
|
v1 = v2;
|
||||||
|
}
|
||||||
|
#else // defined(OS_WIN)
|
||||||
// Helper to detect whether value has specified method.
|
// Helper to detect whether value has specified method.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
class HasSwapMethod {
|
class HasSwapMethod {
|
||||||
|
@ -24,17 +53,18 @@ struct enable_if {};
|
||||||
template<class T>
|
template<class T>
|
||||||
struct enable_if<true, T> { typedef T type; };
|
struct enable_if<true, T> { typedef T type; };
|
||||||
|
|
||||||
template<typename T>
|
template<typename T> inline
|
||||||
typename enable_if<HasSwapMethod<T>::value>::type SwapOrAssign(
|
typename enable_if<HasSwapMethod<T>::value>::type SwapOrAssign(
|
||||||
T& v1, const T& v2) {
|
T& v1, const T& v2) {
|
||||||
v1.swap(const_cast<T&>(v2));
|
v1.swap(const_cast<T&>(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T> inline
|
||||||
typename enable_if<!HasSwapMethod<T>::value>::type SwapOrAssign(
|
typename enable_if<!HasSwapMethod<T>::value>::type SwapOrAssign(
|
||||||
T& v1, const T& v2) {
|
T& v1, const T& v2) {
|
||||||
v1 = v2;
|
v1 = v2;
|
||||||
}
|
}
|
||||||
|
#endif // !defined(OS_WIN)
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
||||||
|
|
|
@ -237,7 +237,7 @@ bool FromV8Arguments(const v8::Arguments& args, T1* value, int index = 0) {
|
||||||
if (!V8ValueCanBeConvertedTo<T1>(args[index]))
|
if (!V8ValueCanBeConvertedTo<T1>(args[index]))
|
||||||
return false;
|
return false;
|
||||||
internal::SwapOrAssign(*value,
|
internal::SwapOrAssign(*value,
|
||||||
static_cast<const T1&>(FromV8Value(args[index])));
|
FromV8Value(args[index]).operator T1());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue