LCOV - code coverage report
Current view: directory - usr/include/c++/4.2.1/bits - stl_algobase.h (source / functions) Found Hit Coverage
Test: coverage.lcov Lines: 76 47 61.8 %
Date: 2014-06-18 Functions: 0 0 -

       1                 : // Bits and pieces used in algorithms -*- C++ -*-
       2                 : 
       3                 : // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
       4                 : // Free Software Foundation, Inc.
       5                 : //
       6                 : // This file is part of the GNU ISO C++ Library.  This library is free
       7                 : // software; you can redistribute it and/or modify it under the
       8                 : // terms of the GNU General Public License as published by the
       9                 : // Free Software Foundation; either version 2, or (at your option)
      10                 : // any later version.
      11                 : 
      12                 : // This library is distributed in the hope that it will be useful,
      13                 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      14                 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15                 : // GNU General Public License for more details.
      16                 : 
      17                 : // You should have received a copy of the GNU General Public License along
      18                 : // with this library; see the file COPYING.  If not, write to the Free
      19                 : // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
      20                 : // USA.
      21                 : 
      22                 : // As a special exception, you may use this file as part of a free software
      23                 : // library without restriction.  Specifically, if other files instantiate
      24                 : // templates or use macros or inline functions from this file, or you compile
      25                 : // this file and link it with other files to produce an executable, this
      26                 : // file does not by itself cause the resulting executable to be covered by
      27                 : // the GNU General Public License.  This exception does not however
      28                 : // invalidate any other reasons why the executable file might be covered by
      29                 : // the GNU General Public License.
      30                 : 
      31                 : /*
      32                 :  *
      33                 :  * Copyright (c) 1994
      34                 :  * Hewlett-Packard Company
      35                 :  *
      36                 :  * Permission to use, copy, modify, distribute and sell this software
      37                 :  * and its documentation for any purpose is hereby granted without fee,
      38                 :  * provided that the above copyright notice appear in all copies and
      39                 :  * that both that copyright notice and this permission notice appear
      40                 :  * in supporting documentation.  Hewlett-Packard Company makes no
      41                 :  * representations about the suitability of this software for any
      42                 :  * purpose.  It is provided "as is" without express or implied warranty.
      43                 :  *
      44                 :  *
      45                 :  * Copyright (c) 1996-1998
      46                 :  * Silicon Graphics Computer Systems, Inc.
      47                 :  *
      48                 :  * Permission to use, copy, modify, distribute and sell this software
      49                 :  * and its documentation for any purpose is hereby granted without fee,
      50                 :  * provided that the above copyright notice appear in all copies and
      51                 :  * that both that copyright notice and this permission notice appear
      52                 :  * in supporting documentation.  Silicon Graphics makes no
      53                 :  * representations about the suitability of this software for any
      54                 :  * purpose.  It is provided "as is" without express or implied warranty.
      55                 :  */
      56                 : 
      57                 : /** @file stl_algobase.h
      58                 :  *  This is an internal header file, included by other library headers.
      59                 :  *  You should not attempt to use it directly.
      60                 :  */
      61                 : 
      62                 : #ifndef _ALGOBASE_H
      63                 : #define _ALGOBASE_H 1
      64                 : 
      65                 : #include <bits/c++config.h>
      66                 : #include <cstring>
      67                 : #include <climits>
      68                 : #include <cstdlib>
      69                 : #include <cstddef>
      70                 : #include <iosfwd>
      71                 : #include <bits/stl_pair.h>
      72                 : #include <bits/cpp_type_traits.h>
      73                 : #include <ext/type_traits.h>
      74                 : #include <bits/stl_iterator_base_types.h>
      75                 : #include <bits/stl_iterator_base_funcs.h>
      76                 : #include <bits/stl_iterator.h>
      77                 : #include <bits/concept_check.h>
      78                 : #include <debug/debug.h>
      79                 : 
      80                 : _GLIBCXX_BEGIN_NAMESPACE(std)
      81                 : 
      82                 :   /**
      83                 :    *  @brief Swaps two values.
      84                 :    *  @param  a  A thing of arbitrary type.
      85                 :    *  @param  b  Another thing of arbitrary type.
      86                 :    *  @return   Nothing.
      87                 :    *
      88                 :    *  This is the simple classic generic implementation.  It will work on
      89                 :    *  any type which has a copy constructor and an assignment operator.
      90                 :   */
      91                 :   template<typename _Tp>
      92                 :     inline void
      93                 :     swap(_Tp& __a, _Tp& __b)
      94                 :     {
      95                 :       // concept requirements
      96                 :       __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
      97                 : 
      98                 :       _Tp __tmp = __a;
      99                 :       __a = __b;
     100                 :       __b = __tmp;
     101                 :     }
     102                 : 
     103                 :   // See http://gcc.gnu.org/ml/libstdc++/2004-08/msg00167.html: in a
     104                 :   // nutshell, we are partially implementing the resolution of DR 187,
     105                 :   // when it's safe, i.e., the value_types are equal.
     106                 :   template<bool _BoolType>
     107                 :     struct __iter_swap
     108                 :     {
     109                 :       template<typename _ForwardIterator1, typename _ForwardIterator2>
     110                 :         static void
     111                 :         iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
     112                 :         {
     113                 :           typedef typename iterator_traits<_ForwardIterator1>::value_type
     114                 :             _ValueType1;
     115                 :           _ValueType1 __tmp = *__a;
     116                 :           *__a = *__b;
     117                 :           *__b = __tmp; 
     118                 :         }
     119                 :     };
     120                 : 
     121                 :   template<>
     122                 :     struct __iter_swap<true>
     123                 :     {
     124                 :       template<typename _ForwardIterator1, typename _ForwardIterator2>
     125                 :         static void 
     126                 :         iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
     127                 :         {
     128                 :           swap(*__a, *__b);
     129                 :         }
     130                 :     };
     131                 : 
     132                 :   /**
     133                 :    *  @brief Swaps the contents of two iterators.
     134                 :    *  @param  a  An iterator.
     135                 :    *  @param  b  Another iterator.
     136                 :    *  @return   Nothing.
     137                 :    *
     138                 :    *  This function swaps the values pointed to by two iterators, not the
     139                 :    *  iterators themselves.
     140                 :   */
     141                 :   template<typename _ForwardIterator1, typename _ForwardIterator2>
     142                 :     inline void
     143                 :     iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
     144                 :     {
     145                 :       typedef typename iterator_traits<_ForwardIterator1>::value_type
     146                 :         _ValueType1;
     147                 :       typedef typename iterator_traits<_ForwardIterator2>::value_type
     148                 :         _ValueType2;
     149                 : 
     150                 :       // concept requirements
     151                 :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
     152                 :                                   _ForwardIterator1>)
     153                 :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
     154                 :                                   _ForwardIterator2>)
     155                 :       __glibcxx_function_requires(_ConvertibleConcept<_ValueType1,
     156                 :                                   _ValueType2>)
     157                 :       __glibcxx_function_requires(_ConvertibleConcept<_ValueType2,
     158                 :                                   _ValueType1>)
     159                 : 
     160                 :       typedef typename iterator_traits<_ForwardIterator1>::reference
     161                 :         _ReferenceType1;
     162                 :       typedef typename iterator_traits<_ForwardIterator2>::reference
     163                 :         _ReferenceType2;
     164                 :       std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value &&
     165                 :         __are_same<_ValueType1 &, _ReferenceType1>::__value &&
     166                 :         __are_same<_ValueType2 &, _ReferenceType2>::__value>::
     167                 :         iter_swap(__a, __b);
     168                 :     }
     169                 : 
     170                 :   /**
     171                 :    *  @brief This does what you think it does.
     172                 :    *  @param  a  A thing of arbitrary type.
     173                 :    *  @param  b  Another thing of arbitrary type.
     174                 :    *  @return   The lesser of the parameters.
     175                 :    *
     176                 :    *  This is the simple classic generic implementation.  It will work on
     177                 :    *  temporary expressions, since they are only evaluated once, unlike a
     178                 :    *  preprocessor macro.
     179                 :   */
     180                 :   template<typename _Tp>
     181                 :     inline const _Tp&
     182           23936 :     min(const _Tp& __a, const _Tp& __b)
     183                 :     {
     184                 :       // concept requirements
     185                 :       __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
     186                 :       //return __b < __a ? __b : __a;
     187           23936 :       if (__b < __a)
     188             127 :         return __b;
     189           23809 :       return __a;
     190           23936 :     }
     191                 : 
     192                 :   /**
     193                 :    *  @brief This does what you think it does.
     194                 :    *  @param  a  A thing of arbitrary type.
     195                 :    *  @param  b  Another thing of arbitrary type.
     196                 :    *  @return   The greater of the parameters.
     197                 :    *
     198                 :    *  This is the simple classic generic implementation.  It will work on
     199                 :    *  temporary expressions, since they are only evaluated once, unlike a
     200                 :    *  preprocessor macro.
     201                 :   */
     202                 :   template<typename _Tp>
     203                 :     inline const _Tp&
     204            6502 :     max(const _Tp& __a, const _Tp& __b)
     205                 :     {
     206                 :       // concept requirements
     207                 :       __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
     208                 :       //return  __a < __b ? __b : __a;
     209            6502 :       if (__a < __b)
     210            5857 :         return __b;
     211             645 :       return __a;
     212            6502 :     }
     213                 : 
     214                 :   /**
     215                 :    *  @brief This does what you think it does.
     216                 :    *  @param  a  A thing of arbitrary type.
     217                 :    *  @param  b  Another thing of arbitrary type.
     218                 :    *  @param  comp  A @link s20_3_3_comparisons comparison functor@endlink.
     219                 :    *  @return   The lesser of the parameters.
     220                 :    *
     221                 :    *  This will work on temporary expressions, since they are only evaluated
     222                 :    *  once, unlike a preprocessor macro.
     223                 :   */
     224                 :   template<typename _Tp, typename _Compare>
     225                 :     inline const _Tp&
     226                 :     min(const _Tp& __a, const _Tp& __b, _Compare __comp)
     227                 :     {
     228                 :       //return __comp(__b, __a) ? __b : __a;
     229                 :       if (__comp(__b, __a))
     230                 :         return __b;
     231                 :       return __a;
     232                 :     }
     233                 : 
     234                 :   /**
     235                 :    *  @brief This does what you think it does.
     236                 :    *  @param  a  A thing of arbitrary type.
     237                 :    *  @param  b  Another thing of arbitrary type.
     238                 :    *  @param  comp  A @link s20_3_3_comparisons comparison functor@endlink.
     239                 :    *  @return   The greater of the parameters.
     240                 :    *
     241                 :    *  This will work on temporary expressions, since they are only evaluated
     242                 :    *  once, unlike a preprocessor macro.
     243                 :   */
     244                 :   template<typename _Tp, typename _Compare>
     245                 :     inline const _Tp&
     246                 :     max(const _Tp& __a, const _Tp& __b, _Compare __comp)
     247                 :     {
     248                 :       //return __comp(__a, __b) ? __b : __a;
     249                 :       if (__comp(__a, __b))
     250                 :         return __b;
     251                 :       return __a;
     252                 :     }
     253                 : 
     254                 :   // All of these auxiliary structs serve two purposes.  (1) Replace
     255                 :   // calls to copy with memmove whenever possible.  (Memmove, not memcpy,
     256                 :   // because the input and output ranges are permitted to overlap.)
     257                 :   // (2) If we're using random access iterators, then write the loop as
     258                 :   // a for loop with an explicit count.
     259                 : 
     260                 :   template<bool, typename>
     261                 :     struct __copy
     262                 :     {
     263                 :       template<typename _II, typename _OI>
     264                 :         static _OI
     265                 :         copy(_II __first, _II __last, _OI __result)
     266                 :         {
     267                 :           for (; __first != __last; ++__result, ++__first)
     268                 :             *__result = *__first;
     269                 :           return __result;
     270                 :         }
     271                 :     };
     272                 : 
     273                 :   template<bool _BoolType>
     274                 :     struct __copy<_BoolType, random_access_iterator_tag>
     275                 :     {
     276                 :       template<typename _II, typename _OI>
     277                 :         static _OI
     278               0 :         copy(_II __first, _II __last, _OI __result)
     279                 :         { 
     280                 :           typedef typename iterator_traits<_II>::difference_type _Distance;
     281               0 :           for(_Distance __n = __last - __first; __n > 0; --__n)
     282                 :             {
     283               0 :               *__result = *__first;
     284               0 :               ++__first;
     285               0 :               ++__result;
     286               0 :             }
     287               0 :           return __result;
     288                 :         }
     289                 :     };
     290                 : 
     291                 :   template<>
     292                 :     struct __copy<true, random_access_iterator_tag>
     293                 :     {
     294                 :       template<typename _Tp>
     295                 :         static _Tp*
     296           20033 :         copy(const _Tp* __first, const _Tp* __last, _Tp* __result)
     297                 :         { 
     298           20033 :           std::memmove(__result, __first, sizeof(_Tp) * (__last - __first));
     299           20033 :           return __result + (__last - __first);
     300                 :         }
     301                 :     };
     302                 : 
     303                 :   template<typename _II, typename _OI>
     304                 :     inline _OI
     305           20033 :     __copy_aux(_II __first, _II __last, _OI __result)
     306                 :     {
     307                 :       typedef typename iterator_traits<_II>::value_type _ValueTypeI;
     308                 :       typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
     309                 :       typedef typename iterator_traits<_II>::iterator_category _Category;
     310           20033 :       const bool __simple = (__is_scalar<_ValueTypeI>::__value
     311                 :                              && __is_pointer<_II>::__value
     312                 :                              && __is_pointer<_OI>::__value
     313                 :                              && __are_same<_ValueTypeI, _ValueTypeO>::__value);
     314                 : 
     315           20033 :       return std::__copy<__simple, _Category>::copy(__first, __last, __result);
     316                 :     }
     317                 : 
     318                 :   // Helpers for streambuf iterators (either istream or ostream).
     319                 :   template<typename _CharT>
     320                 :   typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, 
     321                 :                                   ostreambuf_iterator<_CharT> >::__type
     322                 :     __copy_aux(_CharT*, _CharT*, ostreambuf_iterator<_CharT>);
     323                 : 
     324                 :   template<typename _CharT>
     325                 :     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, 
     326                 :                                     ostreambuf_iterator<_CharT> >::__type
     327                 :     __copy_aux(const _CharT*, const _CharT*, ostreambuf_iterator<_CharT>);
     328                 : 
     329                 :   template<typename _CharT>
     330                 :   typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, _CharT*>::__type
     331                 :     __copy_aux(istreambuf_iterator<_CharT>, istreambuf_iterator<_CharT>,
     332                 :                _CharT*);
     333                 : 
     334                 :   template<bool, bool>
     335                 :     struct __copy_normal
     336                 :     {
     337                 :       template<typename _II, typename _OI>
     338                 :         static _OI
     339           20027 :         __copy_n(_II __first, _II __last, _OI __result)
     340           20027 :         { return std::__copy_aux(__first, __last, __result); }
     341                 :     };
     342                 : 
     343                 :   template<>
     344                 :     struct __copy_normal<true, false>
     345                 :     {
     346                 :       template<typename _II, typename _OI>
     347                 :         static _OI
     348               6 :         __copy_n(_II __first, _II __last, _OI __result)
     349               6 :         { return std::__copy_aux(__first.base(), __last.base(), __result); }
     350                 :     };
     351                 : 
     352                 :   template<>
     353                 :     struct __copy_normal<false, true>
     354                 :     {
     355                 :       template<typename _II, typename _OI>
     356                 :         static _OI
     357                 :         __copy_n(_II __first, _II __last, _OI __result)
     358                 :         { return _OI(std::__copy_aux(__first, __last, __result.base())); }
     359                 :     };
     360                 : 
     361                 :   template<>
     362                 :     struct __copy_normal<true, true>
     363                 :     {
     364                 :       template<typename _II, typename _OI>
     365                 :         static _OI
     366               0 :         __copy_n(_II __first, _II __last, _OI __result)
     367               0 :         { return _OI(std::__copy_aux(__first.base(), __last.base(),
     368               0 :                                      __result.base())); }
     369                 :     };
     370                 : 
     371                 :   /**
     372                 :    *  @brief Copies the range [first,last) into result.
     373                 :    *  @param  first  An input iterator.
     374                 :    *  @param  last   An input iterator.
     375                 :    *  @param  result An output iterator.
     376                 :    *  @return   result + (last - first)
     377                 :    *
     378                 :    *  This inline function will boil down to a call to @c memmove whenever
     379                 :    *  possible.  Failing that, if random access iterators are passed, then the
     380                 :    *  loop count will be known (and therefore a candidate for compiler
     381                 :    *  optimizations such as unrolling).  Result may not be contained within
     382                 :    *  [first,last); the copy_backward function should be used instead.
     383                 :    *
     384                 :    *  Note that the end of the output range is permitted to be contained
     385                 :    *  within [first,last).
     386                 :   */
     387                 :   template<typename _InputIterator, typename _OutputIterator>
     388                 :     inline _OutputIterator
     389           20033 :     copy(_InputIterator __first, _InputIterator __last,
     390           20033 :          _OutputIterator __result)
     391                 :     {
     392                 :       // concept requirements
     393                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
     394                 :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator,
     395                 :             typename iterator_traits<_InputIterator>::value_type>)
     396                 :       __glibcxx_requires_valid_range(__first, __last);
     397                 : 
     398           20033 :        const bool __in = __is_normal_iterator<_InputIterator>::__value;
     399           20033 :        const bool __out = __is_normal_iterator<_OutputIterator>::__value;
     400           20033 :        return std::__copy_normal<__in, __out>::__copy_n(__first, __last,
     401                 :                                                         __result);
     402                 :     }
     403                 : 
     404                 :   // Overload for streambuf iterators.
     405                 :   template<typename _CharT>
     406                 :     typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, 
     407                 :                                     ostreambuf_iterator<_CharT> >::__type
     408                 :     copy(istreambuf_iterator<_CharT>, istreambuf_iterator<_CharT>,
     409                 :          ostreambuf_iterator<_CharT>);
     410                 : 
     411                 :   template<bool, typename>
     412                 :     struct __copy_backward
     413                 :     {
     414                 :       template<typename _BI1, typename _BI2>
     415                 :         static _BI2
     416                 :         __copy_b(_BI1 __first, _BI1 __last, _BI2 __result)
     417                 :         { 
     418                 :           while (__first != __last)
     419                 :             *--__result = *--__last;
     420                 :           return __result;
     421                 :         }
     422                 :     };
     423                 : 
     424                 :   template<bool _BoolType>
     425                 :     struct __copy_backward<_BoolType, random_access_iterator_tag>
     426                 :     {
     427                 :       template<typename _BI1, typename _BI2>
     428                 :         static _BI2
     429               0 :         __copy_b(_BI1 __first, _BI1 __last, _BI2 __result)
     430                 :         { 
     431               0 :           typename iterator_traits<_BI1>::difference_type __n;
     432               0 :           for (__n = __last - __first; __n > 0; --__n)
     433               0 :             *--__result = *--__last;
     434               0 :           return __result;
     435                 :         }
     436                 :     };
     437                 : 
     438                 :   template<>
     439                 :     struct __copy_backward<true, random_access_iterator_tag>
     440                 :     {
     441                 :       template<typename _Tp>
     442                 :         static _Tp*
     443               0 :         __copy_b(const _Tp* __first, const _Tp* __last, _Tp* __result)
     444                 :         { 
     445               0 :           const ptrdiff_t _Num = __last - __first;
     446               0 :           std::memmove(__result - _Num, __first, sizeof(_Tp) * _Num);
     447               0 :           return __result - _Num;
     448                 :         }
     449                 :     };
     450                 : 
     451                 :   template<typename _BI1, typename _BI2>
     452                 :     inline _BI2
     453               0 :     __copy_backward_aux(_BI1 __first, _BI1 __last, _BI2 __result)
     454                 :     {
     455                 :       typedef typename iterator_traits<_BI1>::value_type _ValueType1;
     456                 :       typedef typename iterator_traits<_BI2>::value_type _ValueType2;
     457                 :       typedef typename iterator_traits<_BI1>::iterator_category _Category;
     458               0 :       const bool __simple = (__is_scalar<_ValueType1>::__value
     459                 :                              && __is_pointer<_BI1>::__value
     460                 :                              && __is_pointer<_BI2>::__value
     461                 :                              && __are_same<_ValueType1, _ValueType2>::__value);
     462                 : 
     463               0 :       return std::__copy_backward<__simple, _Category>::__copy_b(__first,
     464                 :                                                                  __last,
     465                 :                                                                  __result);
     466                 :     }
     467                 : 
     468                 :   template<bool, bool>
     469                 :     struct __copy_backward_normal
     470                 :     {
     471                 :       template<typename _BI1, typename _BI2>
     472                 :         static _BI2
     473               0 :         __copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)
     474               0 :         { return std::__copy_backward_aux(__first, __last, __result); }
     475                 :     };
     476                 : 
     477                 :   template<>
     478                 :     struct __copy_backward_normal<true, false>
     479                 :     {
     480                 :       template<typename _BI1, typename _BI2>
     481                 :         static _BI2
     482                 :         __copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)
     483                 :         { return std::__copy_backward_aux(__first.base(), __last.base(),
     484                 :                                           __result); }
     485                 :     };
     486                 : 
     487                 :   template<>
     488                 :     struct __copy_backward_normal<false, true>
     489                 :     {
     490                 :       template<typename _BI1, typename _BI2>
     491                 :         static _BI2
     492                 :         __copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)
     493                 :         { return _BI2(std::__copy_backward_aux(__first, __last,
     494                 :                                                __result.base())); }
     495                 :     };
     496                 : 
     497                 :   template<>
     498                 :     struct __copy_backward_normal<true, true>
     499                 :     {
     500                 :       template<typename _BI1, typename _BI2>
     501                 :         static _BI2
     502                 :         __copy_b_n(_BI1 __first, _BI1 __last, _BI2 __result)
     503                 :         { return _BI2(std::__copy_backward_aux(__first.base(), __last.base(),
     504                 :                                                __result.base())); }
     505                 :     };
     506                 : 
     507                 :   /**
     508                 :    *  @brief Copies the range [first,last) into result.
     509                 :    *  @param  first  A bidirectional iterator.
     510                 :    *  @param  last   A bidirectional iterator.
     511                 :    *  @param  result A bidirectional iterator.
     512                 :    *  @return   result - (first - last)
     513                 :    *
     514                 :    *  The function has the same effect as copy, but starts at the end of the
     515                 :    *  range and works its way to the start, returning the start of the result.
     516                 :    *  This inline function will boil down to a call to @c memmove whenever
     517                 :    *  possible.  Failing that, if random access iterators are passed, then the
     518                 :    *  loop count will be known (and therefore a candidate for compiler
     519                 :    *  optimizations such as unrolling).
     520                 :    *
     521                 :    *  Result may not be in the range [first,last).  Use copy instead.  Note
     522                 :    *  that the start of the output range may overlap [first,last).
     523                 :   */
     524                 :   template <typename _BI1, typename _BI2>
     525                 :     inline _BI2
     526               0 :     copy_backward(_BI1 __first, _BI1 __last, _BI2 __result)
     527                 :     {
     528                 :       // concept requirements
     529                 :       __glibcxx_function_requires(_BidirectionalIteratorConcept<_BI1>)
     530                 :       __glibcxx_function_requires(_Mutable_BidirectionalIteratorConcept<_BI2>)
     531                 :       __glibcxx_function_requires(_ConvertibleConcept<
     532                 :             typename iterator_traits<_BI1>::value_type,
     533                 :             typename iterator_traits<_BI2>::value_type>)
     534                 :       __glibcxx_requires_valid_range(__first, __last);
     535                 : 
     536               0 :       const bool __bi1 = __is_normal_iterator<_BI1>::__value;
     537               0 :       const bool __bi2 = __is_normal_iterator<_BI2>::__value;
     538               0 :       return std::__copy_backward_normal<__bi1, __bi2>::__copy_b_n(__first,
     539                 :                                                                    __last,
     540                 :                                                                    __result);
     541                 :     }
     542                 : 
     543                 :   template<bool>
     544                 :     struct __fill
     545                 :     {
     546                 :       template<typename _ForwardIterator, typename _Tp>
     547                 :         static void
     548              58 :         fill(_ForwardIterator __first, _ForwardIterator __last,
     549              58 :              const _Tp& __value)
     550                 :         {
     551             116 :           for (; __first != __last; ++__first)
     552               0 :             *__first = __value;
     553              58 :         }
     554                 :     };
     555                 : 
     556                 :   template<>
     557                 :     struct __fill<true>
     558                 :     {
     559                 :       template<typename _ForwardIterator, typename _Tp>
     560                 :         static void
     561                 :         fill(_ForwardIterator __first, _ForwardIterator __last,
     562                 :              const _Tp& __value)
     563                 :         {
     564                 :           const _Tp __tmp = __value;
     565                 :           for (; __first != __last; ++__first)
     566                 :             *__first = __tmp;
     567                 :         }
     568                 :     };
     569                 : 
     570                 :   /**
     571                 :    *  @brief Fills the range [first,last) with copies of value.
     572                 :    *  @param  first  A forward iterator.
     573                 :    *  @param  last   A forward iterator.
     574                 :    *  @param  value  A reference-to-const of arbitrary type.
     575                 :    *  @return   Nothing.
     576                 :    *
     577                 :    *  This function fills a range with copies of the same value.  For one-byte
     578                 :    *  types filling contiguous areas of memory, this becomes an inline call to
     579                 :    *  @c memset.
     580                 :   */
     581                 :   template<typename _ForwardIterator, typename _Tp>
     582                 :     void
     583              58 :     fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value)
     584                 :     {
     585                 :       // concept requirements
     586                 :       __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
     587                 :                                   _ForwardIterator>)
     588                 :       __glibcxx_requires_valid_range(__first, __last);
     589                 : 
     590              58 :       const bool __scalar = __is_scalar<_Tp>::__value;
     591              58 :       std::__fill<__scalar>::fill(__first, __last, __value);
     592              58 :     }
     593                 : 
     594                 :   // Specialization: for one-byte types we can use memset.
     595                 :   inline void
     596            5212 :   fill(unsigned char* __first, unsigned char* __last, const unsigned char& __c)
     597                 :   {
     598                 :     __glibcxx_requires_valid_range(__first, __last);
     599            5212 :     const unsigned char __tmp = __c;
     600            5212 :     std::memset(__first, __tmp, __last - __first);
     601            5212 :   }
     602                 : 
     603                 :   inline void
     604                 :   fill(signed char* __first, signed char* __last, const signed char& __c)
     605                 :   {
     606                 :     __glibcxx_requires_valid_range(__first, __last);
     607                 :     const signed char __tmp = __c;
     608                 :     std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
     609                 :   }
     610                 : 
     611                 :   inline void
     612           16681 :   fill(char* __first, char* __last, const char& __c)
     613                 :   {
     614                 :     __glibcxx_requires_valid_range(__first, __last);
     615           16681 :     const char __tmp = __c;
     616           16681 :     std::memset(__first, static_cast<unsigned char>(__tmp), __last - __first);
     617           16681 :   }
     618                 : 
     619                 :   template<bool>
     620                 :     struct __fill_n
     621                 :     {
     622                 :       template<typename _OutputIterator, typename _Size, typename _Tp>
     623                 :         static _OutputIterator
     624                 :         fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
     625                 :         {
     626                 :           for (; __n > 0; --__n, ++__first)
     627                 :             *__first = __value;
     628                 :           return __first;
     629                 :         }
     630                 :     };
     631                 : 
     632                 :   template<>
     633                 :     struct __fill_n<true>
     634                 :     {
     635                 :       template<typename _OutputIterator, typename _Size, typename _Tp>
     636                 :         static _OutputIterator
     637                 :         fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
     638                 :         {
     639                 :           const _Tp __tmp = __value;
     640                 :           for (; __n > 0; --__n, ++__first)
     641                 :             *__first = __tmp;
     642                 :           return __first;         
     643                 :         }
     644                 :     };
     645                 : 
     646                 :   /**
     647                 :    *  @brief Fills the range [first,first+n) with copies of value.
     648                 :    *  @param  first  An output iterator.
     649                 :    *  @param  n      The count of copies to perform.
     650                 :    *  @param  value  A reference-to-const of arbitrary type.
     651                 :    *  @return   The iterator at first+n.
     652                 :    *
     653                 :    *  This function fills a range with copies of the same value.  For one-byte
     654                 :    *  types filling contiguous areas of memory, this becomes an inline call to
     655                 :    *  @c memset.
     656                 :   */
     657                 :   template<typename _OutputIterator, typename _Size, typename _Tp>
     658                 :     _OutputIterator
     659                 :     fill_n(_OutputIterator __first, _Size __n, const _Tp& __value)
     660                 :     {
     661                 :       // concept requirements
     662                 :       __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator, _Tp>)
     663                 : 
     664                 :       const bool __scalar = __is_scalar<_Tp>::__value;
     665                 :       return std::__fill_n<__scalar>::fill_n(__first, __n, __value);
     666                 :     }
     667                 : 
     668                 :   template<typename _Size>
     669                 :     inline unsigned char*
     670            5206 :     fill_n(unsigned char* __first, _Size __n, const unsigned char& __c)
     671                 :     {
     672            5206 :       std::fill(__first, __first + __n, __c);
     673            5206 :       return __first + __n;
     674                 :     }
     675                 : 
     676                 :   template<typename _Size>
     677                 :     inline signed char*
     678                 :     fill_n(signed char* __first, _Size __n, const signed char& __c)
     679                 :     {
     680                 :       std::fill(__first, __first + __n, __c);
     681                 :       return __first + __n;
     682                 :     }
     683                 : 
     684                 :   template<typename _Size>
     685                 :     inline char*
     686            8626 :     fill_n(char* __first, _Size __n, const char& __c)
     687                 :     {
     688            8626 :       std::fill(__first, __first + __n, __c);
     689            8626 :       return __first + __n;
     690                 :     }
     691                 : 
     692                 :   /**
     693                 :    *  @brief Finds the places in ranges which don't match.
     694                 :    *  @param  first1  An input iterator.
     695                 :    *  @param  last1   An input iterator.
     696                 :    *  @param  first2  An input iterator.
     697                 :    *  @return   A pair of iterators pointing to the first mismatch.
     698                 :    *
     699                 :    *  This compares the elements of two ranges using @c == and returns a pair
     700                 :    *  of iterators.  The first iterator points into the first range, the
     701                 :    *  second iterator points into the second range, and the elements pointed
     702                 :    *  to by the iterators are not equal.
     703                 :   */
     704                 :   template<typename _InputIterator1, typename _InputIterator2>
     705                 :     pair<_InputIterator1, _InputIterator2>
     706                 :     mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
     707                 :              _InputIterator2 __first2)
     708                 :     {
     709                 :       // concept requirements
     710                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
     711                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
     712                 :       __glibcxx_function_requires(_EqualOpConcept<
     713                 :             typename iterator_traits<_InputIterator1>::value_type,
     714                 :             typename iterator_traits<_InputIterator2>::value_type>)
     715                 :       __glibcxx_requires_valid_range(__first1, __last1);
     716                 : 
     717                 :       while (__first1 != __last1 && *__first1 == *__first2)
     718                 :         {
     719                 :           ++__first1;
     720                 :           ++__first2;
     721                 :         }
     722                 :       return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
     723                 :     }
     724                 : 
     725                 :   /**
     726                 :    *  @brief Finds the places in ranges which don't match.
     727                 :    *  @param  first1  An input iterator.
     728                 :    *  @param  last1   An input iterator.
     729                 :    *  @param  first2  An input iterator.
     730                 :    *  @param  binary_pred  A binary predicate @link s20_3_1_base functor@endlink.
     731                 :    *  @return   A pair of iterators pointing to the first mismatch.
     732                 :    *
     733                 :    *  This compares the elements of two ranges using the binary_pred
     734                 :    *  parameter, and returns a pair
     735                 :    *  of iterators.  The first iterator points into the first range, the
     736                 :    *  second iterator points into the second range, and the elements pointed
     737                 :    *  to by the iterators are not equal.
     738                 :   */
     739                 :   template<typename _InputIterator1, typename _InputIterator2,
     740                 :            typename _BinaryPredicate>
     741                 :     pair<_InputIterator1, _InputIterator2>
     742                 :     mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
     743                 :              _InputIterator2 __first2, _BinaryPredicate __binary_pred)
     744                 :     {
     745                 :       // concept requirements
     746                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
     747                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
     748                 :       __glibcxx_requires_valid_range(__first1, __last1);
     749                 : 
     750                 :       while (__first1 != __last1 && __binary_pred(*__first1, *__first2))
     751                 :         {
     752                 :           ++__first1;
     753                 :           ++__first2;
     754                 :         }
     755                 :       return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
     756                 :     }
     757                 : 
     758                 :   /**
     759                 :    *  @brief Tests a range for element-wise equality.
     760                 :    *  @param  first1  An input iterator.
     761                 :    *  @param  last1   An input iterator.
     762                 :    *  @param  first2  An input iterator.
     763                 :    *  @return   A boolean true or false.
     764                 :    *
     765                 :    *  This compares the elements of two ranges using @c == and returns true or
     766                 :    *  false depending on whether all of the corresponding elements of the
     767                 :    *  ranges are equal.
     768                 :   */
     769                 :   template<typename _InputIterator1, typename _InputIterator2>
     770                 :     inline bool
     771                 :     equal(_InputIterator1 __first1, _InputIterator1 __last1,
     772                 :           _InputIterator2 __first2)
     773                 :     {
     774                 :       // concept requirements
     775                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
     776                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
     777                 :       __glibcxx_function_requires(_EqualOpConcept<
     778                 :             typename iterator_traits<_InputIterator1>::value_type,
     779                 :             typename iterator_traits<_InputIterator2>::value_type>)
     780                 :       __glibcxx_requires_valid_range(__first1, __last1);
     781                 :       
     782                 :       for (; __first1 != __last1; ++__first1, ++__first2)
     783                 :         if (!(*__first1 == *__first2))
     784                 :           return false;
     785                 :       return true;
     786                 :     }
     787                 : 
     788                 :   /**
     789                 :    *  @brief Tests a range for element-wise equality.
     790                 :    *  @param  first1  An input iterator.
     791                 :    *  @param  last1   An input iterator.
     792                 :    *  @param  first2  An input iterator.
     793                 :    *  @param  binary_pred  A binary predicate @link s20_3_1_base functor@endlink.
     794                 :    *  @return   A boolean true or false.
     795                 :    *
     796                 :    *  This compares the elements of two ranges using the binary_pred
     797                 :    *  parameter, and returns true or
     798                 :    *  false depending on whether all of the corresponding elements of the
     799                 :    *  ranges are equal.
     800                 :   */
     801                 :   template<typename _InputIterator1, typename _InputIterator2,
     802                 :            typename _BinaryPredicate>
     803                 :     inline bool
     804                 :     equal(_InputIterator1 __first1, _InputIterator1 __last1,
     805                 :           _InputIterator2 __first2,
     806                 :           _BinaryPredicate __binary_pred)
     807                 :     {
     808                 :       // concept requirements
     809                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
     810                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
     811                 :       __glibcxx_requires_valid_range(__first1, __last1);
     812                 : 
     813                 :       for (; __first1 != __last1; ++__first1, ++__first2)
     814                 :         if (!__binary_pred(*__first1, *__first2))
     815                 :           return false;
     816                 :       return true;
     817                 :     }
     818                 : 
     819                 :   /**
     820                 :    *  @brief Performs "dictionary" comparison on ranges.
     821                 :    *  @param  first1  An input iterator.
     822                 :    *  @param  last1   An input iterator.
     823                 :    *  @param  first2  An input iterator.
     824                 :    *  @param  last2   An input iterator.
     825                 :    *  @return   A boolean true or false.
     826                 :    *
     827                 :    *  "Returns true if the sequence of elements defined by the range
     828                 :    *  [first1,last1) is lexicographically less than the sequence of elements
     829                 :    *  defined by the range [first2,last2).  Returns false otherwise."
     830                 :    *  (Quoted from [25.3.8]/1.)  If the iterators are all character pointers,
     831                 :    *  then this is an inline call to @c memcmp.
     832                 :   */
     833                 :   template<typename _InputIterator1, typename _InputIterator2>
     834                 :     bool
     835                 :     lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
     836                 :                             _InputIterator2 __first2, _InputIterator2 __last2)
     837                 :     {
     838                 :       // concept requirements
     839                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
     840                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
     841                 :       __glibcxx_function_requires(_LessThanOpConcept<
     842                 :             typename iterator_traits<_InputIterator1>::value_type,
     843                 :             typename iterator_traits<_InputIterator2>::value_type>)
     844                 :       __glibcxx_function_requires(_LessThanOpConcept<
     845                 :             typename iterator_traits<_InputIterator2>::value_type,
     846                 :             typename iterator_traits<_InputIterator1>::value_type>)
     847                 :       __glibcxx_requires_valid_range(__first1, __last1);
     848                 :       __glibcxx_requires_valid_range(__first2, __last2);
     849                 : 
     850                 :       for (; __first1 != __last1 && __first2 != __last2;
     851                 :            ++__first1, ++__first2)
     852                 :         {
     853                 :           if (*__first1 < *__first2)
     854                 :             return true;
     855                 :           if (*__first2 < *__first1)
     856                 :             return false;
     857                 :         }
     858                 :       return __first1 == __last1 && __first2 != __last2;
     859                 :     }
     860                 : 
     861                 :   /**
     862                 :    *  @brief Performs "dictionary" comparison on ranges.
     863                 :    *  @param  first1  An input iterator.
     864                 :    *  @param  last1   An input iterator.
     865                 :    *  @param  first2  An input iterator.
     866                 :    *  @param  last2   An input iterator.
     867                 :    *  @param  comp  A @link s20_3_3_comparisons comparison functor@endlink.
     868                 :    *  @return   A boolean true or false.
     869                 :    *
     870                 :    *  The same as the four-parameter @c lexigraphical_compare, but uses the
     871                 :    *  comp parameter instead of @c <.
     872                 :   */
     873                 :   template<typename _InputIterator1, typename _InputIterator2,
     874                 :            typename _Compare>
     875                 :     bool
     876                 :     lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
     877                 :                             _InputIterator2 __first2, _InputIterator2 __last2,
     878                 :                             _Compare __comp)
     879                 :     {
     880                 :       // concept requirements
     881                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator1>)
     882                 :       __glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
     883                 :       __glibcxx_requires_valid_range(__first1, __last1);
     884                 :       __glibcxx_requires_valid_range(__first2, __last2);
     885                 : 
     886                 :       for (; __first1 != __last1 && __first2 != __last2;
     887                 :            ++__first1, ++__first2)
     888                 :         {
     889                 :           if (__comp(*__first1, *__first2))
     890                 :             return true;
     891                 :           if (__comp(*__first2, *__first1))
     892                 :             return false;
     893                 :         }
     894                 :       return __first1 == __last1 && __first2 != __last2;
     895                 :     }
     896                 : 
     897                 :   inline bool
     898                 :   lexicographical_compare(const unsigned char* __first1,
     899                 :                           const unsigned char* __last1,
     900                 :                           const unsigned char* __first2,
     901                 :                           const unsigned char* __last2)
     902                 :   {
     903                 :     __glibcxx_requires_valid_range(__first1, __last1);
     904                 :     __glibcxx_requires_valid_range(__first2, __last2);
     905                 : 
     906                 :     const size_t __len1 = __last1 - __first1;
     907                 :     const size_t __len2 = __last2 - __first2;
     908                 :     const int __result = std::memcmp(__first1, __first2,
     909                 :                                      std::min(__len1, __len2));
     910                 :     return __result != 0 ? __result < 0 : __len1 < __len2;
     911                 :   }
     912                 : 
     913                 :   inline bool
     914                 :   lexicographical_compare(const char* __first1, const char* __last1,
     915                 :                           const char* __first2, const char* __last2)
     916                 :   {
     917                 :     __glibcxx_requires_valid_range(__first1, __last1);
     918                 :     __glibcxx_requires_valid_range(__first2, __last2);
     919                 : 
     920                 : #if CHAR_MAX == SCHAR_MAX
     921                 :     return std::lexicographical_compare((const signed char*) __first1,
     922                 :                                         (const signed char*) __last1,
     923                 :                                         (const signed char*) __first2,
     924                 :                                         (const signed char*) __last2);
     925                 : #else /* CHAR_MAX == SCHAR_MAX */
     926                 :     return std::lexicographical_compare((const unsigned char*) __first1,
     927                 :                                         (const unsigned char*) __last1,
     928                 :                                         (const unsigned char*) __first2,
     929                 :                                         (const unsigned char*) __last2);
     930                 : #endif /* CHAR_MAX == SCHAR_MAX */
     931                 :   }
     932                 : 
     933                 : _GLIBCXX_END_NAMESPACE
     934                 : 
     935                 : #endif

Generated by: LCOV version 1.7