Home | History | Annotate | Download | only in bits
      1 // Move, forward and identity for C++0x + swap -*- C++ -*-
      2 
      3 // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the
      7 // terms of the GNU General Public License as published by the
      8 // Free Software Foundation; either version 3, or (at your option)
      9 // any later version.
     10 
     11 // This library is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 
     16 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file move.h
     26  *  This is an internal header file, included by other library headers.
     27  *  You should not attempt to use it directly.
     28  */
     29 
     30 #ifndef _MOVE_H
     31 #define _MOVE_H 1
     32 
     33 #include <bits/c++config.h>
     34 #include <cstddef>
     35 #include <bits/concept_check.h>
     36 
     37 #ifdef __GXX_EXPERIMENTAL_CXX0X__
     38 #include <type_traits>
     39 
     40 _GLIBCXX_BEGIN_NAMESPACE(std)
     41 
     42   // 20.2.2, forward/move
     43   template<typename _Tp>
     44     struct identity
     45     {
     46       typedef _Tp type;
     47     };
     48 
     49   template<typename _Tp>
     50     inline _Tp&&
     51     forward(typename std::identity<_Tp>::type&& __t)
     52     { return __t; }
     53 
     54   template<typename _Tp>
     55     inline typename std::remove_reference<_Tp>::type&&
     56     move(_Tp&& __t)
     57     { return __t; }
     58 
     59 _GLIBCXX_END_NAMESPACE
     60 
     61 #define _GLIBCXX_MOVE(_Tp) std::move(_Tp)
     62 #else
     63 #define _GLIBCXX_MOVE(_Tp) (_Tp)
     64 #endif
     65 
     66 _GLIBCXX_BEGIN_NAMESPACE(std)
     67 
     68   /**
     69    *  @brief Swaps two values.
     70    *  @param  a  A thing of arbitrary type.
     71    *  @param  b  Another thing of arbitrary type.
     72    *  @return   Nothing.
     73   */
     74   template<typename _Tp>
     75     inline void
     76     swap(_Tp& __a, _Tp& __b)
     77     {
     78       // concept requirements
     79       __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
     80 
     81       _Tp __tmp = _GLIBCXX_MOVE(__a);
     82       __a = _GLIBCXX_MOVE(__b);
     83       __b = _GLIBCXX_MOVE(__tmp);
     84     }
     85 
     86   // _GLIBCXX_RESOLVE_LIB_DEFECTS
     87   // DR 809. std::swap should be overloaded for array types.
     88   template<typename _Tp, size_t _Nm>
     89     inline void
     90     swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
     91     {
     92       for (size_t __n = 0; __n < _Nm; ++__n)
     93 	swap(__a[__n], __b[__n]);
     94     }
     95 
     96 _GLIBCXX_END_NAMESPACE
     97 
     98 #endif /* _MOVE_H */
     99