LCOV - app.info - /tools/gcc-4.5/include/c++/4.5.2/bits/move.h

LCOV - code coverage report
| Current view: | directory - tools/gcc-4.5/include/c++/4.5.2/bits - move.h (source / functions) |  | Found | Hit | Coverage |
| Test: | app.info | Lines: | 11 | 11 | 100.0 %
| Date: | 2012-04-07 | Functions: | 108 | 72 | 66.7 %

           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> // Brings in std::declval too.
          39                 :
          40                 : _GLIBCXX_BEGIN_NAMESPACE(std)
          41                 :
          42                 :   /// identity
          43                 :   template<typename _Tp>
          44                 :     struct identity
          45                 :     {
          46                 :       typedef _Tp type;
          47                 :     };
          48                 :
          49                 :   /// forward (as per N2835)
          50                 :   /// Forward lvalues as rvalues.
          51                 :   template<typename _Tp>
          52                 :     inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
          53       151678600 :     forward(typename std::identity<_Tp>::type& __t)
          54       151678600 :     { return static_cast<_Tp&&>(__t); }
          55                 :
          56                 :   /// Forward rvalues as rvalues.
          57                 :   template<typename _Tp>
          58                 :     inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
          59                 :     forward(typename std::identity<_Tp>::type&& __t)
          60                 :     { return static_cast<_Tp&&>(__t); }
          61                 :
          62                 :   // Forward lvalues as lvalues.
          63                 :   template<typename _Tp>
          64                 :     inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
          65        94729639 :     forward(typename std::identity<_Tp>::type __t)
          66        94729639 :     { return __t; }
          67                 :
          68                 :   // Prevent forwarding rvalues as const lvalues.
          69                 :   template<typename _Tp>
          70                 :     inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
          71                 :     forward(typename std::remove_reference<_Tp>::type&& __t) = delete;
          72                 :
          73                 :   /**
          74                 :    *  @brief Move a value.
          75                 :    *  @ingroup mutating_algorithms
          76                 :    *  @param  __t  A thing of arbitrary type.
          77                 :    *  @return Same, moved.
          78                 :   */
          79                 :   template<typename _Tp>
          80                 :     inline typename std::remove_reference<_Tp>::type&&
          81        47380056 :     move(_Tp&& __t)
          82        47380056 :     { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
          83                 :
          84                 :   /// declval, from type_traits.
          85                 :
          86                 : _GLIBCXX_END_NAMESPACE
          87                 :
          88                 : #define _GLIBCXX_MOVE(_Tp) std::move(_Tp)
          89                 : #define _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val)
          90                 : #else
          91                 : #define _GLIBCXX_MOVE(_Tp) (_Tp)
          92                 : #define _GLIBCXX_FORWARD(_Tp, __val) (__val)
          93                 : #endif
          94                 :
          95                 : _GLIBCXX_BEGIN_NAMESPACE(std)
          96                 :
          97                 :   /**
          98                 :    *  @brief Swaps two values.
          99                 :    *  @ingroup mutating_algorithms
         100                 :    *  @param  __a  A thing of arbitrary type.
         101                 :    *  @param  __b  Another thing of arbitrary type.
         102                 :    *  @return   Nothing.
         103                 :   */
         104                 :   template<typename _Tp>
         105                 :     inline void
         106         6108448 :     swap(_Tp& __a, _Tp& __b)
         107                 :     {
         108                 :       // concept requirements
         109                 :       __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
         110                 :
         111         6108448 :       _Tp __tmp = _GLIBCXX_MOVE(__a);
         112         6108448 :       __a = _GLIBCXX_MOVE(__b);
         113         6108448 :       __b = _GLIBCXX_MOVE(__tmp);
         114         6108448 :     }
         115                 :
         116                 :   // _GLIBCXX_RESOLVE_LIB_DEFECTS
         117                 :   // DR 809. std::swap should be overloaded for array types.
         118                 :   template<typename _Tp, size_t _Nm>
         119                 :     inline void
         120                 :     swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
         121                 :     {
         122                 :       for (size_t __n = 0; __n < _Nm; ++__n)
         123                 :         swap(__a[__n], __b[__n]);
         124                 :     }
         125                 :
         126                 : _GLIBCXX_END_NAMESPACE
         127                 :
         128                 : #endif /* _MOVE_H */

Generated by: LCOV version 1.7