1951a39d68df598db08dfced8b4707755864a0492Ying Wang// Move, forward and identity for C++0x + swap -*- C++ -*-
2951a39d68df598db08dfced8b4707755864a0492Ying Wang
3951a39d68df598db08dfced8b4707755864a0492Ying Wang// Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
4951a39d68df598db08dfced8b4707755864a0492Ying Wang//
5951a39d68df598db08dfced8b4707755864a0492Ying Wang// This file is part of the GNU ISO C++ Library.  This library is free
6951a39d68df598db08dfced8b4707755864a0492Ying Wang// software; you can redistribute it and/or modify it under the
7951a39d68df598db08dfced8b4707755864a0492Ying Wang// terms of the GNU General Public License as published by the
8951a39d68df598db08dfced8b4707755864a0492Ying Wang// Free Software Foundation; either version 3, or (at your option)
9951a39d68df598db08dfced8b4707755864a0492Ying Wang// any later version.
10951a39d68df598db08dfced8b4707755864a0492Ying Wang
11951a39d68df598db08dfced8b4707755864a0492Ying Wang// This library is distributed in the hope that it will be useful,
12951a39d68df598db08dfced8b4707755864a0492Ying Wang// but WITHOUT ANY WARRANTY; without even the implied warranty of
13951a39d68df598db08dfced8b4707755864a0492Ying Wang// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14951a39d68df598db08dfced8b4707755864a0492Ying Wang// GNU General Public License for more details.
15951a39d68df598db08dfced8b4707755864a0492Ying Wang
16951a39d68df598db08dfced8b4707755864a0492Ying Wang// Under Section 7 of GPL version 3, you are granted additional
17951a39d68df598db08dfced8b4707755864a0492Ying Wang// permissions described in the GCC Runtime Library Exception, version
18951a39d68df598db08dfced8b4707755864a0492Ying Wang// 3.1, as published by the Free Software Foundation.
19951a39d68df598db08dfced8b4707755864a0492Ying Wang
20951a39d68df598db08dfced8b4707755864a0492Ying Wang// You should have received a copy of the GNU General Public License and
21951a39d68df598db08dfced8b4707755864a0492Ying Wang// a copy of the GCC Runtime Library Exception along with this program;
22951a39d68df598db08dfced8b4707755864a0492Ying Wang// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23951a39d68df598db08dfced8b4707755864a0492Ying Wang// <http://www.gnu.org/licenses/>.
24951a39d68df598db08dfced8b4707755864a0492Ying Wang
25951a39d68df598db08dfced8b4707755864a0492Ying Wang/** @file move.h
26951a39d68df598db08dfced8b4707755864a0492Ying Wang *  This is an internal header file, included by other library headers.
27951a39d68df598db08dfced8b4707755864a0492Ying Wang *  You should not attempt to use it directly.
28951a39d68df598db08dfced8b4707755864a0492Ying Wang */
29951a39d68df598db08dfced8b4707755864a0492Ying Wang
30951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _MOVE_H
31951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _MOVE_H 1
32951a39d68df598db08dfced8b4707755864a0492Ying Wang
33951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <bits/c++config.h>
34951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <cstddef>
35951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <bits/concept_check.h>
36951a39d68df598db08dfced8b4707755864a0492Ying Wang
37951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef __GXX_EXPERIMENTAL_CXX0X__
38951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <type_traits>
39951a39d68df598db08dfced8b4707755864a0492Ying Wang
40951a39d68df598db08dfced8b4707755864a0492Ying Wang_GLIBCXX_BEGIN_NAMESPACE(std)
41951a39d68df598db08dfced8b4707755864a0492Ying Wang
42951a39d68df598db08dfced8b4707755864a0492Ying Wang  // 20.2.2, forward/move
43951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _Tp>
44951a39d68df598db08dfced8b4707755864a0492Ying Wang    struct identity
45951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
46951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _Tp type;
47951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
48951a39d68df598db08dfced8b4707755864a0492Ying Wang
49951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _Tp>
50951a39d68df598db08dfced8b4707755864a0492Ying Wang    inline _Tp&&
51951a39d68df598db08dfced8b4707755864a0492Ying Wang    forward(typename std::identity<_Tp>::type&& __t)
52951a39d68df598db08dfced8b4707755864a0492Ying Wang    { return __t; }
53951a39d68df598db08dfced8b4707755864a0492Ying Wang
54951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _Tp>
55951a39d68df598db08dfced8b4707755864a0492Ying Wang    inline typename std::remove_reference<_Tp>::type&&
56951a39d68df598db08dfced8b4707755864a0492Ying Wang    move(_Tp&& __t)
57951a39d68df598db08dfced8b4707755864a0492Ying Wang    { return __t; }
58951a39d68df598db08dfced8b4707755864a0492Ying Wang
59951a39d68df598db08dfced8b4707755864a0492Ying Wang_GLIBCXX_END_NAMESPACE
60951a39d68df598db08dfced8b4707755864a0492Ying Wang
61951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _GLIBCXX_MOVE(_Tp) std::move(_Tp)
62951a39d68df598db08dfced8b4707755864a0492Ying Wang#else
63951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _GLIBCXX_MOVE(_Tp) (_Tp)
64951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
65951a39d68df598db08dfced8b4707755864a0492Ying Wang
66951a39d68df598db08dfced8b4707755864a0492Ying Wang_GLIBCXX_BEGIN_NAMESPACE(std)
67951a39d68df598db08dfced8b4707755864a0492Ying Wang
68951a39d68df598db08dfced8b4707755864a0492Ying Wang  /**
69951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  @brief Swaps two values.
70951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  @param  a  A thing of arbitrary type.
71951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  @param  b  Another thing of arbitrary type.
72951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  @return   Nothing.
73951a39d68df598db08dfced8b4707755864a0492Ying Wang  */
74951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _Tp>
75951a39d68df598db08dfced8b4707755864a0492Ying Wang    inline void
76951a39d68df598db08dfced8b4707755864a0492Ying Wang    swap(_Tp& __a, _Tp& __b)
77951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
78951a39d68df598db08dfced8b4707755864a0492Ying Wang      // concept requirements
79951a39d68df598db08dfced8b4707755864a0492Ying Wang      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
80951a39d68df598db08dfced8b4707755864a0492Ying Wang
81951a39d68df598db08dfced8b4707755864a0492Ying Wang      _Tp __tmp = _GLIBCXX_MOVE(__a);
82951a39d68df598db08dfced8b4707755864a0492Ying Wang      __a = _GLIBCXX_MOVE(__b);
83951a39d68df598db08dfced8b4707755864a0492Ying Wang      __b = _GLIBCXX_MOVE(__tmp);
84951a39d68df598db08dfced8b4707755864a0492Ying Wang    }
85951a39d68df598db08dfced8b4707755864a0492Ying Wang
86951a39d68df598db08dfced8b4707755864a0492Ying Wang  // _GLIBCXX_RESOLVE_LIB_DEFECTS
87951a39d68df598db08dfced8b4707755864a0492Ying Wang  // DR 809. std::swap should be overloaded for array types.
88951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _Tp, size_t _Nm>
89951a39d68df598db08dfced8b4707755864a0492Ying Wang    inline void
90951a39d68df598db08dfced8b4707755864a0492Ying Wang    swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
91951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
92951a39d68df598db08dfced8b4707755864a0492Ying Wang      for (size_t __n = 0; __n < _Nm; ++__n)
93951a39d68df598db08dfced8b4707755864a0492Ying Wang	swap(__a[__n], __b[__n]);
94951a39d68df598db08dfced8b4707755864a0492Ying Wang    }
95951a39d68df598db08dfced8b4707755864a0492Ying Wang
96951a39d68df598db08dfced8b4707755864a0492Ying Wang_GLIBCXX_END_NAMESPACE
97951a39d68df598db08dfced8b4707755864a0492Ying Wang
98951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif /* _MOVE_H */
99