// Copyright (c) 2013 GitHub, Inc. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ATOM_COMMON_SWAP_OR_ASSIGN_H_ #define ATOM_COMMON_SWAP_OR_ASSIGN_H_ namespace internal { // Helper to detect whether value has specified method. template class HasSwapMethod { typedef char one; typedef long two; template static one test(char[sizeof(&C::swap)]) ; template static two test(...); public: enum { value = sizeof(test(0)) == sizeof(char) }; }; template struct enable_if {}; template struct enable_if { typedef T type; }; template typename enable_if::value>::type SwapOrAssign( T& v1, const T& v2) { v1.swap(const_cast(v2)); } template typename enable_if::value>::type SwapOrAssign( T& v1, const T& v2) { v1 = v2; } } // namespace internal #endif // ATOM_COMMON_SWAP_OR_ASSIGN_H_