mirror of git://gcc.gnu.org/git/gcc.git
stl_algo.h (__unguarded_partition_pivot, [...]): New.
2009-08-24 Chris Jefferson <chris@bubblescope.net> * include/stl_algo.h (__unguarded_partition_pivot, __move_median_first): New. (__insertion_sort, __unguarded_insertion_sort): Adjust for move-only types. (__unguarded_linear_insert): Assume always inserting value at __last. (__unguarded_partition): Take pivot by reference. (__introsort_loop, __introselect) : Use __unguarded_partition_pivot. * testsuite/25_algorithms/nth_element/moveable.cc : Enable. From-SVN: r151055
This commit is contained in:
parent
2ef4a8e14a
commit
f9590eae5f
|
@ -1,3 +1,14 @@
|
||||||
|
2009-08-24 Chris Jefferson <chris@bubblescope.net>
|
||||||
|
|
||||||
|
* include/stl_algo.h (__unguarded_partition_pivot,
|
||||||
|
__move_median_first): New.
|
||||||
|
(__insertion_sort, __unguarded_insertion_sort): Adjust for move-only
|
||||||
|
types.
|
||||||
|
(__unguarded_linear_insert): Assume always inserting value at __last.
|
||||||
|
(__unguarded_partition): Take pivot by reference.
|
||||||
|
(__introsort_loop, __introselect) : Use __unguarded_partition_pivot.
|
||||||
|
* testsuite/25_algorithms/nth_element/moveable.cc : Enable.
|
||||||
|
|
||||||
2009-08-23 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
2009-08-23 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
|
||||||
|
|
||||||
* libsupc++/Makefile.am (LTCOMPILE): Expand $(LIBTOOLFLAGS)
|
* libsupc++/Makefile.am (LTCOMPILE): Expand $(LIBTOOLFLAGS)
|
||||||
|
|
|
@ -136,6 +136,56 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
return __b;
|
return __b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Swaps the median value of *__a, *__b and *__c to *__a
|
||||||
|
template<typename _Iterator>
|
||||||
|
void
|
||||||
|
__move_median_first(_Iterator __a, _Iterator __b, _Iterator __c)
|
||||||
|
{
|
||||||
|
// concept requirements
|
||||||
|
__glibcxx_function_requires(_LessThanComparableConcept<
|
||||||
|
typename iterator_traits<_Iterator>::value_type>)
|
||||||
|
|
||||||
|
if (*__a < *__b)
|
||||||
|
{
|
||||||
|
if (*__b < *__c)
|
||||||
|
std::iter_swap(__a, __b);
|
||||||
|
else if (*__a < *__c)
|
||||||
|
std::iter_swap(__a, __c);
|
||||||
|
}
|
||||||
|
else if (*__a < *__c)
|
||||||
|
return;
|
||||||
|
else if (*__b < *__c)
|
||||||
|
std::iter_swap(__a, __c);
|
||||||
|
else
|
||||||
|
std::iter_swap(__a, __b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Swaps the median value of *__a, *__b and *__c under __comp to *__a
|
||||||
|
template<typename _Iterator, typename _Compare>
|
||||||
|
void
|
||||||
|
__move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
|
||||||
|
_Compare __comp)
|
||||||
|
{
|
||||||
|
// concept requirements
|
||||||
|
__glibcxx_function_requires(_BinaryFunctionConcept<_Compare, bool,
|
||||||
|
typename iterator_traits<_Iterator>::value_type,
|
||||||
|
typename iterator_traits<_Iterator>::value_type>)
|
||||||
|
|
||||||
|
if (__comp(*__a, *__b))
|
||||||
|
{
|
||||||
|
if (__comp(*__b, *__c))
|
||||||
|
std::iter_swap(__a, __b);
|
||||||
|
else if (__comp(*__a, *__c))
|
||||||
|
std::iter_swap(__a, __c);
|
||||||
|
}
|
||||||
|
else if (__comp(*__a, *__c))
|
||||||
|
return;
|
||||||
|
else if (__comp(*__b, *__c))
|
||||||
|
std::iter_swap(__a, __c);
|
||||||
|
else
|
||||||
|
std::iter_swap(__a, __b);
|
||||||
|
}
|
||||||
|
|
||||||
// for_each
|
// for_each
|
||||||
|
|
||||||
/// This is an overload used by find() for the Input Iterator case.
|
/// This is an overload used by find() for the Input Iterator case.
|
||||||
|
@ -2058,36 +2108,40 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is a helper function for the sort routine.
|
/// This is a helper function for the sort routine.
|
||||||
template<typename _RandomAccessIterator, typename _Tp>
|
template<typename _RandomAccessIterator>
|
||||||
void
|
void
|
||||||
__unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val)
|
__unguarded_linear_insert(_RandomAccessIterator __last)
|
||||||
{
|
{
|
||||||
|
typename iterator_traits<_RandomAccessIterator>::value_type
|
||||||
|
__val = _GLIBCXX_MOVE(*__last);
|
||||||
_RandomAccessIterator __next = __last;
|
_RandomAccessIterator __next = __last;
|
||||||
--__next;
|
--__next;
|
||||||
while (__val < *__next)
|
while (__val < *__next)
|
||||||
{
|
{
|
||||||
*__last = *__next;
|
*__last = _GLIBCXX_MOVE(*__next);
|
||||||
__last = __next;
|
__last = __next;
|
||||||
--__next;
|
--__next;
|
||||||
}
|
}
|
||||||
*__last = __val;
|
*__last = _GLIBCXX_MOVE(__val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is a helper function for the sort routine.
|
/// This is a helper function for the sort routine.
|
||||||
template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
|
template<typename _RandomAccessIterator, typename _Compare>
|
||||||
void
|
void
|
||||||
__unguarded_linear_insert(_RandomAccessIterator __last, _Tp __val,
|
__unguarded_linear_insert(_RandomAccessIterator __last,
|
||||||
_Compare __comp)
|
_Compare __comp)
|
||||||
{
|
{
|
||||||
|
typename iterator_traits<_RandomAccessIterator>::value_type
|
||||||
|
__val = _GLIBCXX_MOVE(*__last);
|
||||||
_RandomAccessIterator __next = __last;
|
_RandomAccessIterator __next = __last;
|
||||||
--__next;
|
--__next;
|
||||||
while (__comp(__val, *__next))
|
while (__comp(__val, *__next))
|
||||||
{
|
{
|
||||||
*__last = *__next;
|
*__last = _GLIBCXX_MOVE(*__next);
|
||||||
__last = __next;
|
__last = __next;
|
||||||
--__next;
|
--__next;
|
||||||
}
|
}
|
||||||
*__last = __val;
|
*__last = _GLIBCXX_MOVE(__val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is a helper function for the sort routine.
|
/// This is a helper function for the sort routine.
|
||||||
|
@ -2101,15 +2155,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
|
|
||||||
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
|
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
|
||||||
{
|
{
|
||||||
typename iterator_traits<_RandomAccessIterator>::value_type
|
if (*__i < *__first)
|
||||||
__val = *__i;
|
|
||||||
if (__val < *__first)
|
|
||||||
{
|
{
|
||||||
std::copy_backward(__first, __i, __i + 1);
|
typename iterator_traits<_RandomAccessIterator>::value_type
|
||||||
*__first = __val;
|
__val = _GLIBCXX_MOVE(*__i);
|
||||||
|
_GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
|
||||||
|
*__first = _GLIBCXX_MOVE(__val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
std::__unguarded_linear_insert(__i, __val);
|
std::__unguarded_linear_insert(__i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2123,15 +2177,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
|
|
||||||
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
|
for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
|
||||||
{
|
{
|
||||||
typename iterator_traits<_RandomAccessIterator>::value_type
|
if (__comp(*__i, *__first))
|
||||||
__val = *__i;
|
|
||||||
if (__comp(__val, *__first))
|
|
||||||
{
|
{
|
||||||
std::copy_backward(__first, __i, __i + 1);
|
typename iterator_traits<_RandomAccessIterator>::value_type
|
||||||
*__first = __val;
|
__val = _GLIBCXX_MOVE(*__i);
|
||||||
|
_GLIBCXX_MOVE_BACKWARD3(__first, __i, __i + 1);
|
||||||
|
*__first = _GLIBCXX_MOVE(__val);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
std::__unguarded_linear_insert(__i, __val, __comp);
|
std::__unguarded_linear_insert(__i, __comp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2145,7 +2199,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
_ValueType;
|
_ValueType;
|
||||||
|
|
||||||
for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
|
for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
|
||||||
std::__unguarded_linear_insert(__i, _ValueType(*__i));
|
std::__unguarded_linear_insert(__i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is a helper function for the sort routine.
|
/// This is a helper function for the sort routine.
|
||||||
|
@ -2158,7 +2212,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
_ValueType;
|
_ValueType;
|
||||||
|
|
||||||
for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
|
for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
|
||||||
std::__unguarded_linear_insert(__i, _ValueType(*__i), __comp);
|
std::__unguarded_linear_insert(__i, __comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2202,7 +2256,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
template<typename _RandomAccessIterator, typename _Tp>
|
template<typename _RandomAccessIterator, typename _Tp>
|
||||||
_RandomAccessIterator
|
_RandomAccessIterator
|
||||||
__unguarded_partition(_RandomAccessIterator __first,
|
__unguarded_partition(_RandomAccessIterator __first,
|
||||||
_RandomAccessIterator __last, _Tp __pivot)
|
_RandomAccessIterator __last, const _Tp& __pivot)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -2223,7 +2277,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
_RandomAccessIterator
|
_RandomAccessIterator
|
||||||
__unguarded_partition(_RandomAccessIterator __first,
|
__unguarded_partition(_RandomAccessIterator __first,
|
||||||
_RandomAccessIterator __last,
|
_RandomAccessIterator __last,
|
||||||
_Tp __pivot, _Compare __comp)
|
const _Tp& __pivot, _Compare __comp)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -2239,6 +2293,29 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This is a helper function...
|
||||||
|
template<typename _RandomAccessIterator>
|
||||||
|
inline _RandomAccessIterator
|
||||||
|
__unguarded_partition_pivot(_RandomAccessIterator __first,
|
||||||
|
_RandomAccessIterator __last)
|
||||||
|
{
|
||||||
|
_RandomAccessIterator __mid = __first + (__last - __first) / 2;
|
||||||
|
std::__move_median_first(__first, __mid, (__last - 1));
|
||||||
|
return std::__unguarded_partition(__first + 1, __last, *__first);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// This is a helper function...
|
||||||
|
template<typename _RandomAccessIterator, typename _Compare>
|
||||||
|
inline _RandomAccessIterator
|
||||||
|
__unguarded_partition_pivot(_RandomAccessIterator __first,
|
||||||
|
_RandomAccessIterator __last, _Compare __comp)
|
||||||
|
{
|
||||||
|
_RandomAccessIterator __mid = __first + (__last - __first) / 2;
|
||||||
|
std::__move_median_first(__first, __mid, (__last - 1), __comp);
|
||||||
|
return std::__unguarded_partition(__first + 1, __last, *__first, __comp);
|
||||||
|
}
|
||||||
|
|
||||||
/// This is a helper function for the sort routine.
|
/// This is a helper function for the sort routine.
|
||||||
template<typename _RandomAccessIterator, typename _Size>
|
template<typename _RandomAccessIterator, typename _Size>
|
||||||
void
|
void
|
||||||
|
@ -2246,9 +2323,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
_RandomAccessIterator __last,
|
_RandomAccessIterator __last,
|
||||||
_Size __depth_limit)
|
_Size __depth_limit)
|
||||||
{
|
{
|
||||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
|
||||||
_ValueType;
|
|
||||||
|
|
||||||
while (__last - __first > int(_S_threshold))
|
while (__last - __first > int(_S_threshold))
|
||||||
{
|
{
|
||||||
if (__depth_limit == 0)
|
if (__depth_limit == 0)
|
||||||
|
@ -2258,14 +2332,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
}
|
}
|
||||||
--__depth_limit;
|
--__depth_limit;
|
||||||
_RandomAccessIterator __cut =
|
_RandomAccessIterator __cut =
|
||||||
std::__unguarded_partition(__first, __last,
|
std::__unguarded_partition_pivot(__first, __last);
|
||||||
_ValueType(std::__median(*__first,
|
|
||||||
*(__first
|
|
||||||
+ (__last
|
|
||||||
- __first)
|
|
||||||
/ 2),
|
|
||||||
*(__last
|
|
||||||
- 1))));
|
|
||||||
std::__introsort_loop(__cut, __last, __depth_limit);
|
std::__introsort_loop(__cut, __last, __depth_limit);
|
||||||
__last = __cut;
|
__last = __cut;
|
||||||
}
|
}
|
||||||
|
@ -2278,9 +2345,6 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
_RandomAccessIterator __last,
|
_RandomAccessIterator __last,
|
||||||
_Size __depth_limit, _Compare __comp)
|
_Size __depth_limit, _Compare __comp)
|
||||||
{
|
{
|
||||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
|
||||||
_ValueType;
|
|
||||||
|
|
||||||
while (__last - __first > int(_S_threshold))
|
while (__last - __first > int(_S_threshold))
|
||||||
{
|
{
|
||||||
if (__depth_limit == 0)
|
if (__depth_limit == 0)
|
||||||
|
@ -2290,15 +2354,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
}
|
}
|
||||||
--__depth_limit;
|
--__depth_limit;
|
||||||
_RandomAccessIterator __cut =
|
_RandomAccessIterator __cut =
|
||||||
std::__unguarded_partition(__first, __last,
|
std::__unguarded_partition_pivot(__first, __last, __comp);
|
||||||
_ValueType(std::__median(*__first,
|
|
||||||
*(__first
|
|
||||||
+ (__last
|
|
||||||
- __first)
|
|
||||||
/ 2),
|
|
||||||
*(__last - 1),
|
|
||||||
__comp)),
|
|
||||||
__comp);
|
|
||||||
std::__introsort_loop(__cut, __last, __depth_limit, __comp);
|
std::__introsort_loop(__cut, __last, __depth_limit, __comp);
|
||||||
__last = __cut;
|
__last = __cut;
|
||||||
}
|
}
|
||||||
|
@ -2349,14 +2405,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
}
|
}
|
||||||
--__depth_limit;
|
--__depth_limit;
|
||||||
_RandomAccessIterator __cut =
|
_RandomAccessIterator __cut =
|
||||||
std::__unguarded_partition(__first, __last,
|
std::__unguarded_partition_pivot(__first, __last);
|
||||||
_ValueType(std::__median(*__first,
|
|
||||||
*(__first
|
|
||||||
+ (__last
|
|
||||||
- __first)
|
|
||||||
/ 2),
|
|
||||||
*(__last
|
|
||||||
- 1))));
|
|
||||||
if (__cut <= __nth)
|
if (__cut <= __nth)
|
||||||
__first = __cut;
|
__first = __cut;
|
||||||
else
|
else
|
||||||
|
@ -2385,15 +2434,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
|
||||||
}
|
}
|
||||||
--__depth_limit;
|
--__depth_limit;
|
||||||
_RandomAccessIterator __cut =
|
_RandomAccessIterator __cut =
|
||||||
std::__unguarded_partition(__first, __last,
|
std::__unguarded_partition_pivot(__first, __last, __comp);
|
||||||
_ValueType(std::__median(*__first,
|
|
||||||
*(__first
|
|
||||||
+ (__last
|
|
||||||
- __first)
|
|
||||||
/ 2),
|
|
||||||
*(__last - 1),
|
|
||||||
__comp)),
|
|
||||||
__comp);
|
|
||||||
if (__cut <= __nth)
|
if (__cut <= __nth)
|
||||||
__first = __cut;
|
__first = __cut;
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
// { dg-require-rvalref "" }
|
|
||||||
// { dg-options "-std=gnu++0x" }
|
// { dg-options "-std=gnu++0x" }
|
||||||
|
|
||||||
// Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc.
|
// Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc.
|
||||||
|
|
Loading…
Reference in New Issue