predefined_ops.h: New.
2013-09-27 François Dumont <fdumont@gcc.gnu.org> * include/bits/predefined_ops.h: New. * include/bits/stl_heap.h: Include <bits/predefined_ops.h>. (__is_heap_until, __push_heap, __adjust_heap, __pop_heap): Remove algo duplication. (__is_heap): Adapt. (__make_heap): New. (make_heap): Adapt to use latter. (__sort_heap): New. (sort_heap): Adapt to use latter. * include/bits/algobase.h: Include <bits/predefined_ops.h>. (__lexicographical_compare_impl): New. (__lexicographical_compare<false>::__lc): Adapt to use latter. (lexicographical_compare): Likewise. (__lower_bound): New. (lower_bound): Adapt to use latter. (equal): Use _GLIBCXX_STD_A::equal in N3671 overloads. (__mismatch): New. (mismatch): Use latter. * include/bits/algo.h: Include <bits/predefined_ops.h>. Remove <functional> include. (__move_median_first, __find, __find_if, __find_if_not): Remove algo duplication. (__find_end): Likewise. (__search_n): Rename into ... (__search_n_aux): ... this. (__search_n): Renew, use latter. (search_n): Use latter. (__search): New. (search): Use latter. (__find_end): Likewise. (__remove_copy_if): New. (remove_copy): Use latter. (__adjacent_find): New. (adjacent_find): Use latter. (__unique): New. (unique): Use latter. (__unique_copy): Remove algo duplication. (__stable_partition): New. (stable_partition): Use latter. (__heap_select): Remove algo duplication, use __make_heap. (__partial_sort): New, use latter. (partial_sort): Use latter. (__partial_sort_copy): New. (partial_sort_copy): Use latter. (__unguarded_linear_insert, __insertion_sort): Remove algo duplication. (__unguarded_insertion_sort, __final_insertion_sort): Likewise. (__unguarded_partition, __unguarded_partition_pivot): Likewise. (__partial_sort): New. (partial_sort): Use latter. (__sort): New. (sort): Use latter. (lower_bound): Use __lower_bound. (__upper_bound): New. (upper_bound): Use latter. (__equal_range): New. (equal_range): Use latter. (__move_merge_adaptive, __move_merge_adaptive_backward): Remove algo duplication. (__merge_adaptive, __merge_without_buffer): Likewise. (__inplace_merge): New. (inplace_merge): Use latter. (__move_merge, __merge_sort_loop, __chunk_insertion_sort): Remove algo duplication. (__merge_sort_with_buffer, __stable_sort_adaptive): Likewise. (__inplace_stable_sort): Likewise. (__include): New. (includes): Use latter. (__next_permutation): New. (next_permutation): Use latter. (__prev_permutation): New. (prev_permutation): Use latter. (__replace_copy_if): New. (replace_copy): Use latter. (__is_sorted_until): New. (is_sorted_unitl): Use latter. (__minmax_element): New. (minmax_element): Use latter. (__is_permutation): New. (is_permutation): Use latter. (__adjacent_find): New. (adjacent_find): Use latter. (__count_if): New. (count): Use latter. (count_if): Likewise. (__merge): New. (merge): Use latter. (__stable_sort): New. (stable_sort): Use latter. (__set_union): New. (set_union): Use latter. (__set_intersection): New. (set_intersection): Use latter. (__set_difference): New. (set_difference): Use latter. (__set_symmetric_difference): New. (set_symmetric_difference): Use latter. (__min_element): New. (min_element): Use latter. (__max_element): New. (max_element): Use latter. * include/Makefile.am: Add predefined_ops.h. * include/Makefile.in: Regenerate. * include/parallel/algobase.h (equal, mismatch): Add overloads from N3671. * testsuite/25_algorithms/is_permutation/vectorbool.cc: New. * testsuite/25_algorithms/adjacent_find/vectorbool.cc: Likewise. * testsuite/25_algorithms/find/vectorbool.cc: Likewise. * testsuite/25_algorithms/find_if/vectorbool.cc: Likewise. * testsuite/25_algorithms/find_first_of/vectorbool.cc: Likewise. * testsuite/25_algorithms/heap/vectorbool.cc: Likewise. * testsuite/25_algorithms/find_end/vectorbool.cc: Likewise. * testsuite/25_algorithms/find_if_not/vectorbool.cc: Likewise. From-SVN: r202992
This commit is contained in:
parent
522d4efcd3
commit
ea89b2482f
@ -1,4 +1,120 @@
|
||||
2013-08-07 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||
2013-09-27 François Dumont <fdumont@gcc.gnu.org>
|
||||
|
||||
* include/bits/predefined_ops.h: New.
|
||||
* include/bits/stl_heap.h: Include <bits/predefined_ops.h>.
|
||||
(__is_heap_until, __push_heap, __adjust_heap, __pop_heap): Remove
|
||||
algo duplication.
|
||||
(__is_heap): Adapt.
|
||||
(__make_heap): New.
|
||||
(make_heap): Adapt to use latter.
|
||||
(__sort_heap): New.
|
||||
(sort_heap): Adapt to use latter.
|
||||
* include/bits/algobase.h: Include <bits/predefined_ops.h>.
|
||||
(__lexicographical_compare_impl): New.
|
||||
(__lexicographical_compare<false>::__lc): Adapt to use latter.
|
||||
(lexicographical_compare): Likewise.
|
||||
(__lower_bound): New.
|
||||
(lower_bound): Adapt to use latter.
|
||||
(equal): Use _GLIBCXX_STD_A::equal in N3671 overloads.
|
||||
(__mismatch): New.
|
||||
(mismatch): Use latter.
|
||||
* include/bits/algo.h: Include <bits/predefined_ops.h>. Remove
|
||||
<functional> include.
|
||||
(__move_median_first, __find, __find_if, __find_if_not): Remove
|
||||
algo duplication.
|
||||
(__find_end): Likewise.
|
||||
(__search_n): Rename into ...
|
||||
(__search_n_aux): ... this.
|
||||
(__search_n): Renew, use latter.
|
||||
(search_n): Use latter.
|
||||
(__search): New.
|
||||
(search): Use latter.
|
||||
(__find_end): Likewise.
|
||||
(__remove_copy_if): New.
|
||||
(remove_copy): Use latter.
|
||||
(__adjacent_find): New.
|
||||
(adjacent_find): Use latter.
|
||||
(__unique): New.
|
||||
(unique): Use latter.
|
||||
(__unique_copy): Remove algo duplication.
|
||||
(__stable_partition): New.
|
||||
(stable_partition): Use latter.
|
||||
(__heap_select): Remove algo duplication, use __make_heap.
|
||||
(__partial_sort): New, use latter.
|
||||
(partial_sort): Use latter.
|
||||
(__partial_sort_copy): New.
|
||||
(partial_sort_copy): Use latter.
|
||||
(__unguarded_linear_insert, __insertion_sort): Remove algo
|
||||
duplication.
|
||||
(__unguarded_insertion_sort, __final_insertion_sort): Likewise.
|
||||
(__unguarded_partition, __unguarded_partition_pivot): Likewise.
|
||||
(__partial_sort): New.
|
||||
(partial_sort): Use latter.
|
||||
(__sort): New.
|
||||
(sort): Use latter.
|
||||
(lower_bound): Use __lower_bound.
|
||||
(__upper_bound): New.
|
||||
(upper_bound): Use latter.
|
||||
(__equal_range): New.
|
||||
(equal_range): Use latter.
|
||||
(__move_merge_adaptive, __move_merge_adaptive_backward): Remove
|
||||
algo duplication.
|
||||
(__merge_adaptive, __merge_without_buffer): Likewise.
|
||||
(__inplace_merge): New.
|
||||
(inplace_merge): Use latter.
|
||||
(__move_merge, __merge_sort_loop, __chunk_insertion_sort): Remove
|
||||
algo duplication.
|
||||
(__merge_sort_with_buffer, __stable_sort_adaptive): Likewise.
|
||||
(__inplace_stable_sort): Likewise.
|
||||
(__include): New.
|
||||
(includes): Use latter.
|
||||
(__next_permutation): New.
|
||||
(next_permutation): Use latter.
|
||||
(__prev_permutation): New.
|
||||
(prev_permutation): Use latter.
|
||||
(__replace_copy_if): New.
|
||||
(replace_copy): Use latter.
|
||||
(__is_sorted_until): New.
|
||||
(is_sorted_unitl): Use latter.
|
||||
(__minmax_element): New.
|
||||
(minmax_element): Use latter.
|
||||
(__is_permutation): New.
|
||||
(is_permutation): Use latter.
|
||||
(__adjacent_find): New.
|
||||
(adjacent_find): Use latter.
|
||||
(__count_if): New.
|
||||
(count): Use latter.
|
||||
(count_if): Likewise.
|
||||
(__merge): New.
|
||||
(merge): Use latter.
|
||||
(__stable_sort): New.
|
||||
(stable_sort): Use latter.
|
||||
(__set_union): New.
|
||||
(set_union): Use latter.
|
||||
(__set_intersection): New.
|
||||
(set_intersection): Use latter.
|
||||
(__set_difference): New.
|
||||
(set_difference): Use latter.
|
||||
(__set_symmetric_difference): New.
|
||||
(set_symmetric_difference): Use latter.
|
||||
(__min_element): New.
|
||||
(min_element): Use latter.
|
||||
(__max_element): New.
|
||||
(max_element): Use latter.
|
||||
* include/Makefile.am: Add predefined_ops.h.
|
||||
* include/Makefile.in: Regenerate.
|
||||
* include/parallel/algobase.h (equal, mismatch): Add overloads
|
||||
from N3671.
|
||||
* testsuite/25_algorithms/is_permutation/vectorbool.cc: New.
|
||||
* testsuite/25_algorithms/adjacent_find/vectorbool.cc: Likewise.
|
||||
* testsuite/25_algorithms/find/vectorbool.cc: Likewise.
|
||||
* testsuite/25_algorithms/find_if/vectorbool.cc: Likewise.
|
||||
* testsuite/25_algorithms/find_first_of/vectorbool.cc: Likewise.
|
||||
* testsuite/25_algorithms/heap/vectorbool.cc: Likewise.
|
||||
* testsuite/25_algorithms/find_end/vectorbool.cc: Likewise.
|
||||
* testsuite/25_algorithms/find_if_not/vectorbool.cc: Likewise.
|
||||
|
||||
2013-09-27 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||
|
||||
PR libstdc++/57465
|
||||
* include/std/functional
|
||||
|
@ -121,6 +121,7 @@ bits_headers = \
|
||||
${bits_srcdir}/ostream_insert.h \
|
||||
${bits_srcdir}/parse_numbers.h \
|
||||
${bits_srcdir}/postypes.h \
|
||||
${bits_srcdir}/predefined_ops.h \
|
||||
${bits_srcdir}/ptr_traits.h \
|
||||
${bits_srcdir}/random.h \
|
||||
${bits_srcdir}/random.tcc \
|
||||
|
@ -388,6 +388,7 @@ bits_headers = \
|
||||
${bits_srcdir}/ostream_insert.h \
|
||||
${bits_srcdir}/parse_numbers.h \
|
||||
${bits_srcdir}/postypes.h \
|
||||
${bits_srcdir}/predefined_ops.h \
|
||||
${bits_srcdir}/ptr_traits.h \
|
||||
${bits_srcdir}/random.h \
|
||||
${bits_srcdir}/random.tcc \
|
||||
|
304
libstdc++-v3/include/bits/predefined_ops.h
Normal file
304
libstdc++-v3/include/bits/predefined_ops.h
Normal file
@ -0,0 +1,304 @@
|
||||
// Default predicates for internal use -*- C++ -*-
|
||||
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// Under Section 7 of GPL version 3, you are granted additional
|
||||
// permissions described in the GCC Runtime Library Exception, version
|
||||
// 3.1, as published by the Free Software Foundation.
|
||||
|
||||
// You should have received a copy of the GNU General Public License and
|
||||
// a copy of the GCC Runtime Library Exception along with this program;
|
||||
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
/** @file predefined_ops.h
|
||||
* This is an internal header file, included by other library headers.
|
||||
* You should not attempt to use it directly.
|
||||
*/
|
||||
|
||||
#ifndef _GLIBCXX_PREDEFINED_OPS_H
|
||||
#define _GLIBCXX_PREDEFINED_OPS_H 1
|
||||
|
||||
namespace __gnu_cxx
|
||||
{
|
||||
namespace __ops
|
||||
{
|
||||
struct _Iter_less_iter
|
||||
{
|
||||
template<typename _Iterator1, typename _Iterator2>
|
||||
bool
|
||||
operator()(_Iterator1 __it1, _Iterator2 __it2) const
|
||||
{ return *__it1 < *__it2; }
|
||||
};
|
||||
|
||||
inline _Iter_less_iter
|
||||
__iter_less_iter()
|
||||
{ return _Iter_less_iter(); }
|
||||
|
||||
struct _Iter_less_val
|
||||
{
|
||||
template<typename _Iterator, typename _Value>
|
||||
bool
|
||||
operator()(_Iterator __it, _Value& __val) const
|
||||
{ return *__it < __val; }
|
||||
};
|
||||
|
||||
inline _Iter_less_val
|
||||
__iter_less_val()
|
||||
{ return _Iter_less_val(); }
|
||||
|
||||
inline _Iter_less_val
|
||||
__iter_comp_val(_Iter_less_iter)
|
||||
{ return _Iter_less_val(); }
|
||||
|
||||
struct _Val_less_iter
|
||||
{
|
||||
template<typename _Value, typename _Iterator>
|
||||
bool
|
||||
operator()(_Value& __val, _Iterator __it) const
|
||||
{ return __val < *__it; }
|
||||
};
|
||||
|
||||
inline _Val_less_iter
|
||||
__val_less_iter()
|
||||
{ return _Val_less_iter(); }
|
||||
|
||||
inline _Val_less_iter
|
||||
__val_comp_iter(_Iter_less_iter)
|
||||
{ return _Val_less_iter(); }
|
||||
|
||||
struct _Iter_equal_to_iter
|
||||
{
|
||||
template<typename _Iterator1, typename _Iterator2>
|
||||
bool
|
||||
operator()(_Iterator1 __it1, _Iterator2 __it2) const
|
||||
{ return *__it1 == *__it2; }
|
||||
};
|
||||
|
||||
inline _Iter_equal_to_iter
|
||||
__iter_equal_to_iter()
|
||||
{ return _Iter_equal_to_iter(); }
|
||||
|
||||
struct _Iter_equal_to_val
|
||||
{
|
||||
template<typename _Iterator, typename _Value>
|
||||
bool
|
||||
operator()(_Iterator __it, _Value& __val) const
|
||||
{ return *__it == __val; }
|
||||
};
|
||||
|
||||
inline _Iter_equal_to_val
|
||||
__iter_equal_to_val()
|
||||
{ return _Iter_equal_to_val(); }
|
||||
|
||||
inline _Iter_equal_to_val
|
||||
__iter_comp_val(_Iter_equal_to_iter)
|
||||
{ return _Iter_equal_to_val(); }
|
||||
|
||||
template<typename _Compare>
|
||||
struct _Iter_comp_iter
|
||||
{
|
||||
_Compare _M_comp;
|
||||
|
||||
_Iter_comp_iter(_Compare __comp)
|
||||
: _M_comp(__comp)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator1, typename _Iterator2>
|
||||
bool
|
||||
operator()(_Iterator1 __it1, _Iterator2 __it2)
|
||||
{ return bool(_M_comp(*__it1, *__it2)); }
|
||||
};
|
||||
|
||||
template<typename _Compare>
|
||||
inline _Iter_comp_iter<_Compare>
|
||||
__iter_comp_iter(_Compare __comp)
|
||||
{ return _Iter_comp_iter<_Compare>(__comp); }
|
||||
|
||||
template<typename _Compare>
|
||||
struct _Iter_comp_val
|
||||
{
|
||||
_Compare _M_comp;
|
||||
|
||||
_Iter_comp_val(_Compare __comp)
|
||||
: _M_comp(__comp)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator, typename _Value>
|
||||
bool
|
||||
operator()(_Iterator __it, _Value& __val)
|
||||
{ return bool(_M_comp(*__it, __val)); }
|
||||
};
|
||||
|
||||
template<typename _Compare>
|
||||
inline _Iter_comp_val<_Compare>
|
||||
__iter_comp_val(_Compare __comp)
|
||||
{ return _Iter_comp_val<_Compare>(__comp); }
|
||||
|
||||
template<typename _Compare>
|
||||
inline _Iter_comp_val<_Compare>
|
||||
__iter_comp_val(_Iter_comp_iter<_Compare> __comp)
|
||||
{ return _Iter_comp_val<_Compare>(__comp._M_comp); }
|
||||
|
||||
template<typename _Compare>
|
||||
struct _Val_comp_iter
|
||||
{
|
||||
_Compare _M_comp;
|
||||
|
||||
_Val_comp_iter(_Compare __comp)
|
||||
: _M_comp(__comp)
|
||||
{ }
|
||||
|
||||
template<typename _Value, typename _Iterator>
|
||||
bool
|
||||
operator()(_Value& __val, _Iterator __it)
|
||||
{ return bool(_M_comp(__val, *__it)); }
|
||||
};
|
||||
|
||||
template<typename _Compare>
|
||||
inline _Val_comp_iter<_Compare>
|
||||
__val_comp_iter(_Compare __comp)
|
||||
{ return _Val_comp_iter<_Compare>(__comp); }
|
||||
|
||||
template<typename _Compare>
|
||||
inline _Val_comp_iter<_Compare>
|
||||
__val_comp_iter(_Iter_comp_iter<_Compare> __comp)
|
||||
{ return _Val_comp_iter<_Compare>(__comp._M_comp); }
|
||||
|
||||
template<typename _Value>
|
||||
struct _Iter_equals_val
|
||||
{
|
||||
_Value& _M_value;
|
||||
|
||||
_Iter_equals_val(_Value& __value)
|
||||
: _M_value(__value)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator>
|
||||
bool
|
||||
operator()(_Iterator __it)
|
||||
{ return *__it == _M_value; }
|
||||
};
|
||||
|
||||
template<typename _Value>
|
||||
inline _Iter_equals_val<_Value>
|
||||
__iter_equals_val(_Value& __val)
|
||||
{ return _Iter_equals_val<_Value>(__val); }
|
||||
|
||||
template<typename _Iterator1>
|
||||
struct _Iter_equals_iter
|
||||
{
|
||||
typename std::iterator_traits<_Iterator1>::reference _M_ref;
|
||||
|
||||
_Iter_equals_iter(_Iterator1 __it1)
|
||||
: _M_ref(*__it1)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator2>
|
||||
bool
|
||||
operator()(_Iterator2 __it2)
|
||||
{ return *__it2 == _M_ref; }
|
||||
};
|
||||
|
||||
template<typename _Iterator>
|
||||
inline _Iter_equals_iter<_Iterator>
|
||||
__iter_comp_iter(_Iter_equal_to_iter, _Iterator __it)
|
||||
{ return _Iter_equals_iter<_Iterator>(__it); }
|
||||
|
||||
template<typename _Predicate>
|
||||
struct _Iter_pred
|
||||
{
|
||||
_Predicate _M_pred;
|
||||
|
||||
_Iter_pred(_Predicate __pred)
|
||||
: _M_pred(__pred)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator>
|
||||
bool
|
||||
operator()(_Iterator __it)
|
||||
{ return bool(_M_pred(*__it)); }
|
||||
};
|
||||
|
||||
template<typename _Predicate>
|
||||
inline _Iter_pred<_Predicate>
|
||||
__pred_iter(_Predicate __pred)
|
||||
{ return _Iter_pred<_Predicate>(__pred); }
|
||||
|
||||
template<typename _Compare, typename _Value>
|
||||
struct _Iter_comp_to_val
|
||||
{
|
||||
_Compare _M_comp;
|
||||
_Value& _M_value;
|
||||
|
||||
_Iter_comp_to_val(_Compare __comp, _Value& __value)
|
||||
: _M_comp(__comp), _M_value(__value)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator>
|
||||
bool
|
||||
operator()(_Iterator __it)
|
||||
{ return bool(_M_comp(*__it, _M_value)); }
|
||||
};
|
||||
|
||||
template<typename _Compare, typename _Value>
|
||||
_Iter_comp_to_val<_Compare, _Value>
|
||||
__iter_comp_val(_Compare __comp, _Value &__val)
|
||||
{ return _Iter_comp_to_val<_Compare, _Value>(__comp, __val); }
|
||||
|
||||
template<typename _Compare, typename _Iterator1>
|
||||
struct _Iter_comp_to_iter
|
||||
{
|
||||
_Compare _M_comp;
|
||||
typename std::iterator_traits<_Iterator1>::reference _M_ref;
|
||||
|
||||
_Iter_comp_to_iter(_Compare __comp, _Iterator1 __it1)
|
||||
: _M_comp(__comp), _M_ref(*__it1)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator2>
|
||||
bool
|
||||
operator()(_Iterator2 __it2)
|
||||
{ return bool(_M_comp(*__it2, _M_ref)); }
|
||||
};
|
||||
|
||||
template<typename _Compare, typename _Iterator>
|
||||
inline _Iter_comp_to_iter<_Compare, _Iterator>
|
||||
__iter_comp_iter(_Iter_comp_iter<_Compare> __comp, _Iterator __it)
|
||||
{ return _Iter_comp_to_iter<_Compare, _Iterator>(__comp._M_comp, __it); }
|
||||
|
||||
template<typename _Predicate>
|
||||
struct _Iter_negate
|
||||
{
|
||||
_Predicate _M_pred;
|
||||
|
||||
_Iter_negate(_Predicate __pred)
|
||||
: _M_pred(__pred)
|
||||
{ }
|
||||
|
||||
template<typename _Iterator>
|
||||
bool
|
||||
operator()(_Iterator __it)
|
||||
{ return !bool(_M_pred(*__it)); }
|
||||
};
|
||||
|
||||
template<typename _Predicate>
|
||||
inline _Iter_negate<_Predicate>
|
||||
__negate(_Iter_pred<_Predicate> __pred)
|
||||
{ return _Iter_negate<_Predicate>(__pred._M_pred); }
|
||||
|
||||
} // namespace __ops
|
||||
} // namespace __gnu_cxx
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -68,6 +68,7 @@
|
||||
#include <bits/concept_check.h>
|
||||
#include <debug/debug.h>
|
||||
#include <bits/move.h> // For std::swap and _GLIBCXX_MOVE
|
||||
#include <bits/predefined_ops.h>
|
||||
|
||||
namespace std _GLIBCXX_VISIBILITY(default)
|
||||
{
|
||||
@ -862,6 +863,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
{ return true; }
|
||||
};
|
||||
|
||||
template<typename _II1, typename _II2, typename _Compare>
|
||||
bool
|
||||
__lexicographical_compare_impl(_II1 __first1, _II1 __last1,
|
||||
_II2 __first2, _II2 __last2,
|
||||
_Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_II1>::iterator_category _Category1;
|
||||
typedef typename iterator_traits<_II2>::iterator_category _Category2;
|
||||
typedef std::__lc_rai<_Category1, _Category2> __rai_type;
|
||||
|
||||
__last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
|
||||
for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
|
||||
++__first1, ++__first2)
|
||||
{
|
||||
if (__comp(__first1, __first2))
|
||||
return true;
|
||||
if (__comp(__first2, __first1))
|
||||
return false;
|
||||
}
|
||||
return __first1 == __last1 && __first2 != __last2;
|
||||
}
|
||||
|
||||
template<bool _BoolType>
|
||||
struct __lexicographical_compare
|
||||
{
|
||||
@ -875,21 +898,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__lexicographical_compare<_BoolType>::
|
||||
__lc(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
|
||||
{
|
||||
typedef typename iterator_traits<_II1>::iterator_category _Category1;
|
||||
typedef typename iterator_traits<_II2>::iterator_category _Category2;
|
||||
typedef std::__lc_rai<_Category1, _Category2> __rai_type;
|
||||
|
||||
__last1 = __rai_type::__newlast1(__first1, __last1,
|
||||
__first2, __last2);
|
||||
for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
|
||||
++__first1, ++__first2)
|
||||
{
|
||||
if (*__first1 < *__first2)
|
||||
return true;
|
||||
if (*__first2 < *__first1)
|
||||
return false;
|
||||
}
|
||||
return __first1 == __last1 && __first2 != __last2;
|
||||
return std::__lexicographical_compare_impl(
|
||||
__first1, __last1, __first2, __last2,
|
||||
__gnu_cxx::__ops::__iter_less_iter());
|
||||
}
|
||||
|
||||
template<>
|
||||
@ -926,6 +937,33 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__first2, __last2);
|
||||
}
|
||||
|
||||
template<typename _ForwardIterator, typename _Tp, typename _Compare>
|
||||
_ForwardIterator
|
||||
__lower_bound(_ForwardIterator __first, _ForwardIterator __last,
|
||||
const _Tp& __val, _Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
_DistanceType __len = std::distance(__first, __last);
|
||||
|
||||
while (__len > 0)
|
||||
{
|
||||
_DistanceType __half = __len >> 1;
|
||||
_ForwardIterator __middle = __first;
|
||||
std::advance(__middle, __half);
|
||||
if (__comp(__middle, __val))
|
||||
{
|
||||
__first = __middle;
|
||||
++__first;
|
||||
__len = __len - __half - 1;
|
||||
}
|
||||
else
|
||||
__len = __half;
|
||||
}
|
||||
return __first;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Finds the first position in which @a val could be inserted
|
||||
* without changing the ordering.
|
||||
@ -942,35 +980,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
lower_bound(_ForwardIterator __first, _ForwardIterator __last,
|
||||
const _Tp& __val)
|
||||
{
|
||||
#ifdef _GLIBCXX_CONCEPT_CHECKS
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type
|
||||
_ValueType;
|
||||
#endif
|
||||
typedef typename iterator_traits<_ForwardIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
|
||||
__glibcxx_function_requires(_LessThanOpConcept<_ValueType, _Tp>)
|
||||
__glibcxx_function_requires(_LessThanOpConcept<
|
||||
typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
|
||||
__glibcxx_requires_partitioned_lower(__first, __last, __val);
|
||||
|
||||
_DistanceType __len = std::distance(__first, __last);
|
||||
|
||||
while (__len > 0)
|
||||
{
|
||||
_DistanceType __half = __len >> 1;
|
||||
_ForwardIterator __middle = __first;
|
||||
std::advance(__middle, __half);
|
||||
if (*__middle < __val)
|
||||
{
|
||||
__first = __middle;
|
||||
++__first;
|
||||
__len = __len - __half - 1;
|
||||
}
|
||||
else
|
||||
__len = __half;
|
||||
}
|
||||
return __first;
|
||||
return std::__lower_bound(__first, __last, __val,
|
||||
__gnu_cxx::__ops::__iter_less_val());
|
||||
}
|
||||
|
||||
/// This is a helper function for the sort routines and for random.tcc.
|
||||
@ -1100,7 +1117,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
auto __d2 = std::distance(__first2, __last2);
|
||||
if (__d1 != __d2)
|
||||
return false;
|
||||
return std::equal(__first1, __last1, __first2);
|
||||
return _GLIBCXX_STD_A::equal(__first1, __last1, __first2);
|
||||
}
|
||||
|
||||
for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
|
||||
@ -1146,7 +1163,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
auto __d2 = std::distance(__first2, __last2);
|
||||
if (__d1 != __d2)
|
||||
return false;
|
||||
return std::equal(__first1, __last1, __first2, __binary_pred);
|
||||
return _GLIBCXX_STD_A::equal(__first1, __last1, __first2,
|
||||
__binary_pred);
|
||||
}
|
||||
|
||||
for (; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
|
||||
@ -1212,26 +1230,29 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
lexicographical_compare(_II1 __first1, _II1 __last1,
|
||||
_II2 __first2, _II2 __last2, _Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_II1>::iterator_category _Category1;
|
||||
typedef typename iterator_traits<_II2>::iterator_category _Category2;
|
||||
typedef std::__lc_rai<_Category1, _Category2> __rai_type;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_II1>)
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_II2>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
__glibcxx_requires_valid_range(__first2, __last2);
|
||||
|
||||
__last1 = __rai_type::__newlast1(__first1, __last1, __first2, __last2);
|
||||
for (; __first1 != __last1 && __rai_type::__cnd2(__first2, __last2);
|
||||
++__first1, ++__first2)
|
||||
{
|
||||
if (__comp(*__first1, *__first2))
|
||||
return true;
|
||||
if (__comp(*__first2, *__first1))
|
||||
return false;
|
||||
}
|
||||
return __first1 == __last1 && __first2 != __last2;
|
||||
return std::__lexicographical_compare_impl
|
||||
(__first1, __last1, __first2, __last2,
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__comp));
|
||||
}
|
||||
|
||||
template<typename _InputIterator1, typename _InputIterator2,
|
||||
typename _BinaryPredicate>
|
||||
pair<_InputIterator1, _InputIterator2>
|
||||
__mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _BinaryPredicate __binary_pred)
|
||||
{
|
||||
while (__first1 != __last1 && __binary_pred(__first1, __first2))
|
||||
{
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1260,12 +1281,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
typename iterator_traits<_InputIterator2>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
|
||||
while (__first1 != __last1 && *__first1 == *__first2)
|
||||
{
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,
|
||||
__gnu_cxx::__ops::__iter_equal_to_iter());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1295,7 +1312,21 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator2>)
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
|
||||
while (__first1 != __last1 && bool(__binary_pred(*__first1, *__first2)))
|
||||
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2,
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
|
||||
}
|
||||
|
||||
#if __cplusplus > 201103L
|
||||
|
||||
template<typename _InputIterator1, typename _InputIterator2,
|
||||
typename _BinaryPredicate>
|
||||
pair<_InputIterator1, _InputIterator2>
|
||||
__mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_BinaryPredicate __binary_pred)
|
||||
{
|
||||
while (__first1 != __last1 && __first2 != __last2
|
||||
&& __binary_pred(__first1, __first2))
|
||||
{
|
||||
++__first1;
|
||||
++__first2;
|
||||
@ -1303,7 +1334,6 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
}
|
||||
|
||||
#if __cplusplus > 201103L
|
||||
/**
|
||||
* @brief Finds the places in ranges which don't match.
|
||||
* @ingroup non_mutating_algorithms
|
||||
@ -1332,13 +1362,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
__glibcxx_requires_valid_range(__first2, __last2);
|
||||
|
||||
while (__first1 != __last1 && __first2 != __last2
|
||||
&& *__first1 == *__first2)
|
||||
{
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,
|
||||
__gnu_cxx::__ops::__iter_equal_to_iter());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1371,13 +1396,8 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO
|
||||
__glibcxx_requires_valid_range(__first1, __last1);
|
||||
__glibcxx_requires_valid_range(__first2, __last2);
|
||||
|
||||
while (__first1 != __last1 && __first2 != __last2
|
||||
&& bool(__binary_pred(*__first1, *__first2)))
|
||||
{
|
||||
++__first1;
|
||||
++__first2;
|
||||
}
|
||||
return pair<_InputIterator1, _InputIterator2>(__first1, __first2);
|
||||
return _GLIBCXX_STD_A::__mismatch(__first1, __last1, __first2, __last2,
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__binary_pred));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -57,6 +57,7 @@
|
||||
|
||||
#include <debug/debug.h>
|
||||
#include <bits/move.h>
|
||||
#include <bits/predefined_ops.h>
|
||||
|
||||
namespace std _GLIBCXX_VISIBILITY(default)
|
||||
{
|
||||
@ -67,21 +68,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
* @ingroup sorting_algorithms
|
||||
*/
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance>
|
||||
_Distance
|
||||
__is_heap_until(_RandomAccessIterator __first, _Distance __n)
|
||||
{
|
||||
_Distance __parent = 0;
|
||||
for (_Distance __child = 1; __child < __n; ++__child)
|
||||
{
|
||||
if (__first[__parent] < __first[__child])
|
||||
return __child;
|
||||
if ((__child & 1) == 0)
|
||||
++__parent;
|
||||
}
|
||||
return __n;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance,
|
||||
typename _Compare>
|
||||
_Distance
|
||||
@ -91,7 +77,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
_Distance __parent = 0;
|
||||
for (_Distance __child = 1; __child < __n; ++__child)
|
||||
{
|
||||
if (__comp(__first[__parent], __first[__child]))
|
||||
if (__comp(__first + __parent, __first + __child))
|
||||
return __child;
|
||||
if ((__child & 1) == 0)
|
||||
++__parent;
|
||||
@ -104,13 +90,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
template<typename _RandomAccessIterator, typename _Distance>
|
||||
inline bool
|
||||
__is_heap(_RandomAccessIterator __first, _Distance __n)
|
||||
{ return std::__is_heap_until(__first, __n) == __n; }
|
||||
{
|
||||
return std::__is_heap_until(__first, __n,
|
||||
__gnu_cxx::__ops::__iter_less_iter()) == __n;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Compare,
|
||||
typename _Distance>
|
||||
inline bool
|
||||
__is_heap(_RandomAccessIterator __first, _Compare __comp, _Distance __n)
|
||||
{ return std::__is_heap_until(__first, __n, __comp) == __n; }
|
||||
{
|
||||
return std::__is_heap_until(__first, __n,
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__comp)) == __n;
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator>
|
||||
inline bool
|
||||
@ -126,13 +118,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap,
|
||||
// + is_heap and is_heap_until in C++0x.
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
|
||||
template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
|
||||
typename _Compare>
|
||||
void
|
||||
__push_heap(_RandomAccessIterator __first,
|
||||
_Distance __holeIndex, _Distance __topIndex, _Tp __value)
|
||||
_Distance __holeIndex, _Distance __topIndex, _Tp __value,
|
||||
_Compare __comp)
|
||||
{
|
||||
_Distance __parent = (__holeIndex - 1) / 2;
|
||||
while (__holeIndex > __topIndex && *(__first + __parent) < __value)
|
||||
while (__holeIndex > __topIndex && __comp(__first + __parent, __value))
|
||||
{
|
||||
*(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __parent));
|
||||
__holeIndex = __parent;
|
||||
@ -169,24 +163,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
_ValueType __value = _GLIBCXX_MOVE(*(__last - 1));
|
||||
std::__push_heap(__first, _DistanceType((__last - __first) - 1),
|
||||
_DistanceType(0), _GLIBCXX_MOVE(__value));
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance, typename _Tp,
|
||||
typename _Compare>
|
||||
void
|
||||
__push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
|
||||
_Distance __topIndex, _Tp __value, _Compare __comp)
|
||||
{
|
||||
_Distance __parent = (__holeIndex - 1) / 2;
|
||||
while (__holeIndex > __topIndex
|
||||
&& __comp(*(__first + __parent), __value))
|
||||
{
|
||||
*(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __parent));
|
||||
__holeIndex = __parent;
|
||||
__parent = (__holeIndex - 1) / 2;
|
||||
}
|
||||
*(__first + __holeIndex) = _GLIBCXX_MOVE(__value);
|
||||
_DistanceType(0), _GLIBCXX_MOVE(__value),
|
||||
__gnu_cxx::__ops::__iter_less_val());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -219,20 +197,23 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
|
||||
_ValueType __value = _GLIBCXX_MOVE(*(__last - 1));
|
||||
std::__push_heap(__first, _DistanceType((__last - __first) - 1),
|
||||
_DistanceType(0), _GLIBCXX_MOVE(__value), __comp);
|
||||
_DistanceType(0), _GLIBCXX_MOVE(__value),
|
||||
__gnu_cxx::__ops::__iter_comp_val(__comp));
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance, typename _Tp>
|
||||
template<typename _RandomAccessIterator, typename _Distance,
|
||||
typename _Tp, typename _Compare>
|
||||
void
|
||||
__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
|
||||
_Distance __len, _Tp __value)
|
||||
_Distance __len, _Tp __value, _Compare __comp)
|
||||
{
|
||||
const _Distance __topIndex = __holeIndex;
|
||||
_Distance __secondChild = __holeIndex;
|
||||
while (__secondChild < (__len - 1) / 2)
|
||||
{
|
||||
__secondChild = 2 * (__secondChild + 1);
|
||||
if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
|
||||
if (__comp(__first + __secondChild,
|
||||
__first + (__secondChild - 1)))
|
||||
__secondChild--;
|
||||
*(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild));
|
||||
__holeIndex = __secondChild;
|
||||
@ -244,14 +225,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
+ (__secondChild - 1)));
|
||||
__holeIndex = __secondChild - 1;
|
||||
}
|
||||
std::__push_heap(__first, __holeIndex, __topIndex,
|
||||
_GLIBCXX_MOVE(__value));
|
||||
std::__push_heap(__first, __holeIndex, __topIndex,
|
||||
_GLIBCXX_MOVE(__value),
|
||||
__gnu_cxx::__ops::__iter_comp_val(__comp));
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator>
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
inline void
|
||||
__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_RandomAccessIterator __result)
|
||||
_RandomAccessIterator __result, _Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
@ -262,7 +244,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
*__result = _GLIBCXX_MOVE(*__first);
|
||||
std::__adjust_heap(__first, _DistanceType(0),
|
||||
_DistanceType(__last - __first),
|
||||
_GLIBCXX_MOVE(__value));
|
||||
_GLIBCXX_MOVE(__value), __comp);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -294,55 +276,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
if (__last - __first > 1)
|
||||
{
|
||||
--__last;
|
||||
std::__pop_heap(__first, __last, __last);
|
||||
std::__pop_heap(__first, __last, __last,
|
||||
__gnu_cxx::__ops::__iter_less_iter());
|
||||
}
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Distance,
|
||||
typename _Tp, typename _Compare>
|
||||
void
|
||||
__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
|
||||
_Distance __len, _Tp __value, _Compare __comp)
|
||||
{
|
||||
const _Distance __topIndex = __holeIndex;
|
||||
_Distance __secondChild = __holeIndex;
|
||||
while (__secondChild < (__len - 1) / 2)
|
||||
{
|
||||
__secondChild = 2 * (__secondChild + 1);
|
||||
if (__comp(*(__first + __secondChild),
|
||||
*(__first + (__secondChild - 1))))
|
||||
__secondChild--;
|
||||
*(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first + __secondChild));
|
||||
__holeIndex = __secondChild;
|
||||
}
|
||||
if ((__len & 1) == 0 && __secondChild == (__len - 2) / 2)
|
||||
{
|
||||
__secondChild = 2 * (__secondChild + 1);
|
||||
*(__first + __holeIndex) = _GLIBCXX_MOVE(*(__first
|
||||
+ (__secondChild - 1)));
|
||||
__holeIndex = __secondChild - 1;
|
||||
}
|
||||
std::__push_heap(__first, __holeIndex, __topIndex,
|
||||
_GLIBCXX_MOVE(__value), __comp);
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
inline void
|
||||
__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_RandomAccessIterator __result, _Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
_ValueType __value = _GLIBCXX_MOVE(*__result);
|
||||
*__result = _GLIBCXX_MOVE(*__first);
|
||||
std::__adjust_heap(__first, _DistanceType(0),
|
||||
_DistanceType(__last - __first),
|
||||
_GLIBCXX_MOVE(__value), __comp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Pop an element off a heap using comparison functor.
|
||||
* @param __first Start of heap.
|
||||
@ -369,73 +307,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
if (__last - __first > 1)
|
||||
{
|
||||
--__last;
|
||||
std::__pop_heap(__first, __last, __last, __comp);
|
||||
std::__pop_heap(__first, __last, __last,
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__comp));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a heap over a range.
|
||||
* @param __first Start of heap.
|
||||
* @param __last End of heap.
|
||||
* @ingroup heap_algorithms
|
||||
*
|
||||
* This operation makes the elements in [__first,__last) into a heap.
|
||||
*/
|
||||
template<typename _RandomAccessIterator>
|
||||
void
|
||||
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
if (__last - __first < 2)
|
||||
return;
|
||||
|
||||
const _DistanceType __len = __last - __first;
|
||||
_DistanceType __parent = (__len - 2) / 2;
|
||||
while (true)
|
||||
{
|
||||
_ValueType __value = _GLIBCXX_MOVE(*(__first + __parent));
|
||||
std::__adjust_heap(__first, __parent, __len, _GLIBCXX_MOVE(__value));
|
||||
if (__parent == 0)
|
||||
return;
|
||||
__parent--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a heap over a range using comparison functor.
|
||||
* @param __first Start of heap.
|
||||
* @param __last End of heap.
|
||||
* @param __comp Comparison functor to use.
|
||||
* @ingroup heap_algorithms
|
||||
*
|
||||
* This operation makes the elements in [__first,__last) into a heap.
|
||||
* Comparisons are made using __comp.
|
||||
*/
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
void
|
||||
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::value_type
|
||||
_ValueType;
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type
|
||||
_DistanceType;
|
||||
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
if (__last - __first < 2)
|
||||
return;
|
||||
|
||||
@ -451,6 +337,65 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__parent--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a heap over a range.
|
||||
* @param __first Start of heap.
|
||||
* @param __last End of heap.
|
||||
* @ingroup heap_algorithms
|
||||
*
|
||||
* This operation makes the elements in [__first,__last) into a heap.
|
||||
*/
|
||||
template<typename _RandomAccessIterator>
|
||||
inline void
|
||||
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_function_requires(_LessThanComparableConcept<
|
||||
typename iterator_traits<_RandomAccessIterator>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
std::__make_heap(__first, __last,
|
||||
__gnu_cxx::__ops::__iter_less_iter());
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a heap over a range using comparison functor.
|
||||
* @param __first Start of heap.
|
||||
* @param __last End of heap.
|
||||
* @param __comp Comparison functor to use.
|
||||
* @ingroup heap_algorithms
|
||||
*
|
||||
* This operation makes the elements in [__first,__last) into a heap.
|
||||
* Comparisons are made using __comp.
|
||||
*/
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
inline void
|
||||
make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
// concept requirements
|
||||
__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
std::__make_heap(__first, __last,
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__comp));
|
||||
}
|
||||
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
void
|
||||
__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
while (__last - __first > 1)
|
||||
{
|
||||
--__last;
|
||||
std::__pop_heap(__first, __last, __last, __comp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sort a heap.
|
||||
@ -461,7 +406,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
* This operation sorts the valid heap in the range [__first,__last).
|
||||
*/
|
||||
template<typename _RandomAccessIterator>
|
||||
void
|
||||
inline void
|
||||
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
|
||||
{
|
||||
// concept requirements
|
||||
@ -472,11 +417,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
__glibcxx_requires_heap(__first, __last);
|
||||
|
||||
while (__last - __first > 1)
|
||||
{
|
||||
--__last;
|
||||
std::__pop_heap(__first, __last, __last);
|
||||
}
|
||||
std::__sort_heap(__first, __last,
|
||||
__gnu_cxx::__ops::__iter_less_iter());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -490,7 +432,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
* Comparisons are made using __comp.
|
||||
*/
|
||||
template<typename _RandomAccessIterator, typename _Compare>
|
||||
void
|
||||
inline void
|
||||
sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
|
||||
_Compare __comp)
|
||||
{
|
||||
@ -500,11 +442,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
__glibcxx_requires_heap_pred(__first, __last, __comp);
|
||||
|
||||
while (__last - __first > 1)
|
||||
{
|
||||
--__last;
|
||||
std::__pop_heap(__first, __last, __last, __comp);
|
||||
}
|
||||
std::__sort_heap(__first, __last,
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__comp));
|
||||
}
|
||||
|
||||
#if __cplusplus >= 201103L
|
||||
@ -529,8 +468,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
typename iterator_traits<_RandomAccessIterator>::value_type>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
return __first + std::__is_heap_until(__first, std::distance(__first,
|
||||
__last));
|
||||
return __first +
|
||||
std::__is_heap_until(__first, std::distance(__first, __last),
|
||||
__gnu_cxx::__ops::__iter_less_iter());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -554,9 +494,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
_RandomAccessIterator>)
|
||||
__glibcxx_requires_valid_range(__first, __last);
|
||||
|
||||
return __first + std::__is_heap_until(__first, std::distance(__first,
|
||||
__last),
|
||||
__comp);
|
||||
return __first
|
||||
+ std::__is_heap_until(__first, std::distance(__first, __last),
|
||||
__gnu_cxx::__ops::__iter_comp_iter(__comp));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -122,6 +122,25 @@ namespace __parallel
|
||||
_IteratorCategory1(), _IteratorCategory2());
|
||||
}
|
||||
|
||||
#if __cplusplus > 201103L
|
||||
template<typename _InputIterator1, typename _InputIterator2>
|
||||
inline pair<_InputIterator1, _InputIterator2>
|
||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2)
|
||||
{ return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2); }
|
||||
|
||||
template<typename _InputIterator1, typename _InputIterator2,
|
||||
typename _BinaryPredicate>
|
||||
inline pair<_InputIterator1, _InputIterator2>
|
||||
mismatch(_InputIterator1 __first1, _InputIterator1 __last1,
|
||||
_InputIterator2 __first2, _InputIterator2 __last2,
|
||||
_BinaryPredicate __binary_pred)
|
||||
{
|
||||
return _GLIBCXX_STD_A::mismatch(__first1, __last1, __first2, __last2,
|
||||
__binary_pred);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Sequential fallback
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
inline bool
|
||||
@ -155,6 +174,22 @@ namespace __parallel
|
||||
== __end1;
|
||||
}
|
||||
|
||||
#if __cplusplus > 201103L
|
||||
template<typename _II1, typename _II2>
|
||||
inline bool
|
||||
equal(_II1 __first1, _II1 __last1, _II2 __first2, _II2 __last2)
|
||||
{ return _GLIBCXX_STD_A::equal(__first1, __last1, __first2, __last2); }
|
||||
|
||||
template<typename _IIter1, typename _IIter2, typename _BinaryPredicate>
|
||||
inline bool
|
||||
equal(_IIter1 __first1, _IIter1 __last1,
|
||||
_IIter2 __first2, _IIter2 __last2, _BinaryPredicate __binary_pred)
|
||||
{
|
||||
return _GLIBCXX_STD_A::equal(__first1, __last1, __first2, __last2,
|
||||
__binary_pred);
|
||||
}
|
||||
#endif
|
||||
|
||||
// Sequential fallback
|
||||
template<typename _IIter1, typename _IIter2>
|
||||
inline bool
|
||||
|
@ -0,0 +1,44 @@
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// 25.1.5 [lib.alg.adjacent_find]
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void
|
||||
test01()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
std::vector<bool> v;
|
||||
v.push_back(true);
|
||||
v.push_back(false);
|
||||
v.push_back(true);
|
||||
v.push_back(false);
|
||||
v.push_back(false);
|
||||
|
||||
VERIFY( std::adjacent_find(v.begin(), v.end()) == v.begin() + 3 );
|
||||
VERIFY( std::adjacent_find(v.begin(), v.end() - 1) == v.end() - 1 );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test01();
|
||||
}
|
39
libstdc++-v3/testsuite/25_algorithms/find/vectorbool.cc
Normal file
39
libstdc++-v3/testsuite/25_algorithms/find/vectorbool.cc
Normal file
@ -0,0 +1,39 @@
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// 25.1.2 find
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void
|
||||
test1()
|
||||
{
|
||||
std::vector<bool> v;
|
||||
v.push_back(false);
|
||||
v.push_back(false);
|
||||
v.push_back(true);
|
||||
v.push_back(false);
|
||||
VERIFY( std::find(v.begin(), v.end(), true) == v.begin() + 2 );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test1();
|
||||
}
|
50
libstdc++-v3/testsuite/25_algorithms/find_end/vectorbool.cc
Normal file
50
libstdc++-v3/testsuite/25_algorithms/find_end/vectorbool.cc
Normal file
@ -0,0 +1,50 @@
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// 25.1.3 [lib.alg.find.end]
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void
|
||||
test1()
|
||||
{
|
||||
std::vector<bool> v1;
|
||||
v1.push_back(false);
|
||||
v1.push_back(false);
|
||||
v1.push_back(false);
|
||||
v1.push_back(true);
|
||||
v1.push_back(true);
|
||||
v1.push_back(false);
|
||||
v1.push_back(true);
|
||||
v1.push_back(true);
|
||||
v1.push_back(false);
|
||||
|
||||
std::vector<bool> v2;
|
||||
v2.push_back(true);
|
||||
v2.push_back(true);
|
||||
|
||||
VERIFY( std::find_end(v1.begin(), v1.end(), v2.begin(), v2.end())
|
||||
== v1.begin() + 6 );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test1();
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// 25.1.4 [lib.alg.find.first.of]
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void
|
||||
test1()
|
||||
{
|
||||
std::vector<bool> v1;
|
||||
v1.push_back(false);
|
||||
v1.push_back(false);
|
||||
v1.push_back(true);
|
||||
v1.push_back(false);
|
||||
v1.push_back(true);
|
||||
v1.push_back(true);
|
||||
v1.push_back(false);
|
||||
v1.push_back(true);
|
||||
v1.push_back(true);
|
||||
|
||||
std::vector<bool> v2;
|
||||
v2.push_back(true);
|
||||
v2.push_back(false);
|
||||
|
||||
VERIFY( std::find_first_of(v1.begin(), v1.end(), v2.begin(), v2.end())
|
||||
== v1.begin() );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test1();
|
||||
}
|
39
libstdc++-v3/testsuite/25_algorithms/find_if/vectorbool.cc
Normal file
39
libstdc++-v3/testsuite/25_algorithms/find_if/vectorbool.cc
Normal file
@ -0,0 +1,39 @@
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// 25.1.2 find
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void
|
||||
test1()
|
||||
{
|
||||
std::vector<bool> v;
|
||||
v.push_back(false);
|
||||
v.push_back(false);
|
||||
v.push_back(true);
|
||||
v.push_back(false);
|
||||
VERIFY( std::find(v.begin(), v.end(), true) == v.begin() + 2 );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test1();
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
// { dg-options "-std=gnu++0x" }
|
||||
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <algorithm>
|
||||
#include <vector>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void
|
||||
test1()
|
||||
{
|
||||
std::vector<bool> v;
|
||||
v.push_back(false);
|
||||
v.push_back(false);
|
||||
v.push_back(true);
|
||||
v.push_back(false);
|
||||
VERIFY( std::find_if_not(v.begin(), v.end(), [](bool val){ return !val; })
|
||||
== v.begin() + 2 );
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test1();
|
||||
}
|
146
libstdc++-v3/testsuite/25_algorithms/heap/vectorbool.cc
Normal file
146
libstdc++-v3/testsuite/25_algorithms/heap/vectorbool.cc
Normal file
@ -0,0 +1,146 @@
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// 25.3.6 Heap operations [lib.alg.heap.operations]
|
||||
|
||||
#include <iterator>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
const bool A[] = { true, true, false, true, false, false, true, false };
|
||||
const int B[] = { false, false, false, false, true, true, true, true };
|
||||
const int C[] = { true, true, true, true, false, false, false, false };
|
||||
const int N = sizeof(A) / sizeof(bool);
|
||||
|
||||
// This functor has the equivalent functionality of std::greater<>,
|
||||
// but there is no dependency on <functional> and it also tracks the
|
||||
// number of invocations since creation.
|
||||
class Gt
|
||||
{
|
||||
public:
|
||||
static int count() { return _S_count; }
|
||||
static void reset() { _S_count = 0; }
|
||||
|
||||
bool
|
||||
operator()(bool x, bool y) const
|
||||
{
|
||||
++_S_count;
|
||||
return x > y;
|
||||
}
|
||||
|
||||
private:
|
||||
static int _S_count;
|
||||
};
|
||||
|
||||
int Gt::_S_count = 0;
|
||||
|
||||
// Exercise all of the heap functions for operator<. The intermediate
|
||||
// results between push_heap and pop_heap and make_heap and sort_heap
|
||||
// are not checked (they could be).
|
||||
void
|
||||
test01()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
// sort array s1 using push_heap/pop_heap
|
||||
std::vector<bool> s1;
|
||||
std::copy(A, A + N, std::back_inserter(s1));
|
||||
VERIFY( std::equal(s1.begin(), s1.begin() + N, A) );
|
||||
|
||||
for (int i = 2; i <= N; ++i)
|
||||
std::push_heap(s1.begin(), s1.begin() + i);
|
||||
|
||||
for (int i = N; i >= 2; --i)
|
||||
std::pop_heap(s1.begin(), s1.begin() + i);
|
||||
|
||||
VERIFY( std::equal(s1.begin(), s1.begin() + N, B) );
|
||||
|
||||
// sort array s2 using make_heap/sort_heap
|
||||
std::vector<bool> s2;
|
||||
std::copy(A, A + N, std::back_inserter(s2));
|
||||
VERIFY( std::equal(s2.begin(), s2.begin() + N, A) );
|
||||
|
||||
std::make_heap(s2.begin(), s2.begin() + N);
|
||||
std::sort_heap(s2.begin(), s2.begin() + N);
|
||||
VERIFY( std::equal(s2.begin(), s2.begin() + N, B) );
|
||||
}
|
||||
|
||||
// Perform same tests as above but with the comparison predicate
|
||||
// versions, and add complexity constraint checks.
|
||||
void
|
||||
test02()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
Gt gt;
|
||||
|
||||
#ifndef _GLIBCXX_DEBUG
|
||||
//const int logN = static_cast<int>(std::log(static_cast<double>(N)) + 0.5);
|
||||
const int logN = 3;
|
||||
#endif
|
||||
|
||||
std::vector<bool> s1;
|
||||
std::copy(A, A + N, std::back_inserter(s1));
|
||||
VERIFY(std::equal(s1.begin(), s1.begin() + N, A));
|
||||
|
||||
for (int i = 2; i <= N; ++i)
|
||||
{
|
||||
std::push_heap(s1.begin(), s1.begin() + i, gt);
|
||||
#ifndef _GLIBCXX_DEBUG
|
||||
VERIFY(gt.count() <= logN);
|
||||
#endif
|
||||
gt.reset();
|
||||
}
|
||||
|
||||
for (int i = N; i >= 2; --i)
|
||||
{
|
||||
std::pop_heap(s1.begin(), s1.begin() + i, gt);
|
||||
#ifndef _GLIBCXX_DEBUG
|
||||
VERIFY(gt.count() <= 2 * logN);
|
||||
#endif
|
||||
gt.reset();
|
||||
}
|
||||
|
||||
VERIFY(std::equal(s1.begin(), s1.begin() + N, C));
|
||||
|
||||
// sort array s2 using make_heap/sort_heap
|
||||
std::vector<bool> s2;
|
||||
std::copy(A, A + N, std::back_inserter(s2));
|
||||
VERIFY(std::equal(s2.begin(), s2.begin() + N, A));
|
||||
|
||||
std::make_heap(s2.begin(), s2.begin() + N, gt);
|
||||
#ifndef _GLIBCXX_DEBUG
|
||||
VERIFY(gt.count() <= 3 * N);
|
||||
#endif
|
||||
gt.reset();
|
||||
|
||||
std::sort_heap(s2.begin(), s2.begin() + N, gt);
|
||||
#ifndef _GLIBCXX_DEBUG
|
||||
VERIFY(gt.count() <= N * logN);
|
||||
#endif
|
||||
|
||||
VERIFY(std::equal(s2.begin(), s2.begin() + N, C));
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,50 @@
|
||||
// { dg-options "-std=gnu++1y" }
|
||||
|
||||
// Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// 25.2.12 [alg.is_permutation] Is permutation
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
void test01()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
std::vector<bool> v1 = { true, false, true, false, true };
|
||||
std::vector<bool> v2 = { false, true, false, true, true };
|
||||
VERIFY( std::is_permutation(v1.begin(), v1.end(), v2.begin()) );
|
||||
VERIFY( !std::is_permutation(v1.begin() + 1, v1.end(), v2.begin() + 1) );
|
||||
}
|
||||
|
||||
void test02()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
||||
std::vector<bool> v1 = { true, false, true, false, true };
|
||||
std::vector<bool> v2 = { false, true, false, true, true };
|
||||
VERIFY( std::is_permutation(v1.begin(), v1.end(), v2.begin(), v2.end()) );
|
||||
VERIFY( !std::is_permutation(v1.begin(), v1.end() - 1, v2.begin(), v2.end()) );
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
test01();
|
||||
test02();
|
||||
}
|
Loading…
Reference in New Issue
Block a user