------- Comment #4 from singler at ira dot uka dot de  2007-10-19 08:39 -------
There are other places in regular stl_algo.h where
iterator_traits<It>::value_type is assumed, not only for concept checking, but
for actual functionality, e. g. 

  template<typename _InputIterator, typename _OutputIterator>
    _OutputIterator
    __unique_copy(_InputIterator __first, _InputIterator __last,
                  _OutputIterator __result,
                  input_iterator_tag, output_iterator_tag)
    {
      // concept requirements -- taken care of in dispatching function
      typename iterator_traits<_InputIterator>::value_type __value = *__first;
      *__result = __value;
      while (++__first != __last)
        if (!(__value == *__first))
          {
            __value = *__first;
            *++__result = __value;
          }
      return ++__result;
    }



  template<typename _RandomAccessIterator>
    void
    __rotate(_RandomAccessIterator __first,
             _RandomAccessIterator __middle,
             _RandomAccessIterator __last,
             random_access_iterator_tag)
    {
      // concept requirements
      __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
                                  _RandomAccessIterator>)

      if (__first == __middle || __last  == __middle)
        return;

      typedef typename iterator_traits<_RandomAccessIterator>::difference_type
        _Distance;
      typedef typename iterator_traits<_RandomAccessIterator>::value_type
        _ValueType;

      const _Distance __n = __last   - __first;
      const _Distance __k = __middle - __first;
      const _Distance __l = __n - __k;

      if (__k == __l)
        {
          std::swap_ranges(__first, __middle, __middle);
          return;
        }

      const _Distance __d = std::__gcd(__n, __k);

      for (_Distance __i = 0; __i < __d; __i++)
        {
          _ValueType __tmp = _GLIBCXX_MOVE(*__first);
...

  template<typename _ForwardIterator, typename _Predicate>
    _ForwardIterator
    stable_partition(_ForwardIterator __first, _ForwardIterator __last,
                     _Predicate __pred)
    {
      // concept requirements
      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<
                                  _ForwardIterator>)
      __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,
            typename iterator_traits<_ForwardIterator>::value_type>)
      __glibcxx_requires_valid_range(__first, __last);

      if (__first == __last)
        return __first;
      else
        {
          typedef typename iterator_traits<_ForwardIterator>::value_type
            _ValueType;
          typedef typename iterator_traits<_ForwardIterator>::difference_type
            _DistanceType;

          _Temporary_buffer<_ForwardIterator, _ValueType> __buf(__first,
                                                                __last);
...

and many more...

-- Johannes


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33490

Reply via email to