00001 // Move, forward and identity for C++0x + swap -*- C++ -*- 00002 00003 // Copyright (C) 2007 Free Software Foundation, Inc. 00004 // 00005 // This file is part of the GNU ISO C++ Library. This library is free 00006 // software; you can redistribute it and/or modify it under the 00007 // terms of the GNU General Public License as published by the 00008 // Free Software Foundation; either version 2, or (at your option) 00009 // any later version. 00010 00011 // This library is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 00016 // You should have received a copy of the GNU General Public License along 00017 // with this library; see the file COPYING. If not, write to the Free 00018 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 00019 // USA. 00020 00021 // As a special exception, you may use this file as part of a free software 00022 // library without restriction. Specifically, if other files instantiate 00023 // templates or use macros or inline functions from this file, or you compile 00024 // this file and link it with other files to produce an executable, this 00025 // file does not by itself cause the resulting executable to be covered by 00026 // the GNU General Public License. This exception does not however 00027 // invalidate any other reasons why the executable file might be covered by 00028 // the GNU General Public License. 00029 00030 /** @file stl_move.h 00031 * This is an internal header file, included by other library headers. 00032 * You should not attempt to use it directly. 00033 */ 00034 00035 #ifndef _STL_MOVE_H 00036 #define _STL_MOVE_H 1 00037 00038 #include <bits/c++config.h> 00039 #include <bits/concept_check.h> 00040 00041 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 00042 #include <type_traits> 00043 00044 _GLIBCXX_BEGIN_NAMESPACE(std) 00045 00046 // 20.2.2, forward/move 00047 template<typename _Tp> 00048 struct identity 00049 { 00050 typedef _Tp type; 00051 }; 00052 00053 template<typename _Tp> 00054 inline _Tp&& 00055 forward(typename std::identity<_Tp>::type&& __t) 00056 { return __t; } 00057 00058 template<typename _Tp> 00059 inline typename std::remove_reference<_Tp>::type&& 00060 move(_Tp&& __t) 00061 { return __t; } 00062 00063 _GLIBCXX_END_NAMESPACE 00064 00065 #define _GLIBCXX_MOVE(_Tp) std::move(_Tp) 00066 #else 00067 #define _GLIBCXX_MOVE(_Tp) (_Tp) 00068 #endif 00069 00070 _GLIBCXX_BEGIN_NAMESPACE(std) 00071 00072 /** 00073 * @brief Swaps two values. 00074 * @param a A thing of arbitrary type. 00075 * @param b Another thing of arbitrary type. 00076 * @return Nothing. 00077 */ 00078 template<typename _Tp> 00079 inline void 00080 swap(_Tp& __a, _Tp& __b) 00081 { 00082 // concept requirements 00083 __glibcxx_function_requires(_SGIAssignableConcept<_Tp>) 00084 00085 _Tp __tmp = _GLIBCXX_MOVE(__a); 00086 __a = _GLIBCXX_MOVE(__b); 00087 __b = _GLIBCXX_MOVE(__tmp); 00088 } 00089 00090 _GLIBCXX_END_NAMESPACE 00091 00092 #endif /* _STL_MOVE_H */