// Move, forward and identity for C++0x + swap -*- C++ -*-// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.//// This file is part of the GNU ISO C++ Library. This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 3, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// Under Section 7 of GPL version 3, you are granted additional// permissions described in the GCC Runtime Library Exception, version// 3.1, as published by the Free Software Foundation.// You should have received a copy of the GNU General Public License and// a copy of the GCC Runtime Library Exception along with this program;// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see// <http://www.gnu.org/licenses/>./** @file move.h* This is an internal header file, included by other library headers.* You should not attempt to use it directly.*/#ifndef _MOVE_H#define _MOVE_H 1#include <bits/c++config.h>#include <cstddef>#include <bits/concept_check.h>#ifdef __GXX_EXPERIMENTAL_CXX0X__#include <type_traits>_GLIBCXX_BEGIN_NAMESPACE(std)// 20.2.2, forward/movetemplate<typename _Tp>struct identity{typedef _Tp type;};template<typename _Tp>inline _Tp&&forward(typename std::identity<_Tp>::type&& __t){ return __t; }template<typename _Tp>inline typename std::remove_reference<_Tp>::type&&move(_Tp&& __t){ return __t; }_GLIBCXX_END_NAMESPACE#define _GLIBCXX_MOVE(_Tp) std::move(_Tp)#else#define _GLIBCXX_MOVE(_Tp) (_Tp)#endif_GLIBCXX_BEGIN_NAMESPACE(std)/*** @brief Swaps two values.* @param a A thing of arbitrary type.* @param b Another thing of arbitrary type.* @return Nothing.*/template<typename _Tp>inline voidswap(_Tp& __a, _Tp& __b){// concept requirements__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)_Tp __tmp = _GLIBCXX_MOVE(__a);__a = _GLIBCXX_MOVE(__b);__b = _GLIBCXX_MOVE(__tmp);}// _GLIBCXX_RESOLVE_LIB_DEFECTS// DR 809. std::swap should be overloaded for array types.template<typename _Tp, size_t _Nm>inline voidswap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm]){for (size_t __n = 0; __n < _Nm; ++__n)swap(__a[__n], __b[__n]);}_GLIBCXX_END_NAMESPACE#endif /* _MOVE_H */