# stl_move.h

Go to the documentation of this file.

    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 */