1*3e519524SHoward Hinnant// -*- C++ -*- 2*3e519524SHoward Hinnant//===-------------------------- algorithm ---------------------------------===// 3*3e519524SHoward Hinnant// 4*3e519524SHoward Hinnant// ��������������������The LLVM Compiler Infrastructure 5*3e519524SHoward Hinnant// 6*3e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source 7*3e519524SHoward Hinnant// License. See LICENSE.TXT for details. 8*3e519524SHoward Hinnant// 9*3e519524SHoward Hinnant//===----------------------------------------------------------------------===// 10*3e519524SHoward Hinnant 11*3e519524SHoward Hinnant#ifndef _LIBCPP_ALGORITHM 12*3e519524SHoward Hinnant#define _LIBCPP_ALGORITHM 13*3e519524SHoward Hinnant 14*3e519524SHoward Hinnant/* 15*3e519524SHoward Hinnant algorithm synopsis 16*3e519524SHoward Hinnant 17*3e519524SHoward Hinnant#include <initializer_list> 18*3e519524SHoward Hinnant 19*3e519524SHoward Hinnantnamespace std 20*3e519524SHoward Hinnant{ 21*3e519524SHoward Hinnant 22*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate> 23*3e519524SHoward Hinnant bool 24*3e519524SHoward Hinnant all_of(InputIterator first, InputIterator last, Predicate pred); 25*3e519524SHoward Hinnant 26*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate> 27*3e519524SHoward Hinnant bool 28*3e519524SHoward Hinnant any_of(InputIterator first, InputIterator last, Predicate pred); 29*3e519524SHoward Hinnant 30*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate> 31*3e519524SHoward Hinnant bool 32*3e519524SHoward Hinnant none_of(InputIterator first, InputIterator last, Predicate pred); 33*3e519524SHoward Hinnant 34*3e519524SHoward Hinnanttemplate <class InputIterator, class Function> 35*3e519524SHoward Hinnant Function 36*3e519524SHoward Hinnant for_each(InputIterator first, InputIterator last, Function f); 37*3e519524SHoward Hinnant 38*3e519524SHoward Hinnanttemplate <class InputIterator, class T> 39*3e519524SHoward Hinnant InputIterator 40*3e519524SHoward Hinnant find(InputIterator first, InputIterator last, const T& value); 41*3e519524SHoward Hinnant 42*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate> 43*3e519524SHoward Hinnant InputIterator 44*3e519524SHoward Hinnant find_if(InputIterator first, InputIterator last, Predicate pred); 45*3e519524SHoward Hinnant 46*3e519524SHoward Hinnanttemplate<class InputIterator, class Predicate> 47*3e519524SHoward Hinnant InputIterator 48*3e519524SHoward Hinnant find_if_not(InputIterator first, InputIterator last, Predicate pred); 49*3e519524SHoward Hinnant 50*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2> 51*3e519524SHoward Hinnant ForwardIterator1 52*3e519524SHoward Hinnant find_end(ForwardIterator1 first1, ForwardIterator1 last1, 53*3e519524SHoward Hinnant ForwardIterator2 first2, ForwardIterator2 last2); 54*3e519524SHoward Hinnant 55*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 56*3e519524SHoward Hinnant ForwardIterator1 57*3e519524SHoward Hinnant find_end(ForwardIterator1 first1, ForwardIterator1 last1, 58*3e519524SHoward Hinnant ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 59*3e519524SHoward Hinnant 60*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2> 61*3e519524SHoward Hinnant ForwardIterator1 62*3e519524SHoward Hinnant find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 63*3e519524SHoward Hinnant ForwardIterator2 first2, ForwardIterator2 last2); 64*3e519524SHoward Hinnant 65*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 66*3e519524SHoward Hinnant ForwardIterator1 67*3e519524SHoward Hinnant find_first_of(ForwardIterator1 first1, ForwardIterator1 last1, 68*3e519524SHoward Hinnant ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 69*3e519524SHoward Hinnant 70*3e519524SHoward Hinnanttemplate <class ForwardIterator> 71*3e519524SHoward Hinnant ForwardIterator 72*3e519524SHoward Hinnant adjacent_find(ForwardIterator first, ForwardIterator last); 73*3e519524SHoward Hinnant 74*3e519524SHoward Hinnanttemplate <class ForwardIterator, class BinaryPredicate> 75*3e519524SHoward Hinnant ForwardIterator 76*3e519524SHoward Hinnant adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 77*3e519524SHoward Hinnant 78*3e519524SHoward Hinnanttemplate <class InputIterator, class T> 79*3e519524SHoward Hinnant typename iterator_traits<InputIterator>::difference_type 80*3e519524SHoward Hinnant count(InputIterator first, InputIterator last, const T& value); 81*3e519524SHoward Hinnant 82*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate> 83*3e519524SHoward Hinnant typename iterator_traits<InputIterator>::difference_type 84*3e519524SHoward Hinnant count_if(InputIterator first, InputIterator last, Predicate pred); 85*3e519524SHoward Hinnant 86*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2> 87*3e519524SHoward Hinnant pair<InputIterator1, InputIterator2> 88*3e519524SHoward Hinnant mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 89*3e519524SHoward Hinnant 90*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class BinaryPredicate> 91*3e519524SHoward Hinnant pair<InputIterator1, InputIterator2> 92*3e519524SHoward Hinnant mismatch(InputIterator1 first1, InputIterator1 last1, 93*3e519524SHoward Hinnant InputIterator2 first2, BinaryPredicate pred); 94*3e519524SHoward Hinnant 95*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2> 96*3e519524SHoward Hinnant bool 97*3e519524SHoward Hinnant equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); 98*3e519524SHoward Hinnant 99*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class BinaryPredicate> 100*3e519524SHoward Hinnant bool 101*3e519524SHoward Hinnant equal(InputIterator1 first1, InputIterator1 last1, 102*3e519524SHoward Hinnant InputIterator2 first2, BinaryPredicate pred); 103*3e519524SHoward Hinnant 104*3e519524SHoward Hinnanttemplate<class ForwardIterator1, class ForwardIterator2> 105*3e519524SHoward Hinnant bool 106*3e519524SHoward Hinnant is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 107*3e519524SHoward Hinnant ForwardIterator2 first2); 108*3e519524SHoward Hinnant 109*3e519524SHoward Hinnanttemplate<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 110*3e519524SHoward Hinnant bool 111*3e519524SHoward Hinnant is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, 112*3e519524SHoward Hinnant ForwardIterator2 first2, BinaryPredicate pred); 113*3e519524SHoward Hinnant 114*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2> 115*3e519524SHoward Hinnant ForwardIterator1 116*3e519524SHoward Hinnant search(ForwardIterator1 first1, ForwardIterator1 last1, 117*3e519524SHoward Hinnant ForwardIterator2 first2, ForwardIterator2 last2); 118*3e519524SHoward Hinnant 119*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate> 120*3e519524SHoward Hinnant ForwardIterator1 121*3e519524SHoward Hinnant search(ForwardIterator1 first1, ForwardIterator1 last1, 122*3e519524SHoward Hinnant ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred); 123*3e519524SHoward Hinnant 124*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T> 125*3e519524SHoward Hinnant ForwardIterator 126*3e519524SHoward Hinnant search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value); 127*3e519524SHoward Hinnant 128*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Size, class T, class BinaryPredicate> 129*3e519524SHoward Hinnant ForwardIterator 130*3e519524SHoward Hinnant search_n(ForwardIterator first, ForwardIterator last, 131*3e519524SHoward Hinnant Size count, const T& value, BinaryPredicate pred); 132*3e519524SHoward Hinnant 133*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator> 134*3e519524SHoward Hinnant OutputIterator 135*3e519524SHoward Hinnant copy(InputIterator first, InputIterator last, OutputIterator result); 136*3e519524SHoward Hinnant 137*3e519524SHoward Hinnanttemplate<class InputIterator, class OutputIterator, class Predicate> 138*3e519524SHoward Hinnant OutputIterator 139*3e519524SHoward Hinnant copy_if(InputIterator first, InputIterator last, 140*3e519524SHoward Hinnant OutputIterator result, Predicate pred); 141*3e519524SHoward Hinnant 142*3e519524SHoward Hinnanttemplate<class InputIterator, class Size, class OutputIterator> 143*3e519524SHoward Hinnant OutputIterator 144*3e519524SHoward Hinnant copy_n(InputIterator first, Size n, OutputIterator result); 145*3e519524SHoward Hinnant 146*3e519524SHoward Hinnanttemplate <class BidirectionalIterator1, class BidirectionalIterator2> 147*3e519524SHoward Hinnant BidirectionalIterator2 148*3e519524SHoward Hinnant copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, 149*3e519524SHoward Hinnant BidirectionalIterator2 result); 150*3e519524SHoward Hinnant 151*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2> 152*3e519524SHoward Hinnant ForwardIterator2 153*3e519524SHoward Hinnant swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); 154*3e519524SHoward Hinnant 155*3e519524SHoward Hinnanttemplate <class ForwardIterator1, class ForwardIterator2> 156*3e519524SHoward Hinnant void 157*3e519524SHoward Hinnant iter_swap(ForwardIterator1 a, ForwardIterator2 b); 158*3e519524SHoward Hinnant 159*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class UnaryOperation> 160*3e519524SHoward Hinnant OutputIterator 161*3e519524SHoward Hinnant transform(InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op); 162*3e519524SHoward Hinnant 163*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation> 164*3e519524SHoward Hinnant OutputIterator 165*3e519524SHoward Hinnant transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, 166*3e519524SHoward Hinnant OutputIterator result, BinaryOperation binary_op); 167*3e519524SHoward Hinnant 168*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 169*3e519524SHoward Hinnant void 170*3e519524SHoward Hinnant replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value); 171*3e519524SHoward Hinnant 172*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate, class T> 173*3e519524SHoward Hinnant void 174*3e519524SHoward Hinnant replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T& new_value); 175*3e519524SHoward Hinnant 176*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class T> 177*3e519524SHoward Hinnant OutputIterator 178*3e519524SHoward Hinnant replace_copy(InputIterator first, InputIterator last, OutputIterator result, 179*3e519524SHoward Hinnant const T& old_value, const T& new_value); 180*3e519524SHoward Hinnant 181*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class Predicate, class T> 182*3e519524SHoward Hinnant OutputIterator 183*3e519524SHoward Hinnant replace_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred, const T& new_value); 184*3e519524SHoward Hinnant 185*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 186*3e519524SHoward Hinnant void 187*3e519524SHoward Hinnant fill(ForwardIterator first, ForwardIterator last, const T& value); 188*3e519524SHoward Hinnant 189*3e519524SHoward Hinnanttemplate <class OutputIterator, class Size, class T> 190*3e519524SHoward Hinnant OutputIterator 191*3e519524SHoward Hinnant fill_n(OutputIterator first, Size n, const T& value); 192*3e519524SHoward Hinnant 193*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Generator> 194*3e519524SHoward Hinnant void 195*3e519524SHoward Hinnant generate(ForwardIterator first, ForwardIterator last, Generator gen); 196*3e519524SHoward Hinnant 197*3e519524SHoward Hinnanttemplate <class OutputIterator, class Size, class Generator> 198*3e519524SHoward Hinnant OutputIterator 199*3e519524SHoward Hinnant generate_n(OutputIterator first, Size n, Generator gen); 200*3e519524SHoward Hinnant 201*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 202*3e519524SHoward Hinnant ForwardIterator 203*3e519524SHoward Hinnant remove(ForwardIterator first, ForwardIterator last, const T& value); 204*3e519524SHoward Hinnant 205*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate> 206*3e519524SHoward Hinnant ForwardIterator 207*3e519524SHoward Hinnant remove_if(ForwardIterator first, ForwardIterator last, Predicate pred); 208*3e519524SHoward Hinnant 209*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class T> 210*3e519524SHoward Hinnant OutputIterator 211*3e519524SHoward Hinnant remove_copy(InputIterator first, InputIterator last, OutputIterator result, const T& value); 212*3e519524SHoward Hinnant 213*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class Predicate> 214*3e519524SHoward Hinnant OutputIterator 215*3e519524SHoward Hinnant remove_copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred); 216*3e519524SHoward Hinnant 217*3e519524SHoward Hinnanttemplate <class ForwardIterator> 218*3e519524SHoward Hinnant ForwardIterator 219*3e519524SHoward Hinnant unique(ForwardIterator first, ForwardIterator last); 220*3e519524SHoward Hinnant 221*3e519524SHoward Hinnanttemplate <class ForwardIterator, class BinaryPredicate> 222*3e519524SHoward Hinnant ForwardIterator 223*3e519524SHoward Hinnant unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred); 224*3e519524SHoward Hinnant 225*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator> 226*3e519524SHoward Hinnant OutputIterator 227*3e519524SHoward Hinnant unique_copy(InputIterator first, InputIterator last, OutputIterator result); 228*3e519524SHoward Hinnant 229*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator, class BinaryPredicate> 230*3e519524SHoward Hinnant OutputIterator 231*3e519524SHoward Hinnant unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred); 232*3e519524SHoward Hinnant 233*3e519524SHoward Hinnanttemplate <class BidirectionalIterator> 234*3e519524SHoward Hinnant void 235*3e519524SHoward Hinnant reverse(BidirectionalIterator first, BidirectionalIterator last); 236*3e519524SHoward Hinnant 237*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class OutputIterator> 238*3e519524SHoward Hinnant OutputIterator 239*3e519524SHoward Hinnant reverse_copy(BidirectionalIterator first, BidirectionalIterator last, OutputIterator result); 240*3e519524SHoward Hinnant 241*3e519524SHoward Hinnanttemplate <class ForwardIterator> 242*3e519524SHoward Hinnant ForwardIterator 243*3e519524SHoward Hinnant rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last); 244*3e519524SHoward Hinnant 245*3e519524SHoward Hinnanttemplate <class ForwardIterator, class OutputIterator> 246*3e519524SHoward Hinnant OutputIterator 247*3e519524SHoward Hinnant rotate_copy(ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result); 248*3e519524SHoward Hinnant 249*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 250*3e519524SHoward Hinnant void 251*3e519524SHoward Hinnant random_shuffle(RandomAccessIterator first, RandomAccessIterator last); 252*3e519524SHoward Hinnant 253*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class RandomNumberGenerator> 254*3e519524SHoward Hinnant void 255*3e519524SHoward Hinnant random_shuffle(RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator& rand); 256*3e519524SHoward Hinnant 257*3e519524SHoward Hinnanttemplate <class InputIterator, class Predicate> 258*3e519524SHoward Hinnant bool 259*3e519524SHoward Hinnant is_partitioned(InputIterator first, InputIterator last, Predicate pred); 260*3e519524SHoward Hinnant 261*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate> 262*3e519524SHoward Hinnant ForwardIterator 263*3e519524SHoward Hinnant partition(ForwardIterator first, ForwardIterator last, Predicate pred); 264*3e519524SHoward Hinnant 265*3e519524SHoward Hinnanttemplate <class InputIterator, class OutputIterator1, 266*3e519524SHoward Hinnant class OutputIterator2, class Predicate> 267*3e519524SHoward Hinnant pair<OutputIterator1, OutputIterator2> 268*3e519524SHoward Hinnant partition_copy(InputIterator first, InputIterator last, 269*3e519524SHoward Hinnant OutputIterator1 out_true, OutputIterator2 out_false, 270*3e519524SHoward Hinnant Predicate pred); 271*3e519524SHoward Hinnant 272*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Predicate> 273*3e519524SHoward Hinnant ForwardIterator 274*3e519524SHoward Hinnant stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); 275*3e519524SHoward Hinnant 276*3e519524SHoward Hinnanttemplate<class ForwardIterator, class Predicate> 277*3e519524SHoward Hinnant ForwardIterator 278*3e519524SHoward Hinnant partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); 279*3e519524SHoward Hinnant 280*3e519524SHoward Hinnanttemplate <class ForwardIterator> 281*3e519524SHoward Hinnant bool 282*3e519524SHoward Hinnant is_sorted(ForwardIterator first, ForwardIterator last); 283*3e519524SHoward Hinnant 284*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare> 285*3e519524SHoward Hinnant bool 286*3e519524SHoward Hinnant is_sorted(ForwardIterator first, ForwardIterator last, Compare comp); 287*3e519524SHoward Hinnant 288*3e519524SHoward Hinnanttemplate<class ForwardIterator> 289*3e519524SHoward Hinnant ForwardIterator 290*3e519524SHoward Hinnant is_sorted_until(ForwardIterator first, ForwardIterator last); 291*3e519524SHoward Hinnant 292*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare> 293*3e519524SHoward Hinnant ForwardIterator 294*3e519524SHoward Hinnant is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp); 295*3e519524SHoward Hinnant 296*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 297*3e519524SHoward Hinnant void 298*3e519524SHoward Hinnant sort(RandomAccessIterator first, RandomAccessIterator last); 299*3e519524SHoward Hinnant 300*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 301*3e519524SHoward Hinnant void 302*3e519524SHoward Hinnant sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 303*3e519524SHoward Hinnant 304*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 305*3e519524SHoward Hinnant void 306*3e519524SHoward Hinnant stable_sort(RandomAccessIterator first, RandomAccessIterator last); 307*3e519524SHoward Hinnant 308*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 309*3e519524SHoward Hinnant void 310*3e519524SHoward Hinnant stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 311*3e519524SHoward Hinnant 312*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 313*3e519524SHoward Hinnant void 314*3e519524SHoward Hinnant partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last); 315*3e519524SHoward Hinnant 316*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 317*3e519524SHoward Hinnant void 318*3e519524SHoward Hinnant partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, Compare comp); 319*3e519524SHoward Hinnant 320*3e519524SHoward Hinnanttemplate <class InputIterator, class RandomAccessIterator> 321*3e519524SHoward Hinnant RandomAccessIterator 322*3e519524SHoward Hinnant partial_sort_copy(InputIterator first, InputIterator last, 323*3e519524SHoward Hinnant RandomAccessIterator result_first, RandomAccessIterator result_last); 324*3e519524SHoward Hinnant 325*3e519524SHoward Hinnanttemplate <class InputIterator, class RandomAccessIterator, class Compare> 326*3e519524SHoward Hinnant RandomAccessIterator 327*3e519524SHoward Hinnant partial_sort_copy(InputIterator first, InputIterator last, 328*3e519524SHoward Hinnant RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp); 329*3e519524SHoward Hinnant 330*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 331*3e519524SHoward Hinnant void 332*3e519524SHoward Hinnant nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); 333*3e519524SHoward Hinnant 334*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 335*3e519524SHoward Hinnant void 336*3e519524SHoward Hinnant nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); 337*3e519524SHoward Hinnant 338*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 339*3e519524SHoward Hinnant ForwardIterator 340*3e519524SHoward Hinnant lower_bound(ForwardIterator first, ForwardIterator last, const T& value); 341*3e519524SHoward Hinnant 342*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare> 343*3e519524SHoward Hinnant ForwardIterator 344*3e519524SHoward Hinnant lower_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 345*3e519524SHoward Hinnant 346*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 347*3e519524SHoward Hinnant ForwardIterator 348*3e519524SHoward Hinnant upper_bound(ForwardIterator first, ForwardIterator last, const T& value); 349*3e519524SHoward Hinnant 350*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare> 351*3e519524SHoward Hinnant ForwardIterator 352*3e519524SHoward Hinnant upper_bound(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 353*3e519524SHoward Hinnant 354*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 355*3e519524SHoward Hinnant pair<ForwardIterator, ForwardIterator> 356*3e519524SHoward Hinnant equal_range(ForwardIterator first, ForwardIterator last, const T& value); 357*3e519524SHoward Hinnant 358*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare> 359*3e519524SHoward Hinnant pair<ForwardIterator, ForwardIterator> 360*3e519524SHoward Hinnant equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 361*3e519524SHoward Hinnant 362*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T> 363*3e519524SHoward Hinnant bool 364*3e519524SHoward Hinnant binary_search(ForwardIterator first, ForwardIterator last, const T& value); 365*3e519524SHoward Hinnant 366*3e519524SHoward Hinnanttemplate <class ForwardIterator, class T, class Compare> 367*3e519524SHoward Hinnant bool 368*3e519524SHoward Hinnant binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp); 369*3e519524SHoward Hinnant 370*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator> 371*3e519524SHoward Hinnant OutputIterator 372*3e519524SHoward Hinnant merge(InputIterator1 first1, InputIterator1 last1, 373*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result); 374*3e519524SHoward Hinnant 375*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 376*3e519524SHoward Hinnant OutputIterator 377*3e519524SHoward Hinnant merge(InputIterator1 first1, InputIterator1 last1, 378*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 379*3e519524SHoward Hinnant 380*3e519524SHoward Hinnanttemplate <class BidirectionalIterator> 381*3e519524SHoward Hinnant void 382*3e519524SHoward Hinnant inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last); 383*3e519524SHoward Hinnant 384*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare> 385*3e519524SHoward Hinnant void 386*3e519524SHoward Hinnant inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp); 387*3e519524SHoward Hinnant 388*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2> 389*3e519524SHoward Hinnant bool 390*3e519524SHoward Hinnant includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 391*3e519524SHoward Hinnant 392*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class Compare> 393*3e519524SHoward Hinnant bool 394*3e519524SHoward Hinnant includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp); 395*3e519524SHoward Hinnant 396*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator> 397*3e519524SHoward Hinnant OutputIterator 398*3e519524SHoward Hinnant set_union(InputIterator1 first1, InputIterator1 last1, 399*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result); 400*3e519524SHoward Hinnant 401*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 402*3e519524SHoward Hinnant OutputIterator 403*3e519524SHoward Hinnant set_union(InputIterator1 first1, InputIterator1 last1, 404*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 405*3e519524SHoward Hinnant 406*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator> 407*3e519524SHoward Hinnant OutputIterator 408*3e519524SHoward Hinnant set_intersection(InputIterator1 first1, InputIterator1 last1, 409*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result); 410*3e519524SHoward Hinnant 411*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 412*3e519524SHoward Hinnant OutputIterator 413*3e519524SHoward Hinnant set_intersection(InputIterator1 first1, InputIterator1 last1, 414*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 415*3e519524SHoward Hinnant 416*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator> 417*3e519524SHoward Hinnant OutputIterator 418*3e519524SHoward Hinnant set_difference(InputIterator1 first1, InputIterator1 last1, 419*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result); 420*3e519524SHoward Hinnant 421*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 422*3e519524SHoward Hinnant OutputIterator 423*3e519524SHoward Hinnant set_difference(InputIterator1 first1, InputIterator1 last1, 424*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 425*3e519524SHoward Hinnant 426*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator> 427*3e519524SHoward Hinnant OutputIterator 428*3e519524SHoward Hinnant set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 429*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result); 430*3e519524SHoward Hinnant 431*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class OutputIterator, class Compare> 432*3e519524SHoward Hinnant OutputIterator 433*3e519524SHoward Hinnant set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, 434*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 435*3e519524SHoward Hinnant 436*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 437*3e519524SHoward Hinnant void 438*3e519524SHoward Hinnant push_heap(RandomAccessIterator first, RandomAccessIterator last); 439*3e519524SHoward Hinnant 440*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 441*3e519524SHoward Hinnant void 442*3e519524SHoward Hinnant push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 443*3e519524SHoward Hinnant 444*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 445*3e519524SHoward Hinnant void 446*3e519524SHoward Hinnant pop_heap(RandomAccessIterator first, RandomAccessIterator last); 447*3e519524SHoward Hinnant 448*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 449*3e519524SHoward Hinnant void 450*3e519524SHoward Hinnant pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 451*3e519524SHoward Hinnant 452*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 453*3e519524SHoward Hinnant void 454*3e519524SHoward Hinnant make_heap(RandomAccessIterator first, RandomAccessIterator last); 455*3e519524SHoward Hinnant 456*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 457*3e519524SHoward Hinnant void 458*3e519524SHoward Hinnant make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 459*3e519524SHoward Hinnant 460*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 461*3e519524SHoward Hinnant void 462*3e519524SHoward Hinnant sort_heap(RandomAccessIterator first, RandomAccessIterator last); 463*3e519524SHoward Hinnant 464*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 465*3e519524SHoward Hinnant void 466*3e519524SHoward Hinnant sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp); 467*3e519524SHoward Hinnant 468*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 469*3e519524SHoward Hinnant bool 470*3e519524SHoward Hinnant is_heap(RandomAccessIterator first, RandomAccessiterator last); 471*3e519524SHoward Hinnant 472*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 473*3e519524SHoward Hinnant bool 474*3e519524SHoward Hinnant is_heap(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 475*3e519524SHoward Hinnant 476*3e519524SHoward Hinnanttemplate <class RandomAccessIterator> 477*3e519524SHoward Hinnant RandomAccessIterator 478*3e519524SHoward Hinnant is_heap_until(RandomAccessIterator first, RandomAccessiterator last); 479*3e519524SHoward Hinnant 480*3e519524SHoward Hinnanttemplate <class RandomAccessIterator, class Compare> 481*3e519524SHoward Hinnant RandomAccessIterator 482*3e519524SHoward Hinnant is_heap_until(RandomAccessIterator first, RandomAccessiterator last, Compare comp); 483*3e519524SHoward Hinnant 484*3e519524SHoward Hinnanttemplate <class T> 485*3e519524SHoward Hinnant const T& 486*3e519524SHoward Hinnant min(const T& a, const T& b); 487*3e519524SHoward Hinnant 488*3e519524SHoward Hinnanttemplate <class T, class Compare> 489*3e519524SHoward Hinnant const T& 490*3e519524SHoward Hinnant min(const T& a, const T& b, Compare comp); 491*3e519524SHoward Hinnant 492*3e519524SHoward Hinnanttemplate <class T> 493*3e519524SHoward Hinnant const T& 494*3e519524SHoward Hinnant max(const T& a, const T& b); 495*3e519524SHoward Hinnant 496*3e519524SHoward Hinnanttemplate <class T, class Compare> 497*3e519524SHoward Hinnant const T& 498*3e519524SHoward Hinnant max(const T& a, const T& b, Compare comp); 499*3e519524SHoward Hinnant 500*3e519524SHoward Hinnanttemplate <class ForwardIterator> 501*3e519524SHoward Hinnant ForwardIterator 502*3e519524SHoward Hinnant min_element(ForwardIterator first, ForwardIterator last); 503*3e519524SHoward Hinnant 504*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare> 505*3e519524SHoward Hinnant ForwardIterator 506*3e519524SHoward Hinnant min_element(ForwardIterator first, ForwardIterator last, Compare comp); 507*3e519524SHoward Hinnant 508*3e519524SHoward Hinnanttemplate <class ForwardIterator> 509*3e519524SHoward Hinnant ForwardIterator 510*3e519524SHoward Hinnant max_element(ForwardIterator first, ForwardIterator last); 511*3e519524SHoward Hinnant 512*3e519524SHoward Hinnanttemplate <class ForwardIterator, class Compare> 513*3e519524SHoward Hinnant ForwardIterator 514*3e519524SHoward Hinnant max_element(ForwardIterator first, ForwardIterator last, Compare comp); 515*3e519524SHoward Hinnant 516*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2> 517*3e519524SHoward Hinnant bool 518*3e519524SHoward Hinnant lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2); 519*3e519524SHoward Hinnant 520*3e519524SHoward Hinnanttemplate <class InputIterator1, class InputIterator2, class Compare> 521*3e519524SHoward Hinnant bool 522*3e519524SHoward Hinnant lexicographical_compare(InputIterator1 first1, InputIterator1 last1, 523*3e519524SHoward Hinnant InputIterator2 first2, InputIterator2 last2, Compare comp); 524*3e519524SHoward Hinnant 525*3e519524SHoward Hinnanttemplate <class BidirectionalIterator> 526*3e519524SHoward Hinnant bool 527*3e519524SHoward Hinnant next_permutation(BidirectionalIterator first, BidirectionalIterator last); 528*3e519524SHoward Hinnant 529*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare> 530*3e519524SHoward Hinnant bool 531*3e519524SHoward Hinnant next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 532*3e519524SHoward Hinnant 533*3e519524SHoward Hinnanttemplate <class BidirectionalIterator> 534*3e519524SHoward Hinnant bool 535*3e519524SHoward Hinnant prev_permutation(BidirectionalIterator first, BidirectionalIterator last); 536*3e519524SHoward Hinnant 537*3e519524SHoward Hinnanttemplate <class BidirectionalIterator, class Compare> 538*3e519524SHoward Hinnant bool 539*3e519524SHoward Hinnant prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp); 540*3e519524SHoward Hinnant 541*3e519524SHoward Hinnant} // std 542*3e519524SHoward Hinnant 543*3e519524SHoward Hinnant*/ 544*3e519524SHoward Hinnant 545*3e519524SHoward Hinnant#include <__config> 546*3e519524SHoward Hinnant#include <initializer_list> 547*3e519524SHoward Hinnant#include <type_traits> 548*3e519524SHoward Hinnant#include <cstring> 549*3e519524SHoward Hinnant#include <utility> 550*3e519524SHoward Hinnant#include <memory> 551*3e519524SHoward Hinnant#include <iterator> 552*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 553*3e519524SHoward Hinnant#include <cassert> 554*3e519524SHoward Hinnant#endif 555*3e519524SHoward Hinnant//#include <cstdlib> 556*3e519524SHoward Hinnant#define RAND_MAX 0x7fffffff // #include <cstdlib> 557*3e519524SHoward Hinnantextern "C" int rand(void); // #include <cstdlib> 558*3e519524SHoward Hinnant 559*3e519524SHoward Hinnant#pragma GCC system_header 560*3e519524SHoward Hinnant 561*3e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 562*3e519524SHoward Hinnant 563*3e519524SHoward Hinnantusing ::rand; // #include <cstdlib> 564*3e519524SHoward Hinnant 565*3e519524SHoward Hinnanttemplate <class _T1, class _T2 = _T1> 566*3e519524SHoward Hinnantstruct __equal_to 567*3e519524SHoward Hinnant{ 568*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} 569*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x == __y;} 570*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x == __y;} 571*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x == __y;} 572*3e519524SHoward Hinnant}; 573*3e519524SHoward Hinnant 574*3e519524SHoward Hinnanttemplate <class _T1> 575*3e519524SHoward Hinnantstruct __equal_to<_T1, _T1> 576*3e519524SHoward Hinnant{ 577*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} 578*3e519524SHoward Hinnant}; 579*3e519524SHoward Hinnant 580*3e519524SHoward Hinnanttemplate <class _T1> 581*3e519524SHoward Hinnantstruct __equal_to<const _T1, _T1> 582*3e519524SHoward Hinnant{ 583*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} 584*3e519524SHoward Hinnant}; 585*3e519524SHoward Hinnant 586*3e519524SHoward Hinnanttemplate <class _T1> 587*3e519524SHoward Hinnantstruct __equal_to<_T1, const _T1> 588*3e519524SHoward Hinnant{ 589*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x == __y;} 590*3e519524SHoward Hinnant}; 591*3e519524SHoward Hinnant 592*3e519524SHoward Hinnanttemplate <class _T1, class _T2 = _T1> 593*3e519524SHoward Hinnantstruct __less 594*3e519524SHoward Hinnant{ 595*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} 596*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T2& __y) const {return __x < __y;} 597*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T1& __y) const {return __x < __y;} 598*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T2& __x, const _T2& __y) const {return __x < __y;} 599*3e519524SHoward Hinnant}; 600*3e519524SHoward Hinnant 601*3e519524SHoward Hinnanttemplate <class _T1> 602*3e519524SHoward Hinnantstruct __less<_T1, _T1> 603*3e519524SHoward Hinnant{ 604*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} 605*3e519524SHoward Hinnant}; 606*3e519524SHoward Hinnant 607*3e519524SHoward Hinnanttemplate <class _T1> 608*3e519524SHoward Hinnantstruct __less<const _T1, _T1> 609*3e519524SHoward Hinnant{ 610*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} 611*3e519524SHoward Hinnant}; 612*3e519524SHoward Hinnant 613*3e519524SHoward Hinnanttemplate <class _T1> 614*3e519524SHoward Hinnantstruct __less<_T1, const _T1> 615*3e519524SHoward Hinnant{ 616*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY bool operator()(const _T1& __x, const _T1& __y) const {return __x < __y;} 617*3e519524SHoward Hinnant}; 618*3e519524SHoward Hinnant 619*3e519524SHoward Hinnanttemplate <class _Predicate> 620*3e519524SHoward Hinnantclass __negate 621*3e519524SHoward Hinnant{ 622*3e519524SHoward Hinnantprivate: 623*3e519524SHoward Hinnant _Predicate __p_; 624*3e519524SHoward Hinnantpublic: 625*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY __negate() {} 626*3e519524SHoward Hinnant 627*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 628*3e519524SHoward Hinnant explicit __negate(_Predicate __p) : __p_(__p) {} 629*3e519524SHoward Hinnant 630*3e519524SHoward Hinnant template <class _T1> 631*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 632*3e519524SHoward Hinnant bool operator()(const _T1& __x) {return !__p_(__x);} 633*3e519524SHoward Hinnant 634*3e519524SHoward Hinnant template <class _T1, class _T2> 635*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 636*3e519524SHoward Hinnant bool operator()(const _T1& __x, const _T2& __y) {return !__p_(__x, __y);} 637*3e519524SHoward Hinnant}; 638*3e519524SHoward Hinnant 639*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 640*3e519524SHoward Hinnant 641*3e519524SHoward Hinnanttemplate <class _Compare> 642*3e519524SHoward Hinnantstruct __debug_less 643*3e519524SHoward Hinnant{ 644*3e519524SHoward Hinnant _Compare __comp_; 645*3e519524SHoward Hinnant __debug_less(_Compare& __c) : __comp_(__c) {} 646*3e519524SHoward Hinnant template <class _Tp, class _Up> 647*3e519524SHoward Hinnant bool operator()(const _Tp& __x, const _Up& __y) 648*3e519524SHoward Hinnant { 649*3e519524SHoward Hinnant bool __r = __comp_(__x, __y); 650*3e519524SHoward Hinnant if (__r) 651*3e519524SHoward Hinnant assert(!__comp_(__y, __x)); 652*3e519524SHoward Hinnant return __r; 653*3e519524SHoward Hinnant } 654*3e519524SHoward Hinnant}; 655*3e519524SHoward Hinnant 656*3e519524SHoward Hinnant#endif // _LIBCPP_DEBUG 657*3e519524SHoward Hinnant 658*3e519524SHoward Hinnant// all_of 659*3e519524SHoward Hinnant 660*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate> 661*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 662*3e519524SHoward Hinnantbool 663*3e519524SHoward Hinnantall_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) 664*3e519524SHoward Hinnant{ 665*3e519524SHoward Hinnant for (; __first != __last; ++__first) 666*3e519524SHoward Hinnant if (!__pred(*__first)) 667*3e519524SHoward Hinnant return false; 668*3e519524SHoward Hinnant return true; 669*3e519524SHoward Hinnant} 670*3e519524SHoward Hinnant 671*3e519524SHoward Hinnant// any_of 672*3e519524SHoward Hinnant 673*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate> 674*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 675*3e519524SHoward Hinnantbool 676*3e519524SHoward Hinnantany_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) 677*3e519524SHoward Hinnant{ 678*3e519524SHoward Hinnant for (; __first != __last; ++__first) 679*3e519524SHoward Hinnant if (__pred(*__first)) 680*3e519524SHoward Hinnant return true; 681*3e519524SHoward Hinnant return false; 682*3e519524SHoward Hinnant} 683*3e519524SHoward Hinnant 684*3e519524SHoward Hinnant// none_of 685*3e519524SHoward Hinnant 686*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate> 687*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 688*3e519524SHoward Hinnantbool 689*3e519524SHoward Hinnantnone_of(_InputIterator __first, _InputIterator __last, _Predicate __pred) 690*3e519524SHoward Hinnant{ 691*3e519524SHoward Hinnant for (; __first != __last; ++__first) 692*3e519524SHoward Hinnant if (__pred(*__first)) 693*3e519524SHoward Hinnant return false; 694*3e519524SHoward Hinnant return true; 695*3e519524SHoward Hinnant} 696*3e519524SHoward Hinnant 697*3e519524SHoward Hinnant// for_each 698*3e519524SHoward Hinnant 699*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Function> 700*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 701*3e519524SHoward Hinnant_Function 702*3e519524SHoward Hinnantfor_each(_InputIterator __first, _InputIterator __last, _Function __f) 703*3e519524SHoward Hinnant{ 704*3e519524SHoward Hinnant for (; __first != __last; ++__first) 705*3e519524SHoward Hinnant __f(*__first); 706*3e519524SHoward Hinnant return _STD::move(__f); 707*3e519524SHoward Hinnant} 708*3e519524SHoward Hinnant 709*3e519524SHoward Hinnant// find 710*3e519524SHoward Hinnant 711*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp> 712*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 713*3e519524SHoward Hinnant_InputIterator 714*3e519524SHoward Hinnantfind(_InputIterator __first, _InputIterator __last, const _Tp& __value) 715*3e519524SHoward Hinnant{ 716*3e519524SHoward Hinnant for (; __first != __last; ++__first) 717*3e519524SHoward Hinnant if (*__first == __value) 718*3e519524SHoward Hinnant break; 719*3e519524SHoward Hinnant return __first; 720*3e519524SHoward Hinnant} 721*3e519524SHoward Hinnant 722*3e519524SHoward Hinnant// find_if 723*3e519524SHoward Hinnant 724*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate> 725*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 726*3e519524SHoward Hinnant_InputIterator 727*3e519524SHoward Hinnantfind_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) 728*3e519524SHoward Hinnant{ 729*3e519524SHoward Hinnant for (; __first != __last; ++__first) 730*3e519524SHoward Hinnant if (__pred(*__first)) 731*3e519524SHoward Hinnant break; 732*3e519524SHoward Hinnant return __first; 733*3e519524SHoward Hinnant} 734*3e519524SHoward Hinnant 735*3e519524SHoward Hinnant// find_if_not 736*3e519524SHoward Hinnant 737*3e519524SHoward Hinnanttemplate<class _InputIterator, class _Predicate> 738*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 739*3e519524SHoward Hinnant_InputIterator 740*3e519524SHoward Hinnantfind_if_not(_InputIterator __first, _InputIterator __last, _Predicate __pred) 741*3e519524SHoward Hinnant{ 742*3e519524SHoward Hinnant for (; __first != __last; ++__first) 743*3e519524SHoward Hinnant if (!__pred(*__first)) 744*3e519524SHoward Hinnant break; 745*3e519524SHoward Hinnant return __first; 746*3e519524SHoward Hinnant} 747*3e519524SHoward Hinnant 748*3e519524SHoward Hinnant// find_end 749*3e519524SHoward Hinnant 750*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2> 751*3e519524SHoward Hinnant_ForwardIterator1 752*3e519524SHoward Hinnant__find_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 753*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred, 754*3e519524SHoward Hinnant forward_iterator_tag, forward_iterator_tag) 755*3e519524SHoward Hinnant{ 756*3e519524SHoward Hinnant // modeled after search algorithm 757*3e519524SHoward Hinnant _ForwardIterator1 __r = __last1; // __last1 is the "default" answer 758*3e519524SHoward Hinnant if (__first2 == __last2) 759*3e519524SHoward Hinnant return __r; 760*3e519524SHoward Hinnant while (true) 761*3e519524SHoward Hinnant { 762*3e519524SHoward Hinnant while (true) 763*3e519524SHoward Hinnant { 764*3e519524SHoward Hinnant if (__first1 == __last1) // if source exhausted return last correct answer 765*3e519524SHoward Hinnant return __r; // (or __last1 if never found) 766*3e519524SHoward Hinnant if (__pred(*__first1, *__first2)) 767*3e519524SHoward Hinnant break; 768*3e519524SHoward Hinnant ++__first1; 769*3e519524SHoward Hinnant } 770*3e519524SHoward Hinnant // *__first1 matches *__first2, now match elements after here 771*3e519524SHoward Hinnant _ForwardIterator1 __m1 = __first1; 772*3e519524SHoward Hinnant _ForwardIterator2 __m2 = __first2; 773*3e519524SHoward Hinnant while (true) 774*3e519524SHoward Hinnant { 775*3e519524SHoward Hinnant if (++__m2 == __last2) 776*3e519524SHoward Hinnant { // Pattern exhaused, record answer and search for another one 777*3e519524SHoward Hinnant __r = __first1; 778*3e519524SHoward Hinnant ++__first1; 779*3e519524SHoward Hinnant break; 780*3e519524SHoward Hinnant } 781*3e519524SHoward Hinnant if (++__m1 == __last1) // Source exhausted, return last answer 782*3e519524SHoward Hinnant return __r; 783*3e519524SHoward Hinnant if (!__pred(*__m1, *__m2)) // mismatch, restart with a new __first 784*3e519524SHoward Hinnant { 785*3e519524SHoward Hinnant ++__first1; 786*3e519524SHoward Hinnant break; 787*3e519524SHoward Hinnant } // else there is a match, check next elements 788*3e519524SHoward Hinnant } 789*3e519524SHoward Hinnant } 790*3e519524SHoward Hinnant} 791*3e519524SHoward Hinnant 792*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _BidirectionalIterator1, class _BidirectionalIterator2> 793*3e519524SHoward Hinnant_BidirectionalIterator1 794*3e519524SHoward Hinnant__find_end(_BidirectionalIterator1 __first1, _BidirectionalIterator1 __last1, 795*3e519524SHoward Hinnant _BidirectionalIterator2 __first2, _BidirectionalIterator2 __last2, _BinaryPredicate __pred, 796*3e519524SHoward Hinnant bidirectional_iterator_tag, bidirectional_iterator_tag) 797*3e519524SHoward Hinnant{ 798*3e519524SHoward Hinnant // modeled after search algorithm (in reverse) 799*3e519524SHoward Hinnant if (__first2 == __last2) 800*3e519524SHoward Hinnant return __last1; // Everything matches an empty sequence 801*3e519524SHoward Hinnant _BidirectionalIterator1 __l1 = __last1; 802*3e519524SHoward Hinnant _BidirectionalIterator2 __l2 = __last2; 803*3e519524SHoward Hinnant --__l2; 804*3e519524SHoward Hinnant while (true) 805*3e519524SHoward Hinnant { 806*3e519524SHoward Hinnant // Find last element in sequence 1 that matchs *(__last2-1), with a mininum of loop checks 807*3e519524SHoward Hinnant while (true) 808*3e519524SHoward Hinnant { 809*3e519524SHoward Hinnant if (__first1 == __l1) // return __last1 if no element matches *__first2 810*3e519524SHoward Hinnant return __last1; 811*3e519524SHoward Hinnant if (__pred(*--__l1, *__l2)) 812*3e519524SHoward Hinnant break; 813*3e519524SHoward Hinnant } 814*3e519524SHoward Hinnant // *__l1 matches *__l2, now match elements before here 815*3e519524SHoward Hinnant _BidirectionalIterator1 __m1 = __l1; 816*3e519524SHoward Hinnant _BidirectionalIterator2 __m2 = __l2; 817*3e519524SHoward Hinnant while (true) 818*3e519524SHoward Hinnant { 819*3e519524SHoward Hinnant if (__m2 == __first2) // If pattern exhausted, __m1 is the answer (works for 1 element pattern) 820*3e519524SHoward Hinnant return __m1; 821*3e519524SHoward Hinnant if (__m1 == __first1) // Otherwise if source exhaused, pattern not found 822*3e519524SHoward Hinnant return __last1; 823*3e519524SHoward Hinnant if (!__pred(*--__m1, *--__m2)) // if there is a mismatch, restart with a new __l1 824*3e519524SHoward Hinnant { 825*3e519524SHoward Hinnant break; 826*3e519524SHoward Hinnant } // else there is a match, check next elements 827*3e519524SHoward Hinnant } 828*3e519524SHoward Hinnant } 829*3e519524SHoward Hinnant} 830*3e519524SHoward Hinnant 831*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2> 832*3e519524SHoward Hinnant_RandomAccessIterator1 833*3e519524SHoward Hinnant__find_end(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, 834*3e519524SHoward Hinnant _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred, 835*3e519524SHoward Hinnant random_access_iterator_tag, random_access_iterator_tag) 836*3e519524SHoward Hinnant{ 837*3e519524SHoward Hinnant // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern 838*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator2>::difference_type __len2 = __last2 - __first2; 839*3e519524SHoward Hinnant if (__len2 == 0) 840*3e519524SHoward Hinnant return __last1; 841*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator1>::difference_type __len1 = __last1 - __first1; 842*3e519524SHoward Hinnant if (__len1 < __len2) 843*3e519524SHoward Hinnant return __last1; 844*3e519524SHoward Hinnant const _RandomAccessIterator1 __s = __first1 + (__len2 - 1); // End of pattern match can't go before here 845*3e519524SHoward Hinnant _RandomAccessIterator1 __l1 = __last1; 846*3e519524SHoward Hinnant _RandomAccessIterator2 __l2 = __last2; 847*3e519524SHoward Hinnant --__l2; 848*3e519524SHoward Hinnant while (true) 849*3e519524SHoward Hinnant { 850*3e519524SHoward Hinnant while (true) 851*3e519524SHoward Hinnant { 852*3e519524SHoward Hinnant if (__s == __l1) 853*3e519524SHoward Hinnant return __last1; 854*3e519524SHoward Hinnant if (__pred(*--__l1, *__l2)) 855*3e519524SHoward Hinnant break; 856*3e519524SHoward Hinnant } 857*3e519524SHoward Hinnant _RandomAccessIterator1 __m1 = __l1; 858*3e519524SHoward Hinnant _RandomAccessIterator2 __m2 = __l2; 859*3e519524SHoward Hinnant while (true) 860*3e519524SHoward Hinnant { 861*3e519524SHoward Hinnant if (__m2 == __first2) 862*3e519524SHoward Hinnant return __m1; 863*3e519524SHoward Hinnant // no need to check range on __m1 because __s guarantees we have enough source 864*3e519524SHoward Hinnant if (!__pred(*--__m1, *--__m2)) 865*3e519524SHoward Hinnant { 866*3e519524SHoward Hinnant break; 867*3e519524SHoward Hinnant } 868*3e519524SHoward Hinnant } 869*3e519524SHoward Hinnant } 870*3e519524SHoward Hinnant} 871*3e519524SHoward Hinnant 872*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> 873*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 874*3e519524SHoward Hinnant_ForwardIterator1 875*3e519524SHoward Hinnantfind_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 876*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred) 877*3e519524SHoward Hinnant{ 878*3e519524SHoward Hinnant return _STD::__find_end<typename add_lvalue_reference<_BinaryPredicate>::type> 879*3e519524SHoward Hinnant (__first1, __last1, __first2, __last2, __pred, 880*3e519524SHoward Hinnant typename iterator_traits<_ForwardIterator1>::iterator_category(), 881*3e519524SHoward Hinnant typename iterator_traits<_ForwardIterator2>::iterator_category()); 882*3e519524SHoward Hinnant} 883*3e519524SHoward Hinnant 884*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2> 885*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 886*3e519524SHoward Hinnant_ForwardIterator1 887*3e519524SHoward Hinnantfind_end(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 888*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2) 889*3e519524SHoward Hinnant{ 890*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; 891*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; 892*3e519524SHoward Hinnant return _STD::find_end(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>()); 893*3e519524SHoward Hinnant} 894*3e519524SHoward Hinnant 895*3e519524SHoward Hinnant// find_first_of 896*3e519524SHoward Hinnant 897*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> 898*3e519524SHoward Hinnant_ForwardIterator1 899*3e519524SHoward Hinnantfind_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 900*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred) 901*3e519524SHoward Hinnant{ 902*3e519524SHoward Hinnant for (; __first1 != __last1; ++__first1) 903*3e519524SHoward Hinnant for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) 904*3e519524SHoward Hinnant if (__pred(*__first1, *__j)) 905*3e519524SHoward Hinnant return __first1; 906*3e519524SHoward Hinnant return __last1; 907*3e519524SHoward Hinnant} 908*3e519524SHoward Hinnant 909*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2> 910*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 911*3e519524SHoward Hinnant_ForwardIterator1 912*3e519524SHoward Hinnantfind_first_of(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 913*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2) 914*3e519524SHoward Hinnant{ 915*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; 916*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; 917*3e519524SHoward Hinnant return _STD::find_first_of(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>()); 918*3e519524SHoward Hinnant} 919*3e519524SHoward Hinnant 920*3e519524SHoward Hinnant// adjacent_find 921*3e519524SHoward Hinnant 922*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _BinaryPredicate> 923*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 924*3e519524SHoward Hinnant_ForwardIterator 925*3e519524SHoward Hinnantadjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) 926*3e519524SHoward Hinnant{ 927*3e519524SHoward Hinnant if (__first != __last) 928*3e519524SHoward Hinnant { 929*3e519524SHoward Hinnant _ForwardIterator __i = __first; 930*3e519524SHoward Hinnant while (++__i != __last) 931*3e519524SHoward Hinnant { 932*3e519524SHoward Hinnant if (__pred(*__first, *__i)) 933*3e519524SHoward Hinnant return __first; 934*3e519524SHoward Hinnant __first = __i; 935*3e519524SHoward Hinnant } 936*3e519524SHoward Hinnant } 937*3e519524SHoward Hinnant return __last; 938*3e519524SHoward Hinnant} 939*3e519524SHoward Hinnant 940*3e519524SHoward Hinnanttemplate <class _ForwardIterator> 941*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 942*3e519524SHoward Hinnant_ForwardIterator 943*3e519524SHoward Hinnantadjacent_find(_ForwardIterator __first, _ForwardIterator __last) 944*3e519524SHoward Hinnant{ 945*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type __v; 946*3e519524SHoward Hinnant return _STD::adjacent_find(__first, __last, __equal_to<__v>()); 947*3e519524SHoward Hinnant} 948*3e519524SHoward Hinnant 949*3e519524SHoward Hinnant// count 950*3e519524SHoward Hinnant 951*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Tp> 952*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 953*3e519524SHoward Hinnanttypename iterator_traits<_InputIterator>::difference_type 954*3e519524SHoward Hinnantcount(_InputIterator __first, _InputIterator __last, const _Tp& __value) 955*3e519524SHoward Hinnant{ 956*3e519524SHoward Hinnant typename iterator_traits<_InputIterator>::difference_type __r(0); 957*3e519524SHoward Hinnant for (; __first != __last; ++__first) 958*3e519524SHoward Hinnant if (*__first == __value) 959*3e519524SHoward Hinnant ++__r; 960*3e519524SHoward Hinnant return __r; 961*3e519524SHoward Hinnant} 962*3e519524SHoward Hinnant 963*3e519524SHoward Hinnant// count_if 964*3e519524SHoward Hinnant 965*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate> 966*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 967*3e519524SHoward Hinnanttypename iterator_traits<_InputIterator>::difference_type 968*3e519524SHoward Hinnantcount_if(_InputIterator __first, _InputIterator __last, _Predicate __pred) 969*3e519524SHoward Hinnant{ 970*3e519524SHoward Hinnant typename iterator_traits<_InputIterator>::difference_type __r(0); 971*3e519524SHoward Hinnant for (; __first != __last; ++__first) 972*3e519524SHoward Hinnant if (__pred(*__first)) 973*3e519524SHoward Hinnant ++__r; 974*3e519524SHoward Hinnant return __r; 975*3e519524SHoward Hinnant} 976*3e519524SHoward Hinnant 977*3e519524SHoward Hinnant// mismatch 978*3e519524SHoward Hinnant 979*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> 980*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 981*3e519524SHoward Hinnantpair<_InputIterator1, _InputIterator2> 982*3e519524SHoward Hinnantmismatch(_InputIterator1 __first1, _InputIterator1 __last1, 983*3e519524SHoward Hinnant _InputIterator2 __first2, _BinaryPredicate __pred) 984*3e519524SHoward Hinnant{ 985*3e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 986*3e519524SHoward Hinnant if (!__pred(*__first1, *__first2)) 987*3e519524SHoward Hinnant break; 988*3e519524SHoward Hinnant return pair<_InputIterator1, _InputIterator2>(__first1, __first2); 989*3e519524SHoward Hinnant} 990*3e519524SHoward Hinnant 991*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2> 992*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 993*3e519524SHoward Hinnantpair<_InputIterator1, _InputIterator2> 994*3e519524SHoward Hinnantmismatch(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) 995*3e519524SHoward Hinnant{ 996*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator1>::value_type __v1; 997*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator2>::value_type __v2; 998*3e519524SHoward Hinnant return _STD::mismatch(__first1, __last1, __first2, __equal_to<__v1, __v2>()); 999*3e519524SHoward Hinnant} 1000*3e519524SHoward Hinnant 1001*3e519524SHoward Hinnant// equal 1002*3e519524SHoward Hinnant 1003*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _BinaryPredicate> 1004*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1005*3e519524SHoward Hinnantbool 1006*3e519524SHoward Hinnantequal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _BinaryPredicate __pred) 1007*3e519524SHoward Hinnant{ 1008*3e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 1009*3e519524SHoward Hinnant if (!__pred(*__first1, *__first2)) 1010*3e519524SHoward Hinnant return false; 1011*3e519524SHoward Hinnant return true; 1012*3e519524SHoward Hinnant} 1013*3e519524SHoward Hinnant 1014*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2> 1015*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1016*3e519524SHoward Hinnantbool 1017*3e519524SHoward Hinnantequal(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2) 1018*3e519524SHoward Hinnant{ 1019*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator1>::value_type __v1; 1020*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator2>::value_type __v2; 1021*3e519524SHoward Hinnant return _STD::equal(__first1, __last1, __first2, __equal_to<__v1, __v2>()); 1022*3e519524SHoward Hinnant} 1023*3e519524SHoward Hinnant 1024*3e519524SHoward Hinnant// is_permutation 1025*3e519524SHoward Hinnant 1026*3e519524SHoward Hinnanttemplate<class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> 1027*3e519524SHoward Hinnantbool 1028*3e519524SHoward Hinnantis_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 1029*3e519524SHoward Hinnant _ForwardIterator2 __first2, _BinaryPredicate __pred) 1030*3e519524SHoward Hinnant{ 1031*3e519524SHoward Hinnant // shorten sequences as much as possible by lopping of any equal parts 1032*3e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2) 1033*3e519524SHoward Hinnant if (!__pred(*__first1, *__first2)) 1034*3e519524SHoward Hinnant goto __not_done; 1035*3e519524SHoward Hinnant return true; 1036*3e519524SHoward Hinnant__not_done: 1037*3e519524SHoward Hinnant // __first1 != __last1 && *__first1 != *__first2 1038*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator1>::difference_type _D1; 1039*3e519524SHoward Hinnant _D1 __l1 = _STD::distance(__first1, __last1); 1040*3e519524SHoward Hinnant if (__l1 == _D1(1)) 1041*3e519524SHoward Hinnant return false; 1042*3e519524SHoward Hinnant _ForwardIterator2 __last2 = _STD::next(__first2, __l1); 1043*3e519524SHoward Hinnant // For each element in [f1, l1) see if there are the same number of 1044*3e519524SHoward Hinnant // equal elements in [f2, l2) 1045*3e519524SHoward Hinnant for (_ForwardIterator1 __i = __first1; __i != __last1; ++__i) 1046*3e519524SHoward Hinnant { 1047*3e519524SHoward Hinnant // Have we already counted the number of *__i in [f1, l1)? 1048*3e519524SHoward Hinnant for (_ForwardIterator1 __j = __first1; __j != __i; ++__j) 1049*3e519524SHoward Hinnant if (__pred(*__j, *__i)) 1050*3e519524SHoward Hinnant goto __next_iter; 1051*3e519524SHoward Hinnant { 1052*3e519524SHoward Hinnant // Count number of *__i in [f2, l2) 1053*3e519524SHoward Hinnant _D1 __c2 = 0; 1054*3e519524SHoward Hinnant for (_ForwardIterator2 __j = __first2; __j != __last2; ++__j) 1055*3e519524SHoward Hinnant if (__pred(*__i, *__j)) 1056*3e519524SHoward Hinnant ++__c2; 1057*3e519524SHoward Hinnant if (__c2 == 0) 1058*3e519524SHoward Hinnant return false; 1059*3e519524SHoward Hinnant // Count number of *__i in [__i, l1) (we can start with 1) 1060*3e519524SHoward Hinnant _D1 __c1 = 1; 1061*3e519524SHoward Hinnant for (_ForwardIterator1 __j = _STD::next(__i); __j != __last1; ++__j) 1062*3e519524SHoward Hinnant if (__pred(*__i, *__j)) 1063*3e519524SHoward Hinnant ++__c1; 1064*3e519524SHoward Hinnant if (__c1 != __c2) 1065*3e519524SHoward Hinnant return false; 1066*3e519524SHoward Hinnant } 1067*3e519524SHoward Hinnant__next_iter:; 1068*3e519524SHoward Hinnant } 1069*3e519524SHoward Hinnant return true; 1070*3e519524SHoward Hinnant} 1071*3e519524SHoward Hinnant 1072*3e519524SHoward Hinnanttemplate<class _ForwardIterator1, class _ForwardIterator2> 1073*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1074*3e519524SHoward Hinnantbool 1075*3e519524SHoward Hinnantis_permutation(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 1076*3e519524SHoward Hinnant _ForwardIterator2 __first2) 1077*3e519524SHoward Hinnant{ 1078*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator1>::value_type __v1; 1079*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator2>::value_type __v2; 1080*3e519524SHoward Hinnant return _STD::is_permutation(__first1, __last1, __first2, __equal_to<__v1, __v2>()); 1081*3e519524SHoward Hinnant} 1082*3e519524SHoward Hinnant 1083*3e519524SHoward Hinnant// search 1084*3e519524SHoward Hinnant 1085*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator1, class _ForwardIterator2> 1086*3e519524SHoward Hinnant_ForwardIterator1 1087*3e519524SHoward Hinnant__search(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 1088*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred, 1089*3e519524SHoward Hinnant forward_iterator_tag, forward_iterator_tag) 1090*3e519524SHoward Hinnant{ 1091*3e519524SHoward Hinnant if (__first2 == __last2) 1092*3e519524SHoward Hinnant return __first1; // Everything matches an empty sequence 1093*3e519524SHoward Hinnant while (true) 1094*3e519524SHoward Hinnant { 1095*3e519524SHoward Hinnant // Find first element in sequence 1 that matchs *__first2, with a mininum of loop checks 1096*3e519524SHoward Hinnant while (true) 1097*3e519524SHoward Hinnant { 1098*3e519524SHoward Hinnant if (__first1 == __last1) // return __last1 if no element matches *__first2 1099*3e519524SHoward Hinnant return __last1; 1100*3e519524SHoward Hinnant if (__pred(*__first1, *__first2)) 1101*3e519524SHoward Hinnant break; 1102*3e519524SHoward Hinnant ++__first1; 1103*3e519524SHoward Hinnant } 1104*3e519524SHoward Hinnant // *__first1 matches *__first2, now match elements after here 1105*3e519524SHoward Hinnant _ForwardIterator1 __m1 = __first1; 1106*3e519524SHoward Hinnant _ForwardIterator2 __m2 = __first2; 1107*3e519524SHoward Hinnant while (true) 1108*3e519524SHoward Hinnant { 1109*3e519524SHoward Hinnant if (++__m2 == __last2) // If pattern exhausted, __first1 is the answer (works for 1 element pattern) 1110*3e519524SHoward Hinnant return __first1; 1111*3e519524SHoward Hinnant if (++__m1 == __last1) // Otherwise if source exhaused, pattern not found 1112*3e519524SHoward Hinnant return __last1; 1113*3e519524SHoward Hinnant if (!__pred(*__m1, *__m2)) // if there is a mismatch, restart with a new __first1 1114*3e519524SHoward Hinnant { 1115*3e519524SHoward Hinnant ++__first1; 1116*3e519524SHoward Hinnant break; 1117*3e519524SHoward Hinnant } // else there is a match, check next elements 1118*3e519524SHoward Hinnant } 1119*3e519524SHoward Hinnant } 1120*3e519524SHoward Hinnant} 1121*3e519524SHoward Hinnant 1122*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _RandomAccessIterator1, class _RandomAccessIterator2> 1123*3e519524SHoward Hinnant_RandomAccessIterator1 1124*3e519524SHoward Hinnant__search(_RandomAccessIterator1 __first1, _RandomAccessIterator1 __last1, 1125*3e519524SHoward Hinnant _RandomAccessIterator2 __first2, _RandomAccessIterator2 __last2, _BinaryPredicate __pred, 1126*3e519524SHoward Hinnant random_access_iterator_tag, random_access_iterator_tag) 1127*3e519524SHoward Hinnant{ 1128*3e519524SHoward Hinnant typedef typename std::iterator_traits<_RandomAccessIterator1>::difference_type _D1; 1129*3e519524SHoward Hinnant typedef typename std::iterator_traits<_RandomAccessIterator2>::difference_type _D2; 1130*3e519524SHoward Hinnant // Take advantage of knowing source and pattern lengths. Stop short when source is smaller than pattern 1131*3e519524SHoward Hinnant _D2 __len2 = __last2 - __first2; 1132*3e519524SHoward Hinnant if (__len2 == 0) 1133*3e519524SHoward Hinnant return __first1; 1134*3e519524SHoward Hinnant _D1 __len1 = __last1 - __first1; 1135*3e519524SHoward Hinnant if (__len1 < __len2) 1136*3e519524SHoward Hinnant return __last1; 1137*3e519524SHoward Hinnant const _RandomAccessIterator1 __s = __last1 - (__len2 - 1); // Start of pattern match can't go beyond here 1138*3e519524SHoward Hinnant while (true) 1139*3e519524SHoward Hinnant { 1140*3e519524SHoward Hinnant#if !_LIBCPP_UNROLL_LOOPS 1141*3e519524SHoward Hinnant while (true) 1142*3e519524SHoward Hinnant { 1143*3e519524SHoward Hinnant if (__first1 == __s) 1144*3e519524SHoward Hinnant return __last1; 1145*3e519524SHoward Hinnant if (__pred(*__first1, *__first2)) 1146*3e519524SHoward Hinnant break; 1147*3e519524SHoward Hinnant ++__first1; 1148*3e519524SHoward Hinnant } 1149*3e519524SHoward Hinnant#else // _LIBCPP_UNROLL_LOOPS 1150*3e519524SHoward Hinnant for (_D1 __loop_unroll = (__s - __first1) / 4; __loop_unroll > 0; --__loop_unroll) 1151*3e519524SHoward Hinnant { 1152*3e519524SHoward Hinnant if (__pred(*__first1, *__first2)) 1153*3e519524SHoward Hinnant goto __phase2; 1154*3e519524SHoward Hinnant if (__pred(*++__first1, *__first2)) 1155*3e519524SHoward Hinnant goto __phase2; 1156*3e519524SHoward Hinnant if (__pred(*++__first1, *__first2)) 1157*3e519524SHoward Hinnant goto __phase2; 1158*3e519524SHoward Hinnant if (__pred(*++__first1, *__first2)) 1159*3e519524SHoward Hinnant goto __phase2; 1160*3e519524SHoward Hinnant ++__first1; 1161*3e519524SHoward Hinnant } 1162*3e519524SHoward Hinnant switch (__s - __first1) 1163*3e519524SHoward Hinnant { 1164*3e519524SHoward Hinnant case 3: 1165*3e519524SHoward Hinnant if (__pred(*__first1, *__first2)) 1166*3e519524SHoward Hinnant break; 1167*3e519524SHoward Hinnant ++__first1; 1168*3e519524SHoward Hinnant case 2: 1169*3e519524SHoward Hinnant if (__pred(*__first1, *__first2)) 1170*3e519524SHoward Hinnant break; 1171*3e519524SHoward Hinnant ++__first1; 1172*3e519524SHoward Hinnant case 1: 1173*3e519524SHoward Hinnant if (__pred(*__first1, *__first2)) 1174*3e519524SHoward Hinnant break; 1175*3e519524SHoward Hinnant case 0: 1176*3e519524SHoward Hinnant return __last1; 1177*3e519524SHoward Hinnant } 1178*3e519524SHoward Hinnant __phase2: 1179*3e519524SHoward Hinnant#endif // _LIBCPP_UNROLL_LOOPS 1180*3e519524SHoward Hinnant _RandomAccessIterator1 __m1 = __first1; 1181*3e519524SHoward Hinnant _RandomAccessIterator2 __m2 = __first2; 1182*3e519524SHoward Hinnant#if !_LIBCPP_UNROLL_LOOPS 1183*3e519524SHoward Hinnant while (true) 1184*3e519524SHoward Hinnant { 1185*3e519524SHoward Hinnant if (++__m2 == __last2) 1186*3e519524SHoward Hinnant return __first1; 1187*3e519524SHoward Hinnant ++__m1; // no need to check range on __m1 because __s guarantees we have enough source 1188*3e519524SHoward Hinnant if (!__pred(*__m1, *__m2)) 1189*3e519524SHoward Hinnant { 1190*3e519524SHoward Hinnant ++__first1; 1191*3e519524SHoward Hinnant break; 1192*3e519524SHoward Hinnant } 1193*3e519524SHoward Hinnant } 1194*3e519524SHoward Hinnant#else // _LIBCPP_UNROLL_LOOPS 1195*3e519524SHoward Hinnant ++__m2; 1196*3e519524SHoward Hinnant ++__m1; 1197*3e519524SHoward Hinnant for (_D2 __loop_unroll = (__last2 - __m2) / 4; __loop_unroll > 0; --__loop_unroll) 1198*3e519524SHoward Hinnant { 1199*3e519524SHoward Hinnant if (!__pred(*__m1, *__m2)) 1200*3e519524SHoward Hinnant goto __continue; 1201*3e519524SHoward Hinnant if (!__pred(*++__m1, *++__m2)) 1202*3e519524SHoward Hinnant goto __continue; 1203*3e519524SHoward Hinnant if (!__pred(*++__m1, *++__m2)) 1204*3e519524SHoward Hinnant goto __continue; 1205*3e519524SHoward Hinnant if (!__pred(*++__m1, *++__m2)) 1206*3e519524SHoward Hinnant goto __continue; 1207*3e519524SHoward Hinnant ++__m1; 1208*3e519524SHoward Hinnant ++__m2; 1209*3e519524SHoward Hinnant } 1210*3e519524SHoward Hinnant switch (__last2 - __m2) 1211*3e519524SHoward Hinnant { 1212*3e519524SHoward Hinnant case 3: 1213*3e519524SHoward Hinnant if (!__pred(*__m1, *__m2)) 1214*3e519524SHoward Hinnant break; 1215*3e519524SHoward Hinnant ++__m1; 1216*3e519524SHoward Hinnant ++__m2; 1217*3e519524SHoward Hinnant case 2: 1218*3e519524SHoward Hinnant if (!__pred(*__m1, *__m2)) 1219*3e519524SHoward Hinnant break; 1220*3e519524SHoward Hinnant ++__m1; 1221*3e519524SHoward Hinnant ++__m2; 1222*3e519524SHoward Hinnant case 1: 1223*3e519524SHoward Hinnant if (!__pred(*__m1, *__m2)) 1224*3e519524SHoward Hinnant break; 1225*3e519524SHoward Hinnant case 0: 1226*3e519524SHoward Hinnant return __first1; 1227*3e519524SHoward Hinnant } 1228*3e519524SHoward Hinnant __continue: 1229*3e519524SHoward Hinnant ++__first1; 1230*3e519524SHoward Hinnant#endif // _LIBCPP_UNROLL_LOOPS 1231*3e519524SHoward Hinnant } 1232*3e519524SHoward Hinnant} 1233*3e519524SHoward Hinnant 1234*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2, class _BinaryPredicate> 1235*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1236*3e519524SHoward Hinnant_ForwardIterator1 1237*3e519524SHoward Hinnantsearch(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 1238*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2, _BinaryPredicate __pred) 1239*3e519524SHoward Hinnant{ 1240*3e519524SHoward Hinnant return _STD::__search<typename add_lvalue_reference<_BinaryPredicate>::type> 1241*3e519524SHoward Hinnant (__first1, __last1, __first2, __last2, __pred, 1242*3e519524SHoward Hinnant typename std::iterator_traits<_ForwardIterator1>::iterator_category(), 1243*3e519524SHoward Hinnant typename std::iterator_traits<_ForwardIterator2>::iterator_category()); 1244*3e519524SHoward Hinnant} 1245*3e519524SHoward Hinnant 1246*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2> 1247*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1248*3e519524SHoward Hinnant_ForwardIterator1 1249*3e519524SHoward Hinnantsearch(_ForwardIterator1 __first1, _ForwardIterator1 __last1, 1250*3e519524SHoward Hinnant _ForwardIterator2 __first2, _ForwardIterator2 __last2) 1251*3e519524SHoward Hinnant{ 1252*3e519524SHoward Hinnant typedef typename std::iterator_traits<_ForwardIterator1>::value_type __v1; 1253*3e519524SHoward Hinnant typedef typename std::iterator_traits<_ForwardIterator2>::value_type __v2; 1254*3e519524SHoward Hinnant return _STD::search(__first1, __last1, __first2, __last2, __equal_to<__v1, __v2>()); 1255*3e519524SHoward Hinnant} 1256*3e519524SHoward Hinnant 1257*3e519524SHoward Hinnant// search_n 1258*3e519524SHoward Hinnant 1259*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator, class _Size, class _Tp> 1260*3e519524SHoward Hinnant_ForwardIterator 1261*3e519524SHoward Hinnant__search_n(_ForwardIterator __first, _ForwardIterator __last, 1262*3e519524SHoward Hinnant _Size __count, const _Tp& __value, _BinaryPredicate __pred, forward_iterator_tag) 1263*3e519524SHoward Hinnant{ 1264*3e519524SHoward Hinnant if (__count <= 0) 1265*3e519524SHoward Hinnant return __first; 1266*3e519524SHoward Hinnant while (true) 1267*3e519524SHoward Hinnant { 1268*3e519524SHoward Hinnant // Find first element in sequence that matchs __value, with a mininum of loop checks 1269*3e519524SHoward Hinnant while (true) 1270*3e519524SHoward Hinnant { 1271*3e519524SHoward Hinnant if (__first == __last) // return __last if no element matches __value 1272*3e519524SHoward Hinnant return __last; 1273*3e519524SHoward Hinnant if (__pred(*__first, __value)) 1274*3e519524SHoward Hinnant break; 1275*3e519524SHoward Hinnant ++__first; 1276*3e519524SHoward Hinnant } 1277*3e519524SHoward Hinnant // *__first matches __value, now match elements after here 1278*3e519524SHoward Hinnant _ForwardIterator __m = __first; 1279*3e519524SHoward Hinnant _Size __c(0); 1280*3e519524SHoward Hinnant while (true) 1281*3e519524SHoward Hinnant { 1282*3e519524SHoward Hinnant if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern) 1283*3e519524SHoward Hinnant return __first; 1284*3e519524SHoward Hinnant if (++__m == __last) // Otherwise if source exhaused, pattern not found 1285*3e519524SHoward Hinnant return __last; 1286*3e519524SHoward Hinnant if (!__pred(*__m, __value)) // if there is a mismatch, restart with a new __first 1287*3e519524SHoward Hinnant { 1288*3e519524SHoward Hinnant __first = __m; 1289*3e519524SHoward Hinnant ++__first; 1290*3e519524SHoward Hinnant break; 1291*3e519524SHoward Hinnant } // else there is a match, check next elements 1292*3e519524SHoward Hinnant } 1293*3e519524SHoward Hinnant } 1294*3e519524SHoward Hinnant} 1295*3e519524SHoward Hinnant 1296*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _RandomAccessIterator, class _Size, class _Tp> 1297*3e519524SHoward Hinnant_RandomAccessIterator 1298*3e519524SHoward Hinnant__search_n(_RandomAccessIterator __first, _RandomAccessIterator __last, 1299*3e519524SHoward Hinnant _Size __count, const _Tp& __value, _BinaryPredicate __pred, random_access_iterator_tag) 1300*3e519524SHoward Hinnant{ 1301*3e519524SHoward Hinnant if (__count <= 0) 1302*3e519524SHoward Hinnant return __first; 1303*3e519524SHoward Hinnant _Size __len = static_cast<_Size>(__last - __first); 1304*3e519524SHoward Hinnant if (__len < __count) 1305*3e519524SHoward Hinnant return __last; 1306*3e519524SHoward Hinnant const _RandomAccessIterator __s = __last - (__count - 1); // Start of pattern match can't go beyond here 1307*3e519524SHoward Hinnant while (true) 1308*3e519524SHoward Hinnant { 1309*3e519524SHoward Hinnant // Find first element in sequence that matchs __value, with a mininum of loop checks 1310*3e519524SHoward Hinnant while (true) 1311*3e519524SHoward Hinnant { 1312*3e519524SHoward Hinnant if (__first == __s) // return __last if no element matches __value 1313*3e519524SHoward Hinnant return __last; 1314*3e519524SHoward Hinnant if (__pred(*__first, __value)) 1315*3e519524SHoward Hinnant break; 1316*3e519524SHoward Hinnant ++__first; 1317*3e519524SHoward Hinnant } 1318*3e519524SHoward Hinnant // *__first matches __value, now match elements after here 1319*3e519524SHoward Hinnant _RandomAccessIterator __m = __first; 1320*3e519524SHoward Hinnant _Size __c(0); 1321*3e519524SHoward Hinnant while (true) 1322*3e519524SHoward Hinnant { 1323*3e519524SHoward Hinnant if (++__c == __count) // If pattern exhausted, __first is the answer (works for 1 element pattern) 1324*3e519524SHoward Hinnant return __first; 1325*3e519524SHoward Hinnant ++__m; // no need to check range on __m because __s guarantees we have enough source 1326*3e519524SHoward Hinnant if (!__pred(*__m, __value)) // if there is a mismatch, restart with a new __first 1327*3e519524SHoward Hinnant { 1328*3e519524SHoward Hinnant __first = __m; 1329*3e519524SHoward Hinnant ++__first; 1330*3e519524SHoward Hinnant break; 1331*3e519524SHoward Hinnant } // else there is a match, check next elements 1332*3e519524SHoward Hinnant } 1333*3e519524SHoward Hinnant } 1334*3e519524SHoward Hinnant} 1335*3e519524SHoward Hinnant 1336*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp, class _BinaryPredicate> 1337*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1338*3e519524SHoward Hinnant_ForwardIterator 1339*3e519524SHoward Hinnantsearch_n(_ForwardIterator __first, _ForwardIterator __last, 1340*3e519524SHoward Hinnant _Size __count, const _Tp& __value, _BinaryPredicate __pred) 1341*3e519524SHoward Hinnant{ 1342*3e519524SHoward Hinnant return _STD::__search_n<typename add_lvalue_reference<_BinaryPredicate>::type> 1343*3e519524SHoward Hinnant (__first, __last, __count, __value, __pred, typename iterator_traits<_ForwardIterator>::iterator_category()); 1344*3e519524SHoward Hinnant} 1345*3e519524SHoward Hinnant 1346*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Size, class _Tp> 1347*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1348*3e519524SHoward Hinnant_ForwardIterator 1349*3e519524SHoward Hinnantsearch_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const _Tp& __value) 1350*3e519524SHoward Hinnant{ 1351*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type __v; 1352*3e519524SHoward Hinnant return _STD::search_n(__first, __last, __count, __value, __equal_to<__v, _Tp>()); 1353*3e519524SHoward Hinnant} 1354*3e519524SHoward Hinnant 1355*3e519524SHoward Hinnant// copy 1356*3e519524SHoward Hinnant 1357*3e519524SHoward Hinnanttemplate <class _Iter> 1358*3e519524SHoward Hinnantstruct __libcpp_is_trivial_iterator 1359*3e519524SHoward Hinnant{ 1360*3e519524SHoward Hinnant static const bool value = is_pointer<_Iter>::value; 1361*3e519524SHoward Hinnant}; 1362*3e519524SHoward Hinnant 1363*3e519524SHoward Hinnanttemplate <class _Iter> 1364*3e519524SHoward Hinnantstruct __libcpp_is_trivial_iterator<move_iterator<_Iter> > 1365*3e519524SHoward Hinnant{ 1366*3e519524SHoward Hinnant static const bool value = is_pointer<_Iter>::value; 1367*3e519524SHoward Hinnant}; 1368*3e519524SHoward Hinnant 1369*3e519524SHoward Hinnanttemplate <class _Iter> 1370*3e519524SHoward Hinnantstruct __libcpp_is_trivial_iterator<__wrap_iter<_Iter> > 1371*3e519524SHoward Hinnant{ 1372*3e519524SHoward Hinnant static const bool value = is_pointer<_Iter>::value; 1373*3e519524SHoward Hinnant}; 1374*3e519524SHoward Hinnant 1375*3e519524SHoward Hinnanttemplate <class _Iter> 1376*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1377*3e519524SHoward Hinnant_Iter 1378*3e519524SHoward Hinnant__unwrap_iter(_Iter __i) 1379*3e519524SHoward Hinnant{ 1380*3e519524SHoward Hinnant return __i; 1381*3e519524SHoward Hinnant} 1382*3e519524SHoward Hinnant 1383*3e519524SHoward Hinnanttemplate <class _Tp> 1384*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1385*3e519524SHoward Hinnanttypename enable_if 1386*3e519524SHoward Hinnant< 1387*3e519524SHoward Hinnant has_trivial_copy_assign<_Tp>::value, 1388*3e519524SHoward Hinnant _Tp* 1389*3e519524SHoward Hinnant>::type 1390*3e519524SHoward Hinnant__unwrap_iter(move_iterator<_Tp*> __i) 1391*3e519524SHoward Hinnant{ 1392*3e519524SHoward Hinnant return __i.base(); 1393*3e519524SHoward Hinnant} 1394*3e519524SHoward Hinnant 1395*3e519524SHoward Hinnanttemplate <class _Tp> 1396*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1397*3e519524SHoward Hinnanttypename enable_if 1398*3e519524SHoward Hinnant< 1399*3e519524SHoward Hinnant has_trivial_copy_assign<_Tp>::value, 1400*3e519524SHoward Hinnant _Tp* 1401*3e519524SHoward Hinnant>::type 1402*3e519524SHoward Hinnant__unwrap_iter(__wrap_iter<_Tp*> __i) 1403*3e519524SHoward Hinnant{ 1404*3e519524SHoward Hinnant return __i.base(); 1405*3e519524SHoward Hinnant} 1406*3e519524SHoward Hinnant 1407*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1408*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1409*3e519524SHoward Hinnant_OutputIterator 1410*3e519524SHoward Hinnant__copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1411*3e519524SHoward Hinnant{ 1412*3e519524SHoward Hinnant for (; __first != __last; ++__first, ++__result) 1413*3e519524SHoward Hinnant *__result = *__first; 1414*3e519524SHoward Hinnant return __result; 1415*3e519524SHoward Hinnant} 1416*3e519524SHoward Hinnant 1417*3e519524SHoward Hinnanttemplate <class _Tp, class _Up> 1418*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1419*3e519524SHoward Hinnanttypename enable_if 1420*3e519524SHoward Hinnant< 1421*3e519524SHoward Hinnant is_same<typename remove_const<_Tp>::type, _Up>::value && 1422*3e519524SHoward Hinnant has_trivial_copy_assign<_Up>::value, 1423*3e519524SHoward Hinnant _Up* 1424*3e519524SHoward Hinnant>::type 1425*3e519524SHoward Hinnant__copy(_Tp* __first, _Tp* __last, _Up* __result) 1426*3e519524SHoward Hinnant{ 1427*3e519524SHoward Hinnant const size_t __n = static_cast<size_t>(__last - __first); 1428*3e519524SHoward Hinnant _STD::memmove(__result, __first, __n * sizeof(_Up)); 1429*3e519524SHoward Hinnant return __result + __n; 1430*3e519524SHoward Hinnant} 1431*3e519524SHoward Hinnant 1432*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1433*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1434*3e519524SHoward Hinnant_OutputIterator 1435*3e519524SHoward Hinnantcopy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1436*3e519524SHoward Hinnant{ 1437*3e519524SHoward Hinnant return _STD::__copy(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); 1438*3e519524SHoward Hinnant} 1439*3e519524SHoward Hinnant 1440*3e519524SHoward Hinnant// copy_backward 1441*3e519524SHoward Hinnant 1442*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1443*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1444*3e519524SHoward Hinnant_OutputIterator 1445*3e519524SHoward Hinnant__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1446*3e519524SHoward Hinnant{ 1447*3e519524SHoward Hinnant while (__first != __last) 1448*3e519524SHoward Hinnant *--__result = *--__last; 1449*3e519524SHoward Hinnant return __result; 1450*3e519524SHoward Hinnant} 1451*3e519524SHoward Hinnant 1452*3e519524SHoward Hinnanttemplate <class _Tp, class _Up> 1453*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1454*3e519524SHoward Hinnanttypename enable_if 1455*3e519524SHoward Hinnant< 1456*3e519524SHoward Hinnant is_same<typename remove_const<_Tp>::type, _Up>::value && 1457*3e519524SHoward Hinnant has_trivial_copy_assign<_Up>::value, 1458*3e519524SHoward Hinnant _Up* 1459*3e519524SHoward Hinnant>::type 1460*3e519524SHoward Hinnant__copy_backward(_Tp* __first, _Tp* __last, _Up* __result) 1461*3e519524SHoward Hinnant{ 1462*3e519524SHoward Hinnant const size_t __n = static_cast<size_t>(__last - __first); 1463*3e519524SHoward Hinnant __result -= __n; 1464*3e519524SHoward Hinnant _STD::memmove(__result, __first, __n * sizeof(_Up)); 1465*3e519524SHoward Hinnant return __result; 1466*3e519524SHoward Hinnant} 1467*3e519524SHoward Hinnant 1468*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator1, class _BidirectionalIterator2> 1469*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1470*3e519524SHoward Hinnant_BidirectionalIterator2 1471*3e519524SHoward Hinnantcopy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, 1472*3e519524SHoward Hinnant _BidirectionalIterator2 __result) 1473*3e519524SHoward Hinnant{ 1474*3e519524SHoward Hinnant return _STD::__copy_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); 1475*3e519524SHoward Hinnant} 1476*3e519524SHoward Hinnant 1477*3e519524SHoward Hinnant// copy_if 1478*3e519524SHoward Hinnant 1479*3e519524SHoward Hinnanttemplate<class _InputIterator, class _OutputIterator, class _Predicate> 1480*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1481*3e519524SHoward Hinnant_OutputIterator 1482*3e519524SHoward Hinnantcopy_if(_InputIterator __first, _InputIterator __last, 1483*3e519524SHoward Hinnant _OutputIterator __result, _Predicate __pred) 1484*3e519524SHoward Hinnant{ 1485*3e519524SHoward Hinnant for (; __first != __last; ++__first) 1486*3e519524SHoward Hinnant { 1487*3e519524SHoward Hinnant if (__pred(*__first)) 1488*3e519524SHoward Hinnant { 1489*3e519524SHoward Hinnant *__result = *__first; 1490*3e519524SHoward Hinnant ++__result; 1491*3e519524SHoward Hinnant } 1492*3e519524SHoward Hinnant } 1493*3e519524SHoward Hinnant return __result; 1494*3e519524SHoward Hinnant} 1495*3e519524SHoward Hinnant 1496*3e519524SHoward Hinnant// copy_n 1497*3e519524SHoward Hinnant 1498*3e519524SHoward Hinnanttemplate<class _InputIterator, class _Size, class _OutputIterator> 1499*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1500*3e519524SHoward Hinnanttypename enable_if 1501*3e519524SHoward Hinnant< 1502*3e519524SHoward Hinnant __is_input_iterator<_InputIterator>::value && 1503*3e519524SHoward Hinnant !__is_random_access_iterator<_InputIterator>::value, 1504*3e519524SHoward Hinnant _OutputIterator 1505*3e519524SHoward Hinnant>::type 1506*3e519524SHoward Hinnantcopy_n(_InputIterator __first, _Size __n, _OutputIterator __result) 1507*3e519524SHoward Hinnant{ 1508*3e519524SHoward Hinnant for (; __n > 0; --__n, ++__first, ++__result) 1509*3e519524SHoward Hinnant *__result = *__first; 1510*3e519524SHoward Hinnant return __result; 1511*3e519524SHoward Hinnant} 1512*3e519524SHoward Hinnant 1513*3e519524SHoward Hinnanttemplate<class _InputIterator, class _Size, class _OutputIterator> 1514*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1515*3e519524SHoward Hinnanttypename enable_if 1516*3e519524SHoward Hinnant< 1517*3e519524SHoward Hinnant __is_random_access_iterator<_InputIterator>::value, 1518*3e519524SHoward Hinnant _OutputIterator 1519*3e519524SHoward Hinnant>::type 1520*3e519524SHoward Hinnantcopy_n(_InputIterator __first, _Size __n, _OutputIterator __result) 1521*3e519524SHoward Hinnant{ 1522*3e519524SHoward Hinnant return copy(__first, __first + __n, __result); 1523*3e519524SHoward Hinnant} 1524*3e519524SHoward Hinnant 1525*3e519524SHoward Hinnant// move 1526*3e519524SHoward Hinnant 1527*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1528*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1529*3e519524SHoward Hinnant_OutputIterator 1530*3e519524SHoward Hinnant__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1531*3e519524SHoward Hinnant{ 1532*3e519524SHoward Hinnant for (; __first != __last; ++__first, ++__result) 1533*3e519524SHoward Hinnant *__result = _STD::move(*__first); 1534*3e519524SHoward Hinnant return __result; 1535*3e519524SHoward Hinnant} 1536*3e519524SHoward Hinnant 1537*3e519524SHoward Hinnanttemplate <class _Tp, class _Up> 1538*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1539*3e519524SHoward Hinnanttypename enable_if 1540*3e519524SHoward Hinnant< 1541*3e519524SHoward Hinnant is_same<typename remove_const<_Tp>::type, _Up>::value && 1542*3e519524SHoward Hinnant has_trivial_copy_assign<_Up>::value, 1543*3e519524SHoward Hinnant _Up* 1544*3e519524SHoward Hinnant>::type 1545*3e519524SHoward Hinnant__move(_Tp* __first, _Tp* __last, _Up* __result) 1546*3e519524SHoward Hinnant{ 1547*3e519524SHoward Hinnant const size_t __n = static_cast<size_t>(__last - __first); 1548*3e519524SHoward Hinnant _STD::memmove(__result, __first, __n * sizeof(_Up)); 1549*3e519524SHoward Hinnant return __result + __n; 1550*3e519524SHoward Hinnant} 1551*3e519524SHoward Hinnant 1552*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1553*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1554*3e519524SHoward Hinnant_OutputIterator 1555*3e519524SHoward Hinnantmove(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1556*3e519524SHoward Hinnant{ 1557*3e519524SHoward Hinnant return _STD::__move(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); 1558*3e519524SHoward Hinnant} 1559*3e519524SHoward Hinnant 1560*3e519524SHoward Hinnant// move_backward 1561*3e519524SHoward Hinnant 1562*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1563*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1564*3e519524SHoward Hinnant_OutputIterator 1565*3e519524SHoward Hinnant__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1566*3e519524SHoward Hinnant{ 1567*3e519524SHoward Hinnant while (__first != __last) 1568*3e519524SHoward Hinnant *--__result = _STD::move(*--__last); 1569*3e519524SHoward Hinnant return __result; 1570*3e519524SHoward Hinnant} 1571*3e519524SHoward Hinnant 1572*3e519524SHoward Hinnanttemplate <class _Tp, class _Up> 1573*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1574*3e519524SHoward Hinnanttypename enable_if 1575*3e519524SHoward Hinnant< 1576*3e519524SHoward Hinnant is_same<typename remove_const<_Tp>::type, _Up>::value && 1577*3e519524SHoward Hinnant has_trivial_copy_assign<_Up>::value, 1578*3e519524SHoward Hinnant _Up* 1579*3e519524SHoward Hinnant>::type 1580*3e519524SHoward Hinnant__move_backward(_Tp* __first, _Tp* __last, _Up* __result) 1581*3e519524SHoward Hinnant{ 1582*3e519524SHoward Hinnant const size_t __n = static_cast<size_t>(__last - __first); 1583*3e519524SHoward Hinnant __result -= __n; 1584*3e519524SHoward Hinnant _STD::memmove(__result, __first, __n * sizeof(_Up)); 1585*3e519524SHoward Hinnant return __result; 1586*3e519524SHoward Hinnant} 1587*3e519524SHoward Hinnant 1588*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator1, class _BidirectionalIterator2> 1589*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1590*3e519524SHoward Hinnant_BidirectionalIterator2 1591*3e519524SHoward Hinnantmove_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, 1592*3e519524SHoward Hinnant _BidirectionalIterator2 __result) 1593*3e519524SHoward Hinnant{ 1594*3e519524SHoward Hinnant return _STD::__move_backward(__unwrap_iter(__first), __unwrap_iter(__last), __unwrap_iter(__result)); 1595*3e519524SHoward Hinnant} 1596*3e519524SHoward Hinnant 1597*3e519524SHoward Hinnant// iter_swap 1598*3e519524SHoward Hinnant 1599*3e519524SHoward Hinnanttemplate <class _ForwardIterator1, class _ForwardIterator2> 1600*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1601*3e519524SHoward Hinnantvoid 1602*3e519524SHoward Hinnantiter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b) 1603*3e519524SHoward Hinnant{ 1604*3e519524SHoward Hinnant swap(*__a, *__b); 1605*3e519524SHoward Hinnant} 1606*3e519524SHoward Hinnant 1607*3e519524SHoward Hinnant// transform 1608*3e519524SHoward Hinnant 1609*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _UnaryOperation> 1610*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1611*3e519524SHoward Hinnant_OutputIterator 1612*3e519524SHoward Hinnanttransform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op) 1613*3e519524SHoward Hinnant{ 1614*3e519524SHoward Hinnant for (; __first != __last; ++__first, ++__result) 1615*3e519524SHoward Hinnant *__result = __op(*__first); 1616*3e519524SHoward Hinnant return __result; 1617*3e519524SHoward Hinnant} 1618*3e519524SHoward Hinnant 1619*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _BinaryOperation> 1620*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1621*3e519524SHoward Hinnant_OutputIterator 1622*3e519524SHoward Hinnanttransform(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, 1623*3e519524SHoward Hinnant _OutputIterator __result, _BinaryOperation __binary_op) 1624*3e519524SHoward Hinnant{ 1625*3e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__first2, ++__result) 1626*3e519524SHoward Hinnant *__result = __binary_op(*__first1, *__first2); 1627*3e519524SHoward Hinnant return __result; 1628*3e519524SHoward Hinnant} 1629*3e519524SHoward Hinnant 1630*3e519524SHoward Hinnant// replace 1631*3e519524SHoward Hinnant 1632*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 1633*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1634*3e519524SHoward Hinnantvoid 1635*3e519524SHoward Hinnantreplace(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __old_value, const _Tp& __new_value) 1636*3e519524SHoward Hinnant{ 1637*3e519524SHoward Hinnant for (; __first != __last; ++__first) 1638*3e519524SHoward Hinnant if (*__first == __old_value) 1639*3e519524SHoward Hinnant *__first = __new_value; 1640*3e519524SHoward Hinnant} 1641*3e519524SHoward Hinnant 1642*3e519524SHoward Hinnant// replace_if 1643*3e519524SHoward Hinnant 1644*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate, class _Tp> 1645*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1646*3e519524SHoward Hinnantvoid 1647*3e519524SHoward Hinnantreplace_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, const _Tp& __new_value) 1648*3e519524SHoward Hinnant{ 1649*3e519524SHoward Hinnant for (; __first != __last; ++__first) 1650*3e519524SHoward Hinnant if (__pred(*__first)) 1651*3e519524SHoward Hinnant *__first = __new_value; 1652*3e519524SHoward Hinnant} 1653*3e519524SHoward Hinnant 1654*3e519524SHoward Hinnant// replace_copy 1655*3e519524SHoward Hinnant 1656*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Tp> 1657*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1658*3e519524SHoward Hinnant_OutputIterator 1659*3e519524SHoward Hinnantreplace_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1660*3e519524SHoward Hinnant const _Tp& __old_value, const _Tp& __new_value) 1661*3e519524SHoward Hinnant{ 1662*3e519524SHoward Hinnant for (; __first != __last; ++__first, ++__result) 1663*3e519524SHoward Hinnant if (*__first == __old_value) 1664*3e519524SHoward Hinnant *__result = __new_value; 1665*3e519524SHoward Hinnant else 1666*3e519524SHoward Hinnant *__result = *__first; 1667*3e519524SHoward Hinnant return __result; 1668*3e519524SHoward Hinnant} 1669*3e519524SHoward Hinnant 1670*3e519524SHoward Hinnant// replace_copy_if 1671*3e519524SHoward Hinnant 1672*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Predicate, class _Tp> 1673*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1674*3e519524SHoward Hinnant_OutputIterator 1675*3e519524SHoward Hinnantreplace_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, 1676*3e519524SHoward Hinnant _Predicate __pred, const _Tp& __new_value) 1677*3e519524SHoward Hinnant{ 1678*3e519524SHoward Hinnant for (; __first != __last; ++__first, ++__result) 1679*3e519524SHoward Hinnant if (__pred(*__first)) 1680*3e519524SHoward Hinnant *__result = __new_value; 1681*3e519524SHoward Hinnant else 1682*3e519524SHoward Hinnant *__result = *__first; 1683*3e519524SHoward Hinnant return __result; 1684*3e519524SHoward Hinnant} 1685*3e519524SHoward Hinnant 1686*3e519524SHoward Hinnant// fill_n 1687*3e519524SHoward Hinnant 1688*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Tp> 1689*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1690*3e519524SHoward Hinnant_OutputIterator 1691*3e519524SHoward Hinnant__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value, false_type) 1692*3e519524SHoward Hinnant{ 1693*3e519524SHoward Hinnant for (; __n > 0; ++__first, --__n) 1694*3e519524SHoward Hinnant *__first = __value; 1695*3e519524SHoward Hinnant return __first; 1696*3e519524SHoward Hinnant} 1697*3e519524SHoward Hinnant 1698*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Tp> 1699*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1700*3e519524SHoward Hinnant_OutputIterator 1701*3e519524SHoward Hinnant__fill_n(_OutputIterator __first, _Size __n, const _Tp& __value, true_type) 1702*3e519524SHoward Hinnant{ 1703*3e519524SHoward Hinnant if (__n > 0) 1704*3e519524SHoward Hinnant _STD::memset(__first, (unsigned char)__value, (size_t)(__n)); 1705*3e519524SHoward Hinnant return __first + __n; 1706*3e519524SHoward Hinnant} 1707*3e519524SHoward Hinnant 1708*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Tp> 1709*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1710*3e519524SHoward Hinnant_OutputIterator 1711*3e519524SHoward Hinnantfill_n(_OutputIterator __first, _Size __n, const _Tp& __value) 1712*3e519524SHoward Hinnant{ 1713*3e519524SHoward Hinnant return _STD::__fill_n(__first, __n, __value, integral_constant<bool, 1714*3e519524SHoward Hinnant is_pointer<_OutputIterator>::value && 1715*3e519524SHoward Hinnant has_trivial_copy_assign<_Tp>::value && 1716*3e519524SHoward Hinnant sizeof(_Tp) == 1>()); 1717*3e519524SHoward Hinnant} 1718*3e519524SHoward Hinnant 1719*3e519524SHoward Hinnant// fill 1720*3e519524SHoward Hinnant 1721*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 1722*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1723*3e519524SHoward Hinnantvoid 1724*3e519524SHoward Hinnant__fill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, forward_iterator_tag) 1725*3e519524SHoward Hinnant{ 1726*3e519524SHoward Hinnant for (; __first != __last; ++__first) 1727*3e519524SHoward Hinnant *__first = __value; 1728*3e519524SHoward Hinnant} 1729*3e519524SHoward Hinnant 1730*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Tp> 1731*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1732*3e519524SHoward Hinnantvoid 1733*3e519524SHoward Hinnant__fill(_RandomAccessIterator __first, _RandomAccessIterator __last, const _Tp& __value, random_access_iterator_tag) 1734*3e519524SHoward Hinnant{ 1735*3e519524SHoward Hinnant _STD::fill_n(__first, __last - __first, __value); 1736*3e519524SHoward Hinnant} 1737*3e519524SHoward Hinnant 1738*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 1739*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1740*3e519524SHoward Hinnantvoid 1741*3e519524SHoward Hinnantfill(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) 1742*3e519524SHoward Hinnant{ 1743*3e519524SHoward Hinnant _STD::__fill(__first, __last, __value, typename iterator_traits<_ForwardIterator>::iterator_category()); 1744*3e519524SHoward Hinnant} 1745*3e519524SHoward Hinnant 1746*3e519524SHoward Hinnant// generate 1747*3e519524SHoward Hinnant 1748*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Generator> 1749*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1750*3e519524SHoward Hinnantvoid 1751*3e519524SHoward Hinnantgenerate(_ForwardIterator __first, _ForwardIterator __last, _Generator __gen) 1752*3e519524SHoward Hinnant{ 1753*3e519524SHoward Hinnant for (; __first != __last; ++__first) 1754*3e519524SHoward Hinnant *__first = __gen(); 1755*3e519524SHoward Hinnant} 1756*3e519524SHoward Hinnant 1757*3e519524SHoward Hinnant// generate_n 1758*3e519524SHoward Hinnant 1759*3e519524SHoward Hinnanttemplate <class _OutputIterator, class _Size, class _Generator> 1760*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1761*3e519524SHoward Hinnant_OutputIterator 1762*3e519524SHoward Hinnantgenerate_n(_OutputIterator __first, _Size __n, _Generator __gen) 1763*3e519524SHoward Hinnant{ 1764*3e519524SHoward Hinnant for (; __n > 0; ++__first, --__n) 1765*3e519524SHoward Hinnant *__first = __gen(); 1766*3e519524SHoward Hinnant return __first; 1767*3e519524SHoward Hinnant} 1768*3e519524SHoward Hinnant 1769*3e519524SHoward Hinnant// remove 1770*3e519524SHoward Hinnant 1771*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 1772*3e519524SHoward Hinnant_ForwardIterator 1773*3e519524SHoward Hinnantremove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) 1774*3e519524SHoward Hinnant{ 1775*3e519524SHoward Hinnant __first = _STD::find(__first, __last, __value); 1776*3e519524SHoward Hinnant if (__first != __last) 1777*3e519524SHoward Hinnant { 1778*3e519524SHoward Hinnant _ForwardIterator __i = __first; 1779*3e519524SHoward Hinnant while (++__i != __last) 1780*3e519524SHoward Hinnant { 1781*3e519524SHoward Hinnant if (!(*__i == __value)) 1782*3e519524SHoward Hinnant { 1783*3e519524SHoward Hinnant *__first = _STD::move(*__i); 1784*3e519524SHoward Hinnant ++__first; 1785*3e519524SHoward Hinnant } 1786*3e519524SHoward Hinnant } 1787*3e519524SHoward Hinnant } 1788*3e519524SHoward Hinnant return __first; 1789*3e519524SHoward Hinnant} 1790*3e519524SHoward Hinnant 1791*3e519524SHoward Hinnant// remove_if 1792*3e519524SHoward Hinnant 1793*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate> 1794*3e519524SHoward Hinnant_ForwardIterator 1795*3e519524SHoward Hinnantremove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) 1796*3e519524SHoward Hinnant{ 1797*3e519524SHoward Hinnant __first = _STD::find_if<_ForwardIterator, typename add_lvalue_reference<_Predicate>::type> 1798*3e519524SHoward Hinnant (__first, __last, __pred); 1799*3e519524SHoward Hinnant if (__first != __last) 1800*3e519524SHoward Hinnant { 1801*3e519524SHoward Hinnant _ForwardIterator __i = __first; 1802*3e519524SHoward Hinnant while (++__i != __last) 1803*3e519524SHoward Hinnant { 1804*3e519524SHoward Hinnant if (!__pred(*__i)) 1805*3e519524SHoward Hinnant { 1806*3e519524SHoward Hinnant *__first = _STD::move(*__i); 1807*3e519524SHoward Hinnant ++__first; 1808*3e519524SHoward Hinnant } 1809*3e519524SHoward Hinnant } 1810*3e519524SHoward Hinnant } 1811*3e519524SHoward Hinnant return __first; 1812*3e519524SHoward Hinnant} 1813*3e519524SHoward Hinnant 1814*3e519524SHoward Hinnant// remove_copy 1815*3e519524SHoward Hinnant 1816*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Tp> 1817*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1818*3e519524SHoward Hinnant_OutputIterator 1819*3e519524SHoward Hinnantremove_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, const _Tp& __value) 1820*3e519524SHoward Hinnant{ 1821*3e519524SHoward Hinnant for (; __first != __last; ++__first) 1822*3e519524SHoward Hinnant { 1823*3e519524SHoward Hinnant if (!(*__first == __value)) 1824*3e519524SHoward Hinnant { 1825*3e519524SHoward Hinnant *__result = *__first; 1826*3e519524SHoward Hinnant ++__result; 1827*3e519524SHoward Hinnant } 1828*3e519524SHoward Hinnant } 1829*3e519524SHoward Hinnant return __result; 1830*3e519524SHoward Hinnant} 1831*3e519524SHoward Hinnant 1832*3e519524SHoward Hinnant// remove_copy_if 1833*3e519524SHoward Hinnant 1834*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _Predicate> 1835*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1836*3e519524SHoward Hinnant_OutputIterator 1837*3e519524SHoward Hinnantremove_copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred) 1838*3e519524SHoward Hinnant{ 1839*3e519524SHoward Hinnant for (; __first != __last; ++__first) 1840*3e519524SHoward Hinnant { 1841*3e519524SHoward Hinnant if (!__pred(*__first)) 1842*3e519524SHoward Hinnant { 1843*3e519524SHoward Hinnant *__result = *__first; 1844*3e519524SHoward Hinnant ++__result; 1845*3e519524SHoward Hinnant } 1846*3e519524SHoward Hinnant } 1847*3e519524SHoward Hinnant return __result; 1848*3e519524SHoward Hinnant} 1849*3e519524SHoward Hinnant 1850*3e519524SHoward Hinnant// unique 1851*3e519524SHoward Hinnant 1852*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _BinaryPredicate> 1853*3e519524SHoward Hinnant_ForwardIterator 1854*3e519524SHoward Hinnantunique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) 1855*3e519524SHoward Hinnant{ 1856*3e519524SHoward Hinnant __first = _STD::adjacent_find<_ForwardIterator, typename add_lvalue_reference<_BinaryPredicate>::type> 1857*3e519524SHoward Hinnant (__first, __last, __pred); 1858*3e519524SHoward Hinnant if (__first != __last) 1859*3e519524SHoward Hinnant { 1860*3e519524SHoward Hinnant // ... a a ? ... 1861*3e519524SHoward Hinnant // f i 1862*3e519524SHoward Hinnant _ForwardIterator __i = __first; 1863*3e519524SHoward Hinnant for (++__i; ++__i != __last;) 1864*3e519524SHoward Hinnant if (!__pred(*__first, *__i)) 1865*3e519524SHoward Hinnant *++__first = _STD::move(*__i); 1866*3e519524SHoward Hinnant ++__first; 1867*3e519524SHoward Hinnant } 1868*3e519524SHoward Hinnant return __first; 1869*3e519524SHoward Hinnant} 1870*3e519524SHoward Hinnant 1871*3e519524SHoward Hinnanttemplate <class _ForwardIterator> 1872*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1873*3e519524SHoward Hinnant_ForwardIterator 1874*3e519524SHoward Hinnantunique(_ForwardIterator __first, _ForwardIterator __last) 1875*3e519524SHoward Hinnant{ 1876*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type __v; 1877*3e519524SHoward Hinnant return _STD::unique(__first, __last, __equal_to<__v>()); 1878*3e519524SHoward Hinnant} 1879*3e519524SHoward Hinnant 1880*3e519524SHoward Hinnant// unique_copy 1881*3e519524SHoward Hinnant 1882*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _InputIterator, class _OutputIterator> 1883*3e519524SHoward Hinnant_OutputIterator 1884*3e519524SHoward Hinnant__unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred, 1885*3e519524SHoward Hinnant input_iterator_tag, output_iterator_tag) 1886*3e519524SHoward Hinnant{ 1887*3e519524SHoward Hinnant if (__first != __last) 1888*3e519524SHoward Hinnant { 1889*3e519524SHoward Hinnant typename iterator_traits<_InputIterator>::value_type __t(*__first); 1890*3e519524SHoward Hinnant *__result = __t; 1891*3e519524SHoward Hinnant ++__result; 1892*3e519524SHoward Hinnant while (++__first != __last) 1893*3e519524SHoward Hinnant { 1894*3e519524SHoward Hinnant if (!__pred(__t, *__first)) 1895*3e519524SHoward Hinnant { 1896*3e519524SHoward Hinnant __t = *__first; 1897*3e519524SHoward Hinnant *__result = __t; 1898*3e519524SHoward Hinnant ++__result; 1899*3e519524SHoward Hinnant } 1900*3e519524SHoward Hinnant } 1901*3e519524SHoward Hinnant } 1902*3e519524SHoward Hinnant return __result; 1903*3e519524SHoward Hinnant} 1904*3e519524SHoward Hinnant 1905*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _ForwardIterator, class _OutputIterator> 1906*3e519524SHoward Hinnant_OutputIterator 1907*3e519524SHoward Hinnant__unique_copy(_ForwardIterator __first, _ForwardIterator __last, _OutputIterator __result, _BinaryPredicate __pred, 1908*3e519524SHoward Hinnant forward_iterator_tag, output_iterator_tag) 1909*3e519524SHoward Hinnant{ 1910*3e519524SHoward Hinnant if (__first != __last) 1911*3e519524SHoward Hinnant { 1912*3e519524SHoward Hinnant _ForwardIterator __i = __first; 1913*3e519524SHoward Hinnant *__result = *__i; 1914*3e519524SHoward Hinnant ++__result; 1915*3e519524SHoward Hinnant while (++__first != __last) 1916*3e519524SHoward Hinnant { 1917*3e519524SHoward Hinnant if (!__pred(*__i, *__first)) 1918*3e519524SHoward Hinnant { 1919*3e519524SHoward Hinnant *__result = *__first; 1920*3e519524SHoward Hinnant ++__result; 1921*3e519524SHoward Hinnant __i = __first; 1922*3e519524SHoward Hinnant } 1923*3e519524SHoward Hinnant } 1924*3e519524SHoward Hinnant } 1925*3e519524SHoward Hinnant return __result; 1926*3e519524SHoward Hinnant} 1927*3e519524SHoward Hinnant 1928*3e519524SHoward Hinnanttemplate <class _BinaryPredicate, class _InputIterator, class _ForwardIterator> 1929*3e519524SHoward Hinnant_ForwardIterator 1930*3e519524SHoward Hinnant__unique_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result, _BinaryPredicate __pred, 1931*3e519524SHoward Hinnant input_iterator_tag, forward_iterator_tag) 1932*3e519524SHoward Hinnant{ 1933*3e519524SHoward Hinnant if (__first != __last) 1934*3e519524SHoward Hinnant { 1935*3e519524SHoward Hinnant *__result = *__first; 1936*3e519524SHoward Hinnant while (++__first != __last) 1937*3e519524SHoward Hinnant if (!__pred(*__result, *__first)) 1938*3e519524SHoward Hinnant *++__result = *__first; 1939*3e519524SHoward Hinnant ++__result; 1940*3e519524SHoward Hinnant } 1941*3e519524SHoward Hinnant return __result; 1942*3e519524SHoward Hinnant} 1943*3e519524SHoward Hinnant 1944*3e519524SHoward Hinnant 1945*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator, class _BinaryPredicate> 1946*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1947*3e519524SHoward Hinnant_OutputIterator 1948*3e519524SHoward Hinnantunique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _BinaryPredicate __pred) 1949*3e519524SHoward Hinnant{ 1950*3e519524SHoward Hinnant return _STD::__unique_copy<typename add_lvalue_reference<_BinaryPredicate>::type> 1951*3e519524SHoward Hinnant (__first, __last, __result, __pred, 1952*3e519524SHoward Hinnant typename iterator_traits<_InputIterator>::iterator_category(), 1953*3e519524SHoward Hinnant typename iterator_traits<_OutputIterator>::iterator_category()); 1954*3e519524SHoward Hinnant} 1955*3e519524SHoward Hinnant 1956*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator> 1957*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1958*3e519524SHoward Hinnant_OutputIterator 1959*3e519524SHoward Hinnantunique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) 1960*3e519524SHoward Hinnant{ 1961*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator>::value_type __v; 1962*3e519524SHoward Hinnant return _STD::unique_copy(__first, __last, __result, __equal_to<__v>()); 1963*3e519524SHoward Hinnant} 1964*3e519524SHoward Hinnant 1965*3e519524SHoward Hinnant// reverse 1966*3e519524SHoward Hinnant 1967*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator> 1968*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1969*3e519524SHoward Hinnantvoid 1970*3e519524SHoward Hinnant__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag) 1971*3e519524SHoward Hinnant{ 1972*3e519524SHoward Hinnant while (__first != __last) 1973*3e519524SHoward Hinnant { 1974*3e519524SHoward Hinnant if (__first == --__last) 1975*3e519524SHoward Hinnant break; 1976*3e519524SHoward Hinnant swap(*__first, *__last); 1977*3e519524SHoward Hinnant ++__first; 1978*3e519524SHoward Hinnant } 1979*3e519524SHoward Hinnant} 1980*3e519524SHoward Hinnant 1981*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 1982*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1983*3e519524SHoward Hinnantvoid 1984*3e519524SHoward Hinnant__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag) 1985*3e519524SHoward Hinnant{ 1986*3e519524SHoward Hinnant if (__first != __last) 1987*3e519524SHoward Hinnant for (; __first < --__last; ++__first) 1988*3e519524SHoward Hinnant swap(*__first, *__last); 1989*3e519524SHoward Hinnant} 1990*3e519524SHoward Hinnant 1991*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator> 1992*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 1993*3e519524SHoward Hinnantvoid 1994*3e519524SHoward Hinnantreverse(_BidirectionalIterator __first, _BidirectionalIterator __last) 1995*3e519524SHoward Hinnant{ 1996*3e519524SHoward Hinnant _STD::__reverse(__first, __last, typename iterator_traits<_BidirectionalIterator>::iterator_category()); 1997*3e519524SHoward Hinnant} 1998*3e519524SHoward Hinnant 1999*3e519524SHoward Hinnant// reverse_copy 2000*3e519524SHoward Hinnant 2001*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _OutputIterator> 2002*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2003*3e519524SHoward Hinnant_OutputIterator 2004*3e519524SHoward Hinnantreverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _OutputIterator __result) 2005*3e519524SHoward Hinnant{ 2006*3e519524SHoward Hinnant for (; __first != __last; ++__result) 2007*3e519524SHoward Hinnant *__result = *--__last; 2008*3e519524SHoward Hinnant return __result; 2009*3e519524SHoward Hinnant} 2010*3e519524SHoward Hinnant 2011*3e519524SHoward Hinnant// rotate 2012*3e519524SHoward Hinnant 2013*3e519524SHoward Hinnanttemplate <class _ForwardIterator> 2014*3e519524SHoward Hinnant_ForwardIterator 2015*3e519524SHoward Hinnant__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, false_type) 2016*3e519524SHoward Hinnant{ 2017*3e519524SHoward Hinnant if (__first == __middle) 2018*3e519524SHoward Hinnant return __last; 2019*3e519524SHoward Hinnant if (__middle == __last) 2020*3e519524SHoward Hinnant return __first; 2021*3e519524SHoward Hinnant _ForwardIterator __i = __middle; 2022*3e519524SHoward Hinnant while (true) 2023*3e519524SHoward Hinnant { 2024*3e519524SHoward Hinnant swap(*__first, *__i); 2025*3e519524SHoward Hinnant ++__first; 2026*3e519524SHoward Hinnant if (++__i == __last) 2027*3e519524SHoward Hinnant break; 2028*3e519524SHoward Hinnant if (__first == __middle) 2029*3e519524SHoward Hinnant __middle = __i; 2030*3e519524SHoward Hinnant } 2031*3e519524SHoward Hinnant _ForwardIterator __r = __first; 2032*3e519524SHoward Hinnant if (__first != __middle) 2033*3e519524SHoward Hinnant { 2034*3e519524SHoward Hinnant __i = __middle; 2035*3e519524SHoward Hinnant while (true) 2036*3e519524SHoward Hinnant { 2037*3e519524SHoward Hinnant swap(*__first, *__i); 2038*3e519524SHoward Hinnant ++__first; 2039*3e519524SHoward Hinnant if (++__i == __last) 2040*3e519524SHoward Hinnant { 2041*3e519524SHoward Hinnant if (__first == __middle) 2042*3e519524SHoward Hinnant break; 2043*3e519524SHoward Hinnant __i = __middle; 2044*3e519524SHoward Hinnant } 2045*3e519524SHoward Hinnant else if (__first == __middle) 2046*3e519524SHoward Hinnant __middle = __i; 2047*3e519524SHoward Hinnant } 2048*3e519524SHoward Hinnant } 2049*3e519524SHoward Hinnant return __r; 2050*3e519524SHoward Hinnant} 2051*3e519524SHoward Hinnant 2052*3e519524SHoward Hinnanttemplate<typename _Integral> 2053*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2054*3e519524SHoward Hinnant_Integral 2055*3e519524SHoward Hinnant__gcd(_Integral __x, _Integral __y) 2056*3e519524SHoward Hinnant{ 2057*3e519524SHoward Hinnant do 2058*3e519524SHoward Hinnant { 2059*3e519524SHoward Hinnant _Integral __t = __x % __y; 2060*3e519524SHoward Hinnant __x = __y; 2061*3e519524SHoward Hinnant __y = __t; 2062*3e519524SHoward Hinnant } while (__y); 2063*3e519524SHoward Hinnant return __x; 2064*3e519524SHoward Hinnant} 2065*3e519524SHoward Hinnant 2066*3e519524SHoward Hinnanttemplate<typename _RandomAccessIterator> 2067*3e519524SHoward Hinnant_RandomAccessIterator 2068*3e519524SHoward Hinnant__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, true_type) 2069*3e519524SHoward Hinnant{ 2070*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 2071*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 2072*3e519524SHoward Hinnant 2073*3e519524SHoward Hinnant if (__first == __middle) 2074*3e519524SHoward Hinnant return __last; 2075*3e519524SHoward Hinnant if (__middle == __last) 2076*3e519524SHoward Hinnant return __first; 2077*3e519524SHoward Hinnant const difference_type __m1 = __middle - __first; 2078*3e519524SHoward Hinnant const difference_type __m2 = __last - __middle; 2079*3e519524SHoward Hinnant if (__m1 == __m2) 2080*3e519524SHoward Hinnant { 2081*3e519524SHoward Hinnant _STD::swap_ranges(__first, __middle, __middle); 2082*3e519524SHoward Hinnant return __middle; 2083*3e519524SHoward Hinnant } 2084*3e519524SHoward Hinnant const difference_type __g = __gcd(__m1, __m2); 2085*3e519524SHoward Hinnant for (_RandomAccessIterator __p = __first + __g; __p != __first;) 2086*3e519524SHoward Hinnant { 2087*3e519524SHoward Hinnant value_type __t(*--__p); 2088*3e519524SHoward Hinnant _RandomAccessIterator __p1 = __p; 2089*3e519524SHoward Hinnant _RandomAccessIterator __p2 = __p1 + __m1; 2090*3e519524SHoward Hinnant do 2091*3e519524SHoward Hinnant { 2092*3e519524SHoward Hinnant *__p1 = *__p2; 2093*3e519524SHoward Hinnant __p1 = __p2; 2094*3e519524SHoward Hinnant const difference_type __d = __last - __p2; 2095*3e519524SHoward Hinnant if (__m1 < __d) 2096*3e519524SHoward Hinnant __p2 += __m1; 2097*3e519524SHoward Hinnant else 2098*3e519524SHoward Hinnant __p2 = __first + (__m1 - __d); 2099*3e519524SHoward Hinnant } while (__p2 != __p); 2100*3e519524SHoward Hinnant *__p1 = __t; 2101*3e519524SHoward Hinnant } 2102*3e519524SHoward Hinnant return __first + __m2; 2103*3e519524SHoward Hinnant} 2104*3e519524SHoward Hinnant 2105*3e519524SHoward Hinnanttemplate <class _ForwardIterator> 2106*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2107*3e519524SHoward Hinnant_ForwardIterator 2108*3e519524SHoward Hinnantrotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last) 2109*3e519524SHoward Hinnant{ 2110*3e519524SHoward Hinnant return _STD::__rotate(__first, __middle, __last, 2111*3e519524SHoward Hinnant integral_constant 2112*3e519524SHoward Hinnant < 2113*3e519524SHoward Hinnant bool, 2114*3e519524SHoward Hinnant is_convertible 2115*3e519524SHoward Hinnant < 2116*3e519524SHoward Hinnant typename iterator_traits<_ForwardIterator>::iterator_category, 2117*3e519524SHoward Hinnant random_access_iterator_tag 2118*3e519524SHoward Hinnant >::value && 2119*3e519524SHoward Hinnant has_trivial_copy_assign 2120*3e519524SHoward Hinnant < 2121*3e519524SHoward Hinnant typename iterator_traits<_ForwardIterator>::value_type 2122*3e519524SHoward Hinnant >::value 2123*3e519524SHoward Hinnant >()); 2124*3e519524SHoward Hinnant} 2125*3e519524SHoward Hinnant 2126*3e519524SHoward Hinnant// rotate_copy 2127*3e519524SHoward Hinnant 2128*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _OutputIterator> 2129*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2130*3e519524SHoward Hinnant_OutputIterator 2131*3e519524SHoward Hinnantrotate_copy(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last, _OutputIterator __result) 2132*3e519524SHoward Hinnant{ 2133*3e519524SHoward Hinnant return _STD::copy(__first, __middle, _STD::copy(__middle, __last, __result)); 2134*3e519524SHoward Hinnant} 2135*3e519524SHoward Hinnant 2136*3e519524SHoward Hinnant// min 2137*3e519524SHoward Hinnant 2138*3e519524SHoward Hinnanttemplate <class _Tp, class _Compare> 2139*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2140*3e519524SHoward Hinnantconst _Tp& 2141*3e519524SHoward Hinnantmin(const _Tp& __a, const _Tp& __b, _Compare __comp) 2142*3e519524SHoward Hinnant{ 2143*3e519524SHoward Hinnant return __comp(__b, __a) ? __b : __a; 2144*3e519524SHoward Hinnant} 2145*3e519524SHoward Hinnant 2146*3e519524SHoward Hinnanttemplate <class _Tp> 2147*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2148*3e519524SHoward Hinnantconst _Tp& 2149*3e519524SHoward Hinnantmin(const _Tp& __a, const _Tp& __b) 2150*3e519524SHoward Hinnant{ 2151*3e519524SHoward Hinnant return _STD::min(__a, __b, __less<_Tp>()); 2152*3e519524SHoward Hinnant} 2153*3e519524SHoward Hinnant 2154*3e519524SHoward Hinnant// max 2155*3e519524SHoward Hinnant 2156*3e519524SHoward Hinnanttemplate <class _Tp, class _Compare> 2157*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2158*3e519524SHoward Hinnantconst _Tp& 2159*3e519524SHoward Hinnantmax(const _Tp& __a, const _Tp& __b, _Compare __comp) 2160*3e519524SHoward Hinnant{ 2161*3e519524SHoward Hinnant return __comp(__a, __b) ? __b : __a; 2162*3e519524SHoward Hinnant} 2163*3e519524SHoward Hinnant 2164*3e519524SHoward Hinnanttemplate <class _Tp> 2165*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2166*3e519524SHoward Hinnantconst _Tp& 2167*3e519524SHoward Hinnantmax(const _Tp& __a, const _Tp& __b) 2168*3e519524SHoward Hinnant{ 2169*3e519524SHoward Hinnant return _STD::max(__a, __b, __less<_Tp>()); 2170*3e519524SHoward Hinnant} 2171*3e519524SHoward Hinnant 2172*3e519524SHoward Hinnant// min_element 2173*3e519524SHoward Hinnant 2174*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare> 2175*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2176*3e519524SHoward Hinnant_ForwardIterator 2177*3e519524SHoward Hinnantmin_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) 2178*3e519524SHoward Hinnant{ 2179*3e519524SHoward Hinnant if (__first != __last) 2180*3e519524SHoward Hinnant { 2181*3e519524SHoward Hinnant _ForwardIterator __i = __first; 2182*3e519524SHoward Hinnant while (++__i != __last) 2183*3e519524SHoward Hinnant if (__comp(*__i, *__first)) 2184*3e519524SHoward Hinnant __first = __i; 2185*3e519524SHoward Hinnant } 2186*3e519524SHoward Hinnant return __first; 2187*3e519524SHoward Hinnant} 2188*3e519524SHoward Hinnant 2189*3e519524SHoward Hinnanttemplate <class _ForwardIterator> 2190*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2191*3e519524SHoward Hinnant_ForwardIterator 2192*3e519524SHoward Hinnantmin_element(_ForwardIterator __first, _ForwardIterator __last) 2193*3e519524SHoward Hinnant{ 2194*3e519524SHoward Hinnant return _STD::min_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); 2195*3e519524SHoward Hinnant} 2196*3e519524SHoward Hinnant 2197*3e519524SHoward Hinnant// max_element 2198*3e519524SHoward Hinnant 2199*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare> 2200*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2201*3e519524SHoward Hinnant_ForwardIterator 2202*3e519524SHoward Hinnantmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) 2203*3e519524SHoward Hinnant{ 2204*3e519524SHoward Hinnant if (__first != __last) 2205*3e519524SHoward Hinnant { 2206*3e519524SHoward Hinnant _ForwardIterator __i = __first; 2207*3e519524SHoward Hinnant while (++__i != __last) 2208*3e519524SHoward Hinnant if (__comp(*__first, *__i)) 2209*3e519524SHoward Hinnant __first = __i; 2210*3e519524SHoward Hinnant } 2211*3e519524SHoward Hinnant return __first; 2212*3e519524SHoward Hinnant} 2213*3e519524SHoward Hinnant 2214*3e519524SHoward Hinnanttemplate <class _ForwardIterator> 2215*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2216*3e519524SHoward Hinnant_ForwardIterator 2217*3e519524SHoward Hinnantmax_element(_ForwardIterator __first, _ForwardIterator __last) 2218*3e519524SHoward Hinnant{ 2219*3e519524SHoward Hinnant return _STD::max_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); 2220*3e519524SHoward Hinnant} 2221*3e519524SHoward Hinnant 2222*3e519524SHoward Hinnant// minmax_element 2223*3e519524SHoward Hinnant 2224*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare> 2225*3e519524SHoward Hinnantstd::pair<_ForwardIterator, _ForwardIterator> 2226*3e519524SHoward Hinnantminmax_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) 2227*3e519524SHoward Hinnant{ 2228*3e519524SHoward Hinnant std::pair<_ForwardIterator, _ForwardIterator> __result(__first, __first); 2229*3e519524SHoward Hinnant if (__first != __last) 2230*3e519524SHoward Hinnant { 2231*3e519524SHoward Hinnant if (++__first != __last) 2232*3e519524SHoward Hinnant { 2233*3e519524SHoward Hinnant if (__comp(*__first, *__result.first)) 2234*3e519524SHoward Hinnant { 2235*3e519524SHoward Hinnant __result.second = __result.first; 2236*3e519524SHoward Hinnant __result.first = __first; 2237*3e519524SHoward Hinnant } 2238*3e519524SHoward Hinnant else 2239*3e519524SHoward Hinnant __result.second = __first; 2240*3e519524SHoward Hinnant while (++__first != __last) 2241*3e519524SHoward Hinnant { 2242*3e519524SHoward Hinnant _ForwardIterator __i = __first; 2243*3e519524SHoward Hinnant if (++__first == __last) 2244*3e519524SHoward Hinnant { 2245*3e519524SHoward Hinnant if (__comp(*__i, *__result.first)) 2246*3e519524SHoward Hinnant __result.first = __i; 2247*3e519524SHoward Hinnant else if (!__comp(*__i, *__result.second)) 2248*3e519524SHoward Hinnant __result.second = __i; 2249*3e519524SHoward Hinnant break; 2250*3e519524SHoward Hinnant } 2251*3e519524SHoward Hinnant else 2252*3e519524SHoward Hinnant { 2253*3e519524SHoward Hinnant if (__comp(*__first, *__i)) 2254*3e519524SHoward Hinnant { 2255*3e519524SHoward Hinnant if (__comp(*__first, *__result.first)) 2256*3e519524SHoward Hinnant __result.first = __first; 2257*3e519524SHoward Hinnant if (!__comp(*__i, *__result.second)) 2258*3e519524SHoward Hinnant __result.second = __i; 2259*3e519524SHoward Hinnant } 2260*3e519524SHoward Hinnant else 2261*3e519524SHoward Hinnant { 2262*3e519524SHoward Hinnant if (__comp(*__i, *__result.first)) 2263*3e519524SHoward Hinnant __result.first = __i; 2264*3e519524SHoward Hinnant if (!__comp(*__first, *__result.second)) 2265*3e519524SHoward Hinnant __result.second = __first; 2266*3e519524SHoward Hinnant } 2267*3e519524SHoward Hinnant } 2268*3e519524SHoward Hinnant } 2269*3e519524SHoward Hinnant } 2270*3e519524SHoward Hinnant } 2271*3e519524SHoward Hinnant return __result; 2272*3e519524SHoward Hinnant} 2273*3e519524SHoward Hinnant 2274*3e519524SHoward Hinnanttemplate <class _ForwardIterator> 2275*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2276*3e519524SHoward Hinnantstd::pair<_ForwardIterator, _ForwardIterator> 2277*3e519524SHoward Hinnantminmax_element(_ForwardIterator __first, _ForwardIterator __last) 2278*3e519524SHoward Hinnant{ 2279*3e519524SHoward Hinnant return _STD::minmax_element(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); 2280*3e519524SHoward Hinnant} 2281*3e519524SHoward Hinnant 2282*3e519524SHoward Hinnant// random_shuffle 2283*3e519524SHoward Hinnant 2284*3e519524SHoward Hinnanttemplate <unsigned int _Bits> 2285*3e519524SHoward Hinnantstruct __num_bits 2286*3e519524SHoward Hinnant{ 2287*3e519524SHoward Hinnant static const int __value = 1 + __num_bits<(_Bits >> 1)>::__value; 2288*3e519524SHoward Hinnant}; 2289*3e519524SHoward Hinnant 2290*3e519524SHoward Hinnanttemplate <> 2291*3e519524SHoward Hinnantstruct __num_bits<0> 2292*3e519524SHoward Hinnant{ 2293*3e519524SHoward Hinnant static const int __value = 0; 2294*3e519524SHoward Hinnant}; 2295*3e519524SHoward Hinnant 2296*3e519524SHoward Hinnantconst int __rbits = __num_bits<RAND_MAX>::__value; 2297*3e519524SHoward Hinnantconst int __lbits = static_cast<int>(sizeof(unsigned long) * __CHAR_BIT__); 2298*3e519524SHoward Hinnant 2299*3e519524SHoward Hinnanttemplate <int _NBits, bool = _NBits <= __rbits> 2300*3e519524SHoward Hinnantstruct __random_bits 2301*3e519524SHoward Hinnant{ 2302*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator unsigned long () const 2303*3e519524SHoward Hinnant {return static_cast<unsigned long>(_STD::rand()) >> (__rbits - _NBits);} 2304*3e519524SHoward Hinnant}; 2305*3e519524SHoward Hinnant 2306*3e519524SHoward Hinnanttemplate <int _NBits> 2307*3e519524SHoward Hinnantstruct __random_bits<_NBits, false> 2308*3e519524SHoward Hinnant{ 2309*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY operator unsigned long () const 2310*3e519524SHoward Hinnant {return static_cast<unsigned long>(_STD::rand()) << (_NBits - __rbits) | __random_bits<_NBits - __rbits>();} 2311*3e519524SHoward Hinnant}; 2312*3e519524SHoward Hinnant 2313*3e519524SHoward Hinnanttemplate <int _NBits> 2314*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2315*3e519524SHoward Hinnantunsigned long 2316*3e519524SHoward Hinnant__slab_size(unsigned long __n) 2317*3e519524SHoward Hinnant{ 2318*3e519524SHoward Hinnant return (1UL << _NBits) / __n; 2319*3e519524SHoward Hinnant} 2320*3e519524SHoward Hinnant 2321*3e519524SHoward Hinnanttemplate <> 2322*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2323*3e519524SHoward Hinnantunsigned long 2324*3e519524SHoward Hinnant__slab_size<__lbits>(unsigned long __n) 2325*3e519524SHoward Hinnant{ 2326*3e519524SHoward Hinnant if (__n & 1) 2327*3e519524SHoward Hinnant return (unsigned long)(~0) / __n; 2328*3e519524SHoward Hinnant return (1UL << (__lbits-1)) / (__n >> 1); 2329*3e519524SHoward Hinnant} 2330*3e519524SHoward Hinnant 2331*3e519524SHoward Hinnanttemplate <int _NBits> 2332*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2333*3e519524SHoward Hinnantunsigned long 2334*3e519524SHoward Hinnant__scaled_random_number(unsigned long __n) 2335*3e519524SHoward Hinnant{ 2336*3e519524SHoward Hinnant const unsigned long __slab = __slab_size<_NBits>(__n); 2337*3e519524SHoward Hinnant const unsigned long __usable = __slab * __n; 2338*3e519524SHoward Hinnant unsigned long __raw; 2339*3e519524SHoward Hinnant do 2340*3e519524SHoward Hinnant __raw = __random_bits<_NBits>(); 2341*3e519524SHoward Hinnant while (__raw >= __usable); 2342*3e519524SHoward Hinnant return __raw / __slab; 2343*3e519524SHoward Hinnant} 2344*3e519524SHoward Hinnant 2345*3e519524SHoward Hinnanttemplate <bool __b, unsigned long = __lbits/__rbits> struct __rs_default; 2346*3e519524SHoward Hinnant 2347*3e519524SHoward Hinnanttemplate <bool __b> 2348*3e519524SHoward Hinnantstruct __rs_default<__b, 1> 2349*3e519524SHoward Hinnant{ 2350*3e519524SHoward Hinnant unsigned long operator()(unsigned long __n = 0) const; 2351*3e519524SHoward Hinnant}; 2352*3e519524SHoward Hinnant 2353*3e519524SHoward Hinnanttemplate <bool __b> 2354*3e519524SHoward Hinnantunsigned long 2355*3e519524SHoward Hinnant__rs_default<__b, 1>::operator()(unsigned long __n) const 2356*3e519524SHoward Hinnant{ 2357*3e519524SHoward Hinnant switch (__n) 2358*3e519524SHoward Hinnant { 2359*3e519524SHoward Hinnant case 0: 2360*3e519524SHoward Hinnant return __random_bits<__lbits>(); 2361*3e519524SHoward Hinnant case 1: 2362*3e519524SHoward Hinnant return 0; 2363*3e519524SHoward Hinnant } 2364*3e519524SHoward Hinnant if (__n <= (1UL << __rbits)) 2365*3e519524SHoward Hinnant return __scaled_random_number<__rbits>(__n); 2366*3e519524SHoward Hinnant return __scaled_random_number<__lbits>(__n); 2367*3e519524SHoward Hinnant} 2368*3e519524SHoward Hinnant 2369*3e519524SHoward Hinnanttemplate <bool __b> 2370*3e519524SHoward Hinnantstruct __rs_default<__b, 2> 2371*3e519524SHoward Hinnant{ 2372*3e519524SHoward Hinnant unsigned long operator()(unsigned long __n = 0) const; 2373*3e519524SHoward Hinnant}; 2374*3e519524SHoward Hinnant 2375*3e519524SHoward Hinnanttemplate <bool __b> 2376*3e519524SHoward Hinnantunsigned long 2377*3e519524SHoward Hinnant__rs_default<__b, 2>::operator()(unsigned long __n) const 2378*3e519524SHoward Hinnant{ 2379*3e519524SHoward Hinnant switch (__n) 2380*3e519524SHoward Hinnant { 2381*3e519524SHoward Hinnant case 0: 2382*3e519524SHoward Hinnant return __random_bits<__lbits>(); 2383*3e519524SHoward Hinnant case 1: 2384*3e519524SHoward Hinnant return 0; 2385*3e519524SHoward Hinnant } 2386*3e519524SHoward Hinnant int __nb = __rbits; 2387*3e519524SHoward Hinnant while (__nb < __lbits && __n > (1UL << __nb)) 2388*3e519524SHoward Hinnant __nb += _STD::min(__rbits, __lbits - __nb); 2389*3e519524SHoward Hinnant switch (__nb) 2390*3e519524SHoward Hinnant { 2391*3e519524SHoward Hinnant case __rbits: 2392*3e519524SHoward Hinnant return __scaled_random_number<__rbits>(__n); 2393*3e519524SHoward Hinnant case 2*__rbits: 2394*3e519524SHoward Hinnant return __scaled_random_number<2*__rbits>(__n); 2395*3e519524SHoward Hinnant } 2396*3e519524SHoward Hinnant return __scaled_random_number<__lbits>(__n); 2397*3e519524SHoward Hinnant} 2398*3e519524SHoward Hinnant 2399*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 2400*3e519524SHoward Hinnantvoid 2401*3e519524SHoward Hinnantrandom_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last) 2402*3e519524SHoward Hinnant{ 2403*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 2404*3e519524SHoward Hinnant difference_type __d = __last - __first; 2405*3e519524SHoward Hinnant if (__d > 1) 2406*3e519524SHoward Hinnant { 2407*3e519524SHoward Hinnant for (--__last; __first < __last; ++__first, --__d) 2408*3e519524SHoward Hinnant swap(*__first, *(__first 2409*3e519524SHoward Hinnant + static_cast<difference_type>(__rs_default<true>()(static_cast<unsigned long>(__d))))); 2410*3e519524SHoward Hinnant } 2411*3e519524SHoward Hinnant} 2412*3e519524SHoward Hinnant 2413*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _RandomNumberGenerator> 2414*3e519524SHoward Hinnantvoid 2415*3e519524SHoward Hinnantrandom_shuffle(_RandomAccessIterator __first, _RandomAccessIterator __last, 2416*3e519524SHoward Hinnant#ifdef _LIBCPP_MOVE 2417*3e519524SHoward Hinnant _RandomNumberGenerator&& __rand) 2418*3e519524SHoward Hinnant#else 2419*3e519524SHoward Hinnant _RandomNumberGenerator& __rand) 2420*3e519524SHoward Hinnant#endif 2421*3e519524SHoward Hinnant{ 2422*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 2423*3e519524SHoward Hinnant difference_type __d = __last - __first; 2424*3e519524SHoward Hinnant if (__d > 1) 2425*3e519524SHoward Hinnant { 2426*3e519524SHoward Hinnant for (--__last; __first < __last; ++__first, --__d) 2427*3e519524SHoward Hinnant swap(*__first, *(__first + __rand(__d))); 2428*3e519524SHoward Hinnant } 2429*3e519524SHoward Hinnant} 2430*3e519524SHoward Hinnant 2431*3e519524SHoward Hinnanttemplate <class _InputIterator, class _Predicate> 2432*3e519524SHoward Hinnantbool 2433*3e519524SHoward Hinnantis_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred) 2434*3e519524SHoward Hinnant{ 2435*3e519524SHoward Hinnant for (; __first != __last; ++__first) 2436*3e519524SHoward Hinnant if (!__pred(*__first)) 2437*3e519524SHoward Hinnant break; 2438*3e519524SHoward Hinnant for (; __first != __last; ++__first) 2439*3e519524SHoward Hinnant if (__pred(*__first)) 2440*3e519524SHoward Hinnant return false; 2441*3e519524SHoward Hinnant return true; 2442*3e519524SHoward Hinnant} 2443*3e519524SHoward Hinnant 2444*3e519524SHoward Hinnant// partition 2445*3e519524SHoward Hinnant 2446*3e519524SHoward Hinnanttemplate <class _Predicate, class _ForwardIterator> 2447*3e519524SHoward Hinnant_ForwardIterator 2448*3e519524SHoward Hinnant__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag) 2449*3e519524SHoward Hinnant{ 2450*3e519524SHoward Hinnant while (true) 2451*3e519524SHoward Hinnant { 2452*3e519524SHoward Hinnant if (__first == __last) 2453*3e519524SHoward Hinnant return __first; 2454*3e519524SHoward Hinnant if (!__pred(*__first)) 2455*3e519524SHoward Hinnant break; 2456*3e519524SHoward Hinnant ++__first; 2457*3e519524SHoward Hinnant } 2458*3e519524SHoward Hinnant for (_ForwardIterator __p = __first; ++__p != __last;) 2459*3e519524SHoward Hinnant { 2460*3e519524SHoward Hinnant if (__pred(*__p)) 2461*3e519524SHoward Hinnant { 2462*3e519524SHoward Hinnant swap(*__first, *__p); 2463*3e519524SHoward Hinnant ++__first; 2464*3e519524SHoward Hinnant } 2465*3e519524SHoward Hinnant } 2466*3e519524SHoward Hinnant return __first; 2467*3e519524SHoward Hinnant} 2468*3e519524SHoward Hinnant 2469*3e519524SHoward Hinnanttemplate <class _Predicate, class _BidirectionalIterator> 2470*3e519524SHoward Hinnant_BidirectionalIterator 2471*3e519524SHoward Hinnant__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, 2472*3e519524SHoward Hinnant bidirectional_iterator_tag) 2473*3e519524SHoward Hinnant{ 2474*3e519524SHoward Hinnant while (true) 2475*3e519524SHoward Hinnant { 2476*3e519524SHoward Hinnant while (true) 2477*3e519524SHoward Hinnant { 2478*3e519524SHoward Hinnant if (__first == __last) 2479*3e519524SHoward Hinnant return __first; 2480*3e519524SHoward Hinnant if (!__pred(*__first)) 2481*3e519524SHoward Hinnant break; 2482*3e519524SHoward Hinnant ++__first; 2483*3e519524SHoward Hinnant } 2484*3e519524SHoward Hinnant do 2485*3e519524SHoward Hinnant { 2486*3e519524SHoward Hinnant if (__first == --__last) 2487*3e519524SHoward Hinnant return __first; 2488*3e519524SHoward Hinnant } while (!__pred(*__last)); 2489*3e519524SHoward Hinnant swap(*__first, *__last); 2490*3e519524SHoward Hinnant ++__first; 2491*3e519524SHoward Hinnant } 2492*3e519524SHoward Hinnant} 2493*3e519524SHoward Hinnant 2494*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate> 2495*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2496*3e519524SHoward Hinnant_ForwardIterator 2497*3e519524SHoward Hinnantpartition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) 2498*3e519524SHoward Hinnant{ 2499*3e519524SHoward Hinnant return _STD::__partition<typename add_lvalue_reference<_Predicate>::type> 2500*3e519524SHoward Hinnant (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category()); 2501*3e519524SHoward Hinnant} 2502*3e519524SHoward Hinnant 2503*3e519524SHoward Hinnant// partition_copy 2504*3e519524SHoward Hinnant 2505*3e519524SHoward Hinnanttemplate <class _InputIterator, class _OutputIterator1, 2506*3e519524SHoward Hinnant class _OutputIterator2, class _Predicate> 2507*3e519524SHoward Hinnantpair<_OutputIterator1, _OutputIterator2> 2508*3e519524SHoward Hinnantpartition_copy(_InputIterator __first, _InputIterator __last, 2509*3e519524SHoward Hinnant _OutputIterator1 __out_true, _OutputIterator2 __out_false, 2510*3e519524SHoward Hinnant _Predicate __pred) 2511*3e519524SHoward Hinnant{ 2512*3e519524SHoward Hinnant for (; __first != __last; ++__first) 2513*3e519524SHoward Hinnant { 2514*3e519524SHoward Hinnant if (__pred(*__first)) 2515*3e519524SHoward Hinnant { 2516*3e519524SHoward Hinnant *__out_true = *__first; 2517*3e519524SHoward Hinnant ++__out_true; 2518*3e519524SHoward Hinnant } 2519*3e519524SHoward Hinnant else 2520*3e519524SHoward Hinnant { 2521*3e519524SHoward Hinnant *__out_false = *__first; 2522*3e519524SHoward Hinnant ++__out_false; 2523*3e519524SHoward Hinnant } 2524*3e519524SHoward Hinnant } 2525*3e519524SHoward Hinnant return pair<_OutputIterator1, _OutputIterator2>(__out_true, __out_false); 2526*3e519524SHoward Hinnant} 2527*3e519524SHoward Hinnant 2528*3e519524SHoward Hinnant// partition_point 2529*3e519524SHoward Hinnant 2530*3e519524SHoward Hinnanttemplate<class _ForwardIterator, class _Predicate> 2531*3e519524SHoward Hinnant_ForwardIterator 2532*3e519524SHoward Hinnantpartition_point(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) 2533*3e519524SHoward Hinnant{ 2534*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; 2535*3e519524SHoward Hinnant difference_type __len = _STD::distance(__first, __last); 2536*3e519524SHoward Hinnant while (__len != 0) 2537*3e519524SHoward Hinnant { 2538*3e519524SHoward Hinnant difference_type __l2 = __len / 2; 2539*3e519524SHoward Hinnant _ForwardIterator __m = __first; 2540*3e519524SHoward Hinnant _STD::advance(__m, __l2); 2541*3e519524SHoward Hinnant if (__pred(*__m)) 2542*3e519524SHoward Hinnant { 2543*3e519524SHoward Hinnant __first = ++__m; 2544*3e519524SHoward Hinnant __len -= __l2 + 1; 2545*3e519524SHoward Hinnant } 2546*3e519524SHoward Hinnant else 2547*3e519524SHoward Hinnant __len = __l2; 2548*3e519524SHoward Hinnant } 2549*3e519524SHoward Hinnant return __first; 2550*3e519524SHoward Hinnant} 2551*3e519524SHoward Hinnant 2552*3e519524SHoward Hinnant// stable_partition 2553*3e519524SHoward Hinnant 2554*3e519524SHoward Hinnanttemplate <class _Predicate, class _ForwardIterator, class _Distance, class _Pair> 2555*3e519524SHoward Hinnant_ForwardIterator 2556*3e519524SHoward Hinnant__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, 2557*3e519524SHoward Hinnant _Distance __len, _Pair __p, forward_iterator_tag __fit) 2558*3e519524SHoward Hinnant{ 2559*3e519524SHoward Hinnant // *__first is known to be false 2560*3e519524SHoward Hinnant // __len >= 1 2561*3e519524SHoward Hinnant if (__len == 1) 2562*3e519524SHoward Hinnant return __first; 2563*3e519524SHoward Hinnant if (__len == 2) 2564*3e519524SHoward Hinnant { 2565*3e519524SHoward Hinnant _ForwardIterator __m = __first; 2566*3e519524SHoward Hinnant if (__pred(*++__m)) 2567*3e519524SHoward Hinnant { 2568*3e519524SHoward Hinnant swap(*__first, *__m); 2569*3e519524SHoward Hinnant return __m; 2570*3e519524SHoward Hinnant } 2571*3e519524SHoward Hinnant return __first; 2572*3e519524SHoward Hinnant } 2573*3e519524SHoward Hinnant if (__len <= __p.second) 2574*3e519524SHoward Hinnant { // The buffer is big enough to use 2575*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 2576*3e519524SHoward Hinnant __destruct_n __d(0); 2577*3e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(__p.first, __d); 2578*3e519524SHoward Hinnant // Move the falses into the temporary buffer, and the trues to the front of the line 2579*3e519524SHoward Hinnant // Update __first to always point to the end of the trues 2580*3e519524SHoward Hinnant value_type* __t = __p.first; 2581*3e519524SHoward Hinnant ::new(__t) value_type(_STD::move(*__first)); 2582*3e519524SHoward Hinnant __d.__incr((value_type*)0); 2583*3e519524SHoward Hinnant ++__t; 2584*3e519524SHoward Hinnant _ForwardIterator __i = __first; 2585*3e519524SHoward Hinnant while (++__i != __last) 2586*3e519524SHoward Hinnant { 2587*3e519524SHoward Hinnant if (__pred(*__i)) 2588*3e519524SHoward Hinnant { 2589*3e519524SHoward Hinnant *__first = _STD::move(*__i); 2590*3e519524SHoward Hinnant ++__first; 2591*3e519524SHoward Hinnant } 2592*3e519524SHoward Hinnant else 2593*3e519524SHoward Hinnant { 2594*3e519524SHoward Hinnant ::new(__t) value_type(_STD::move(*__i)); 2595*3e519524SHoward Hinnant __d.__incr((value_type*)0); 2596*3e519524SHoward Hinnant ++__t; 2597*3e519524SHoward Hinnant } 2598*3e519524SHoward Hinnant } 2599*3e519524SHoward Hinnant // All trues now at start of range, all falses in buffer 2600*3e519524SHoward Hinnant // Move falses back into range, but don't mess up __first which points to first false 2601*3e519524SHoward Hinnant __i = __first; 2602*3e519524SHoward Hinnant for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i) 2603*3e519524SHoward Hinnant *__i = _STD::move(*__t2); 2604*3e519524SHoward Hinnant // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer 2605*3e519524SHoward Hinnant return __first; 2606*3e519524SHoward Hinnant } 2607*3e519524SHoward Hinnant // Else not enough buffer, do in place 2608*3e519524SHoward Hinnant // __len >= 3 2609*3e519524SHoward Hinnant _ForwardIterator __m = __first; 2610*3e519524SHoward Hinnant _Distance __len2 = __len / 2; // __len2 >= 2 2611*3e519524SHoward Hinnant _STD::advance(__m, __len2); 2612*3e519524SHoward Hinnant // recurse on [__first, __m), *__first know to be false 2613*3e519524SHoward Hinnant // F????????????????? 2614*3e519524SHoward Hinnant // f m l 2615*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Predicate>::type _PredRef; 2616*3e519524SHoward Hinnant _ForwardIterator __first_false = __stable_partition<_PredRef>(__first, __m, __pred, __len2, __p, __fit); 2617*3e519524SHoward Hinnant // TTTFFFFF?????????? 2618*3e519524SHoward Hinnant // f ff m l 2619*3e519524SHoward Hinnant // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true 2620*3e519524SHoward Hinnant _ForwardIterator __m1 = __m; 2621*3e519524SHoward Hinnant _ForwardIterator __second_false = __last; 2622*3e519524SHoward Hinnant _Distance __len_half = __len - __len2; 2623*3e519524SHoward Hinnant while (__pred(*__m1)) 2624*3e519524SHoward Hinnant { 2625*3e519524SHoward Hinnant if (++__m1 == __last) 2626*3e519524SHoward Hinnant goto __second_half_done; 2627*3e519524SHoward Hinnant --__len_half; 2628*3e519524SHoward Hinnant } 2629*3e519524SHoward Hinnant // TTTFFFFFTTTF?????? 2630*3e519524SHoward Hinnant // f ff m m1 l 2631*3e519524SHoward Hinnant __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __fit); 2632*3e519524SHoward Hinnant__second_half_done: 2633*3e519524SHoward Hinnant // TTTFFFFFTTTTTFFFFF 2634*3e519524SHoward Hinnant // f ff m sf l 2635*3e519524SHoward Hinnant return _STD::rotate(__first_false, __m, __second_false); 2636*3e519524SHoward Hinnant // TTTTTTTTFFFFFFFFFF 2637*3e519524SHoward Hinnant // | 2638*3e519524SHoward Hinnant} 2639*3e519524SHoward Hinnant 2640*3e519524SHoward Hinnantstruct __return_temporary_buffer 2641*3e519524SHoward Hinnant{ 2642*3e519524SHoward Hinnant template <class _Tp> 2643*3e519524SHoward Hinnant _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) const {_STD::return_temporary_buffer(__p);} 2644*3e519524SHoward Hinnant}; 2645*3e519524SHoward Hinnant 2646*3e519524SHoward Hinnanttemplate <class _Predicate, class _ForwardIterator> 2647*3e519524SHoward Hinnant_ForwardIterator 2648*3e519524SHoward Hinnant__stable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, 2649*3e519524SHoward Hinnant forward_iterator_tag) 2650*3e519524SHoward Hinnant{ 2651*3e519524SHoward Hinnant const unsigned __alloc_limit = 3; // might want to make this a function of trivial assignment 2652*3e519524SHoward Hinnant // Either prove all true and return __first or point to first false 2653*3e519524SHoward Hinnant while (true) 2654*3e519524SHoward Hinnant { 2655*3e519524SHoward Hinnant if (__first == __last) 2656*3e519524SHoward Hinnant return __first; 2657*3e519524SHoward Hinnant if (!__pred(*__first)) 2658*3e519524SHoward Hinnant break; 2659*3e519524SHoward Hinnant ++__first; 2660*3e519524SHoward Hinnant } 2661*3e519524SHoward Hinnant // We now have a reduced range [__first, __last) 2662*3e519524SHoward Hinnant // *__first is known to be false 2663*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; 2664*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::value_type value_type; 2665*3e519524SHoward Hinnant difference_type __len = _STD::distance(__first, __last); 2666*3e519524SHoward Hinnant pair<value_type*, ptrdiff_t> __p(0, 0); 2667*3e519524SHoward Hinnant unique_ptr<value_type, __return_temporary_buffer> __h; 2668*3e519524SHoward Hinnant if (__len >= __alloc_limit) 2669*3e519524SHoward Hinnant { 2670*3e519524SHoward Hinnant __p = _STD::get_temporary_buffer<value_type>(__len); 2671*3e519524SHoward Hinnant __h.reset(__p.first); 2672*3e519524SHoward Hinnant } 2673*3e519524SHoward Hinnant return __stable_partition<typename add_lvalue_reference<_Predicate>::type> 2674*3e519524SHoward Hinnant (__first, __last, __pred, __len, __p, forward_iterator_tag()); 2675*3e519524SHoward Hinnant} 2676*3e519524SHoward Hinnant 2677*3e519524SHoward Hinnanttemplate <class _Predicate, class _BidirectionalIterator, class _Distance, class _Pair> 2678*3e519524SHoward Hinnant_BidirectionalIterator 2679*3e519524SHoward Hinnant__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, 2680*3e519524SHoward Hinnant _Distance __len, _Pair __p, bidirectional_iterator_tag __bit) 2681*3e519524SHoward Hinnant{ 2682*3e519524SHoward Hinnant // *__first is known to be false 2683*3e519524SHoward Hinnant // *__last is known to be true 2684*3e519524SHoward Hinnant // __len >= 2 2685*3e519524SHoward Hinnant if (__len == 2) 2686*3e519524SHoward Hinnant { 2687*3e519524SHoward Hinnant swap(*__first, *__last); 2688*3e519524SHoward Hinnant return __last; 2689*3e519524SHoward Hinnant } 2690*3e519524SHoward Hinnant if (__len == 3) 2691*3e519524SHoward Hinnant { 2692*3e519524SHoward Hinnant _BidirectionalIterator __m = __first; 2693*3e519524SHoward Hinnant if (__pred(*++__m)) 2694*3e519524SHoward Hinnant { 2695*3e519524SHoward Hinnant swap(*__first, *__m); 2696*3e519524SHoward Hinnant swap(*__m, *__last); 2697*3e519524SHoward Hinnant return __last; 2698*3e519524SHoward Hinnant } 2699*3e519524SHoward Hinnant swap(*__m, *__last); 2700*3e519524SHoward Hinnant swap(*__first, *__m); 2701*3e519524SHoward Hinnant return __m; 2702*3e519524SHoward Hinnant } 2703*3e519524SHoward Hinnant if (__len <= __p.second) 2704*3e519524SHoward Hinnant { // The buffer is big enough to use 2705*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; 2706*3e519524SHoward Hinnant __destruct_n __d(0); 2707*3e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(__p.first, __d); 2708*3e519524SHoward Hinnant // Move the falses into the temporary buffer, and the trues to the front of the line 2709*3e519524SHoward Hinnant // Update __first to always point to the end of the trues 2710*3e519524SHoward Hinnant value_type* __t = __p.first; 2711*3e519524SHoward Hinnant ::new(__t) value_type(_STD::move(*__first)); 2712*3e519524SHoward Hinnant __d.__incr((value_type*)0); 2713*3e519524SHoward Hinnant ++__t; 2714*3e519524SHoward Hinnant _BidirectionalIterator __i = __first; 2715*3e519524SHoward Hinnant while (++__i != __last) 2716*3e519524SHoward Hinnant { 2717*3e519524SHoward Hinnant if (__pred(*__i)) 2718*3e519524SHoward Hinnant { 2719*3e519524SHoward Hinnant *__first = _STD::move(*__i); 2720*3e519524SHoward Hinnant ++__first; 2721*3e519524SHoward Hinnant } 2722*3e519524SHoward Hinnant else 2723*3e519524SHoward Hinnant { 2724*3e519524SHoward Hinnant ::new(__t) value_type(_STD::move(*__i)); 2725*3e519524SHoward Hinnant __d.__incr((value_type*)0); 2726*3e519524SHoward Hinnant ++__t; 2727*3e519524SHoward Hinnant } 2728*3e519524SHoward Hinnant } 2729*3e519524SHoward Hinnant // move *__last, known to be true 2730*3e519524SHoward Hinnant *__first = _STD::move(*__i); 2731*3e519524SHoward Hinnant __i = ++__first; 2732*3e519524SHoward Hinnant // All trues now at start of range, all falses in buffer 2733*3e519524SHoward Hinnant // Move falses back into range, but don't mess up __first which points to first false 2734*3e519524SHoward Hinnant for (value_type* __t2 = __p.first; __t2 < __t; ++__t2, ++__i) 2735*3e519524SHoward Hinnant *__i = _STD::move(*__t2); 2736*3e519524SHoward Hinnant // __h destructs moved-from values out of the temp buffer, but doesn't deallocate buffer 2737*3e519524SHoward Hinnant return __first; 2738*3e519524SHoward Hinnant } 2739*3e519524SHoward Hinnant // Else not enough buffer, do in place 2740*3e519524SHoward Hinnant // __len >= 4 2741*3e519524SHoward Hinnant _BidirectionalIterator __m = __first; 2742*3e519524SHoward Hinnant _Distance __len2 = __len / 2; // __len2 >= 2 2743*3e519524SHoward Hinnant _STD::advance(__m, __len2); 2744*3e519524SHoward Hinnant // recurse on [__first, __m-1], except reduce __m-1 until *(__m-1) is true, *__first know to be false 2745*3e519524SHoward Hinnant // F????????????????T 2746*3e519524SHoward Hinnant // f m l 2747*3e519524SHoward Hinnant _BidirectionalIterator __m1 = __m; 2748*3e519524SHoward Hinnant _BidirectionalIterator __first_false = __first; 2749*3e519524SHoward Hinnant _Distance __len_half = __len2; 2750*3e519524SHoward Hinnant while (!__pred(*--__m1)) 2751*3e519524SHoward Hinnant { 2752*3e519524SHoward Hinnant if (__m1 == __first) 2753*3e519524SHoward Hinnant goto __first_half_done; 2754*3e519524SHoward Hinnant --__len_half; 2755*3e519524SHoward Hinnant } 2756*3e519524SHoward Hinnant // F???TFFF?????????T 2757*3e519524SHoward Hinnant // f m1 m l 2758*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Predicate>::type _PredRef; 2759*3e519524SHoward Hinnant __first_false = __stable_partition<_PredRef>(__first, __m1, __pred, __len_half, __p, __bit); 2760*3e519524SHoward Hinnant__first_half_done: 2761*3e519524SHoward Hinnant // TTTFFFFF?????????T 2762*3e519524SHoward Hinnant // f ff m l 2763*3e519524SHoward Hinnant // recurse on [__m, __last], except increase __m until *(__m) is false, *__last know to be true 2764*3e519524SHoward Hinnant __m1 = __m; 2765*3e519524SHoward Hinnant _BidirectionalIterator __second_false = __last; 2766*3e519524SHoward Hinnant ++__second_false; 2767*3e519524SHoward Hinnant __len_half = __len - __len2; 2768*3e519524SHoward Hinnant while (__pred(*__m1)) 2769*3e519524SHoward Hinnant { 2770*3e519524SHoward Hinnant if (++__m1 == __last) 2771*3e519524SHoward Hinnant goto __second_half_done; 2772*3e519524SHoward Hinnant --__len_half; 2773*3e519524SHoward Hinnant } 2774*3e519524SHoward Hinnant // TTTFFFFFTTTF?????T 2775*3e519524SHoward Hinnant // f ff m m1 l 2776*3e519524SHoward Hinnant __second_false = __stable_partition<_PredRef>(__m1, __last, __pred, __len_half, __p, __bit); 2777*3e519524SHoward Hinnant__second_half_done: 2778*3e519524SHoward Hinnant // TTTFFFFFTTTTTFFFFF 2779*3e519524SHoward Hinnant // f ff m sf l 2780*3e519524SHoward Hinnant return _STD::rotate(__first_false, __m, __second_false); 2781*3e519524SHoward Hinnant // TTTTTTTTFFFFFFFFFF 2782*3e519524SHoward Hinnant // | 2783*3e519524SHoward Hinnant} 2784*3e519524SHoward Hinnant 2785*3e519524SHoward Hinnanttemplate <class _Predicate, class _BidirectionalIterator> 2786*3e519524SHoward Hinnant_BidirectionalIterator 2787*3e519524SHoward Hinnant__stable_partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred, 2788*3e519524SHoward Hinnant bidirectional_iterator_tag) 2789*3e519524SHoward Hinnant{ 2790*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; 2791*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; 2792*3e519524SHoward Hinnant const difference_type __alloc_limit = 4; // might want to make this a function of trivial assignment 2793*3e519524SHoward Hinnant // Either prove all true and return __first or point to first false 2794*3e519524SHoward Hinnant while (true) 2795*3e519524SHoward Hinnant { 2796*3e519524SHoward Hinnant if (__first == __last) 2797*3e519524SHoward Hinnant return __first; 2798*3e519524SHoward Hinnant if (!__pred(*__first)) 2799*3e519524SHoward Hinnant break; 2800*3e519524SHoward Hinnant ++__first; 2801*3e519524SHoward Hinnant } 2802*3e519524SHoward Hinnant // __first points to first false, everything prior to __first is already set. 2803*3e519524SHoward Hinnant // Either prove [__first, __last) is all false and return __first, or point __last to last true 2804*3e519524SHoward Hinnant do 2805*3e519524SHoward Hinnant { 2806*3e519524SHoward Hinnant if (__first == --__last) 2807*3e519524SHoward Hinnant return __first; 2808*3e519524SHoward Hinnant } while (!__pred(*__last)); 2809*3e519524SHoward Hinnant // We now have a reduced range [__first, __last] 2810*3e519524SHoward Hinnant // *__first is known to be false 2811*3e519524SHoward Hinnant // *__last is known to be true 2812*3e519524SHoward Hinnant // __len >= 2 2813*3e519524SHoward Hinnant difference_type __len = _STD::distance(__first, __last) + 1; 2814*3e519524SHoward Hinnant pair<value_type*, ptrdiff_t> __p(0, 0); 2815*3e519524SHoward Hinnant unique_ptr<value_type, __return_temporary_buffer> __h; 2816*3e519524SHoward Hinnant if (__len >= __alloc_limit) 2817*3e519524SHoward Hinnant { 2818*3e519524SHoward Hinnant __p = _STD::get_temporary_buffer<value_type>(__len); 2819*3e519524SHoward Hinnant __h.reset(__p.first); 2820*3e519524SHoward Hinnant } 2821*3e519524SHoward Hinnant return __stable_partition<typename add_lvalue_reference<_Predicate>::type> 2822*3e519524SHoward Hinnant (__first, __last, __pred, __len, __p, bidirectional_iterator_tag()); 2823*3e519524SHoward Hinnant} 2824*3e519524SHoward Hinnant 2825*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Predicate> 2826*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2827*3e519524SHoward Hinnant_ForwardIterator 2828*3e519524SHoward Hinnantstable_partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) 2829*3e519524SHoward Hinnant{ 2830*3e519524SHoward Hinnant return __stable_partition<typename add_lvalue_reference<_Predicate>::type> 2831*3e519524SHoward Hinnant (__first, __last, __pred, typename iterator_traits<_ForwardIterator>::iterator_category()); 2832*3e519524SHoward Hinnant} 2833*3e519524SHoward Hinnant 2834*3e519524SHoward Hinnant// is_sorted_until 2835*3e519524SHoward Hinnant 2836*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare> 2837*3e519524SHoward Hinnant_ForwardIterator 2838*3e519524SHoward Hinnantis_sorted_until(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) 2839*3e519524SHoward Hinnant{ 2840*3e519524SHoward Hinnant if (__first != __last) 2841*3e519524SHoward Hinnant { 2842*3e519524SHoward Hinnant _ForwardIterator __i = __first; 2843*3e519524SHoward Hinnant while (++__i != __last) 2844*3e519524SHoward Hinnant { 2845*3e519524SHoward Hinnant if (__comp(*__i, *__first)) 2846*3e519524SHoward Hinnant return __i; 2847*3e519524SHoward Hinnant __first = __i; 2848*3e519524SHoward Hinnant } 2849*3e519524SHoward Hinnant } 2850*3e519524SHoward Hinnant return __last; 2851*3e519524SHoward Hinnant} 2852*3e519524SHoward Hinnant 2853*3e519524SHoward Hinnanttemplate<class _ForwardIterator> 2854*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2855*3e519524SHoward Hinnant_ForwardIterator 2856*3e519524SHoward Hinnantis_sorted_until(_ForwardIterator __first, _ForwardIterator __last) 2857*3e519524SHoward Hinnant{ 2858*3e519524SHoward Hinnant return _STD::is_sorted_until(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); 2859*3e519524SHoward Hinnant} 2860*3e519524SHoward Hinnant 2861*3e519524SHoward Hinnant// is_sorted 2862*3e519524SHoward Hinnant 2863*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Compare> 2864*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2865*3e519524SHoward Hinnantbool 2866*3e519524SHoward Hinnantis_sorted(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) 2867*3e519524SHoward Hinnant{ 2868*3e519524SHoward Hinnant return _STD::is_sorted_until(__first, __last, __comp) == __last; 2869*3e519524SHoward Hinnant} 2870*3e519524SHoward Hinnant 2871*3e519524SHoward Hinnanttemplate<class _ForwardIterator> 2872*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 2873*3e519524SHoward Hinnantbool 2874*3e519524SHoward Hinnantis_sorted(_ForwardIterator __first, _ForwardIterator __last) 2875*3e519524SHoward Hinnant{ 2876*3e519524SHoward Hinnant return _STD::is_sorted(__first, __last, __less<typename iterator_traits<_ForwardIterator>::value_type>()); 2877*3e519524SHoward Hinnant} 2878*3e519524SHoward Hinnant 2879*3e519524SHoward Hinnant// sort 2880*3e519524SHoward Hinnant 2881*3e519524SHoward Hinnant// stable, 2-3 compares, 0-2 swaps 2882*3e519524SHoward Hinnant 2883*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator> 2884*3e519524SHoward Hinnantunsigned 2885*3e519524SHoward Hinnant__sort3(_ForwardIterator __x, _ForwardIterator __y, _ForwardIterator __z, _Compare __c) 2886*3e519524SHoward Hinnant{ 2887*3e519524SHoward Hinnant unsigned __r = 0; 2888*3e519524SHoward Hinnant if (!__c(*__y, *__x)) // if x <= y 2889*3e519524SHoward Hinnant { 2890*3e519524SHoward Hinnant if (!__c(*__z, *__y)) // if y <= z 2891*3e519524SHoward Hinnant return __r; // x <= y && y <= z 2892*3e519524SHoward Hinnant // x <= y && y > z 2893*3e519524SHoward Hinnant swap(*__y, *__z); // x <= z && y < z 2894*3e519524SHoward Hinnant __r = 1; 2895*3e519524SHoward Hinnant if (__c(*__y, *__x)) // if x > y 2896*3e519524SHoward Hinnant { 2897*3e519524SHoward Hinnant swap(*__x, *__y); // x < y && y <= z 2898*3e519524SHoward Hinnant __r = 2; 2899*3e519524SHoward Hinnant } 2900*3e519524SHoward Hinnant return __r; // x <= y && y < z 2901*3e519524SHoward Hinnant } 2902*3e519524SHoward Hinnant if (__c(*__z, *__y)) // x > y, if y > z 2903*3e519524SHoward Hinnant { 2904*3e519524SHoward Hinnant swap(*__x, *__z); // x < y && y < z 2905*3e519524SHoward Hinnant __r = 1; 2906*3e519524SHoward Hinnant return __r; 2907*3e519524SHoward Hinnant } 2908*3e519524SHoward Hinnant swap(*__x, *__y); // x > y && y <= z 2909*3e519524SHoward Hinnant __r = 1; // x < y && x <= z 2910*3e519524SHoward Hinnant if (__c(*__z, *__y)) // if y > z 2911*3e519524SHoward Hinnant { 2912*3e519524SHoward Hinnant swap(*__y, *__z); // x <= y && y < z 2913*3e519524SHoward Hinnant __r = 2; 2914*3e519524SHoward Hinnant } 2915*3e519524SHoward Hinnant return __r; 2916*3e519524SHoward Hinnant} // x <= y && y <= z 2917*3e519524SHoward Hinnant 2918*3e519524SHoward Hinnant// stable, 3-6 compares, 0-5 swaps 2919*3e519524SHoward Hinnant 2920*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator> 2921*3e519524SHoward Hinnantunsigned 2922*3e519524SHoward Hinnant__sort4(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, 2923*3e519524SHoward Hinnant _ForwardIterator __x4, _Compare __c) 2924*3e519524SHoward Hinnant{ 2925*3e519524SHoward Hinnant unsigned __r = __sort3<_Compare>(__x1, __x2, __x3, __c); 2926*3e519524SHoward Hinnant if (__c(*__x4, *__x3)) 2927*3e519524SHoward Hinnant { 2928*3e519524SHoward Hinnant swap(*__x3, *__x4); 2929*3e519524SHoward Hinnant ++__r; 2930*3e519524SHoward Hinnant if (__c(*__x3, *__x2)) 2931*3e519524SHoward Hinnant { 2932*3e519524SHoward Hinnant swap(*__x2, *__x3); 2933*3e519524SHoward Hinnant ++__r; 2934*3e519524SHoward Hinnant if (__c(*__x2, *__x1)) 2935*3e519524SHoward Hinnant { 2936*3e519524SHoward Hinnant swap(*__x1, *__x2); 2937*3e519524SHoward Hinnant ++__r; 2938*3e519524SHoward Hinnant } 2939*3e519524SHoward Hinnant } 2940*3e519524SHoward Hinnant } 2941*3e519524SHoward Hinnant return __r; 2942*3e519524SHoward Hinnant} 2943*3e519524SHoward Hinnant 2944*3e519524SHoward Hinnant// stable, 4-10 compares, 0-9 swaps 2945*3e519524SHoward Hinnant 2946*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator> 2947*3e519524SHoward Hinnantunsigned 2948*3e519524SHoward Hinnant__sort5(_ForwardIterator __x1, _ForwardIterator __x2, _ForwardIterator __x3, 2949*3e519524SHoward Hinnant _ForwardIterator __x4, _ForwardIterator __x5, _Compare __c) 2950*3e519524SHoward Hinnant{ 2951*3e519524SHoward Hinnant unsigned __r = __sort4<_Compare>(__x1, __x2, __x3, __x4, __c); 2952*3e519524SHoward Hinnant if (__c(*__x5, *__x4)) 2953*3e519524SHoward Hinnant { 2954*3e519524SHoward Hinnant swap(*__x4, *__x5); 2955*3e519524SHoward Hinnant ++__r; 2956*3e519524SHoward Hinnant if (__c(*__x4, *__x3)) 2957*3e519524SHoward Hinnant { 2958*3e519524SHoward Hinnant swap(*__x3, *__x4); 2959*3e519524SHoward Hinnant ++__r; 2960*3e519524SHoward Hinnant if (__c(*__x3, *__x2)) 2961*3e519524SHoward Hinnant { 2962*3e519524SHoward Hinnant swap(*__x2, *__x3); 2963*3e519524SHoward Hinnant ++__r; 2964*3e519524SHoward Hinnant if (__c(*__x2, *__x1)) 2965*3e519524SHoward Hinnant { 2966*3e519524SHoward Hinnant swap(*__x1, *__x2); 2967*3e519524SHoward Hinnant ++__r; 2968*3e519524SHoward Hinnant } 2969*3e519524SHoward Hinnant } 2970*3e519524SHoward Hinnant } 2971*3e519524SHoward Hinnant } 2972*3e519524SHoward Hinnant return __r; 2973*3e519524SHoward Hinnant} 2974*3e519524SHoward Hinnant 2975*3e519524SHoward Hinnant// Assumes size > 0 2976*3e519524SHoward Hinnanttemplate <class _Compare, class _BirdirectionalIterator> 2977*3e519524SHoward Hinnantvoid 2978*3e519524SHoward Hinnant__selection_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp) 2979*3e519524SHoward Hinnant{ 2980*3e519524SHoward Hinnant _BirdirectionalIterator __lm1 = __last; 2981*3e519524SHoward Hinnant for (--__lm1; __first != __lm1; ++__first) 2982*3e519524SHoward Hinnant { 2983*3e519524SHoward Hinnant _BirdirectionalIterator __i = _STD::min_element<_BirdirectionalIterator, 2984*3e519524SHoward Hinnant typename add_lvalue_reference<_Compare>::type> 2985*3e519524SHoward Hinnant (__first, __last, __comp); 2986*3e519524SHoward Hinnant if (__i != __first) 2987*3e519524SHoward Hinnant swap(*__first, *__i); 2988*3e519524SHoward Hinnant } 2989*3e519524SHoward Hinnant} 2990*3e519524SHoward Hinnant 2991*3e519524SHoward Hinnanttemplate <class _Compare, class _BirdirectionalIterator> 2992*3e519524SHoward Hinnantvoid 2993*3e519524SHoward Hinnant__insertion_sort(_BirdirectionalIterator __first, _BirdirectionalIterator __last, _Compare __comp) 2994*3e519524SHoward Hinnant{ 2995*3e519524SHoward Hinnant typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type; 2996*3e519524SHoward Hinnant if (__first != __last) 2997*3e519524SHoward Hinnant { 2998*3e519524SHoward Hinnant _BirdirectionalIterator __i = __first; 2999*3e519524SHoward Hinnant for (++__i; __i != __last; ++__i) 3000*3e519524SHoward Hinnant { 3001*3e519524SHoward Hinnant _BirdirectionalIterator __j = __i; 3002*3e519524SHoward Hinnant value_type __t(_STD::move(*__j)); 3003*3e519524SHoward Hinnant for (_BirdirectionalIterator __k = __i; __k != __first && __comp(__t, *--__k); --__j) 3004*3e519524SHoward Hinnant *__j = _STD::move(*__k); 3005*3e519524SHoward Hinnant *__j = _STD::move(__t); 3006*3e519524SHoward Hinnant } 3007*3e519524SHoward Hinnant } 3008*3e519524SHoward Hinnant} 3009*3e519524SHoward Hinnant 3010*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 3011*3e519524SHoward Hinnantvoid 3012*3e519524SHoward Hinnant__insertion_sort_3(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 3013*3e519524SHoward Hinnant{ 3014*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 3015*3e519524SHoward Hinnant _RandomAccessIterator __j = __first+2; 3016*3e519524SHoward Hinnant __sort3<_Compare>(__first, __first+1, __j, __comp); 3017*3e519524SHoward Hinnant for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) 3018*3e519524SHoward Hinnant { 3019*3e519524SHoward Hinnant if (__comp(*__i, *__j)) 3020*3e519524SHoward Hinnant { 3021*3e519524SHoward Hinnant value_type __t(_STD::move(*__i)); 3022*3e519524SHoward Hinnant _RandomAccessIterator __k = __j; 3023*3e519524SHoward Hinnant __j = __i; 3024*3e519524SHoward Hinnant do 3025*3e519524SHoward Hinnant { 3026*3e519524SHoward Hinnant *__j = _STD::move(*__k); 3027*3e519524SHoward Hinnant __j = __k; 3028*3e519524SHoward Hinnant } while (__j != __first && __comp(__t, *--__k)); 3029*3e519524SHoward Hinnant *__j = _STD::move(__t); 3030*3e519524SHoward Hinnant } 3031*3e519524SHoward Hinnant __j = __i; 3032*3e519524SHoward Hinnant } 3033*3e519524SHoward Hinnant} 3034*3e519524SHoward Hinnant 3035*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 3036*3e519524SHoward Hinnantbool 3037*3e519524SHoward Hinnant__insertion_sort_incomplete(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 3038*3e519524SHoward Hinnant{ 3039*3e519524SHoward Hinnant switch (__last - __first) 3040*3e519524SHoward Hinnant { 3041*3e519524SHoward Hinnant case 0: 3042*3e519524SHoward Hinnant case 1: 3043*3e519524SHoward Hinnant return true; 3044*3e519524SHoward Hinnant case 2: 3045*3e519524SHoward Hinnant if (__comp(*--__last, *__first)) 3046*3e519524SHoward Hinnant swap(*__first, *__last); 3047*3e519524SHoward Hinnant return true; 3048*3e519524SHoward Hinnant case 3: 3049*3e519524SHoward Hinnant _STD::__sort3<_Compare>(__first, __first+1, --__last, __comp); 3050*3e519524SHoward Hinnant return true; 3051*3e519524SHoward Hinnant case 4: 3052*3e519524SHoward Hinnant _STD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp); 3053*3e519524SHoward Hinnant return true; 3054*3e519524SHoward Hinnant case 5: 3055*3e519524SHoward Hinnant _STD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp); 3056*3e519524SHoward Hinnant return true; 3057*3e519524SHoward Hinnant } 3058*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 3059*3e519524SHoward Hinnant _RandomAccessIterator __j = __first+2; 3060*3e519524SHoward Hinnant __sort3<_Compare>(__first, __first+1, __j, __comp); 3061*3e519524SHoward Hinnant const unsigned __limit = 8; 3062*3e519524SHoward Hinnant unsigned __count = 0; 3063*3e519524SHoward Hinnant for (_RandomAccessIterator __i = __j+1; __i != __last; ++__i) 3064*3e519524SHoward Hinnant { 3065*3e519524SHoward Hinnant if (__comp(*__i, *__j)) 3066*3e519524SHoward Hinnant { 3067*3e519524SHoward Hinnant value_type __t(_STD::move(*__i)); 3068*3e519524SHoward Hinnant _RandomAccessIterator __k = __j; 3069*3e519524SHoward Hinnant __j = __i; 3070*3e519524SHoward Hinnant do 3071*3e519524SHoward Hinnant { 3072*3e519524SHoward Hinnant *__j = _STD::move(*__k); 3073*3e519524SHoward Hinnant __j = __k; 3074*3e519524SHoward Hinnant } while (__j != __first && __comp(__t, *--__k)); 3075*3e519524SHoward Hinnant *__j = _STD::move(__t); 3076*3e519524SHoward Hinnant if (++__count == __limit) 3077*3e519524SHoward Hinnant return ++__i == __last; 3078*3e519524SHoward Hinnant } 3079*3e519524SHoward Hinnant __j = __i; 3080*3e519524SHoward Hinnant } 3081*3e519524SHoward Hinnant return true; 3082*3e519524SHoward Hinnant} 3083*3e519524SHoward Hinnant 3084*3e519524SHoward Hinnanttemplate <class _Compare, class _BirdirectionalIterator> 3085*3e519524SHoward Hinnantvoid 3086*3e519524SHoward Hinnant__insertion_sort_move(_BirdirectionalIterator __first1, _BirdirectionalIterator __last1, 3087*3e519524SHoward Hinnant typename iterator_traits<_BirdirectionalIterator>::value_type* __first2, _Compare __comp) 3088*3e519524SHoward Hinnant{ 3089*3e519524SHoward Hinnant typedef typename iterator_traits<_BirdirectionalIterator>::value_type value_type; 3090*3e519524SHoward Hinnant if (__first1 != __last1) 3091*3e519524SHoward Hinnant { 3092*3e519524SHoward Hinnant __destruct_n __d(0); 3093*3e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(__first2, __d); 3094*3e519524SHoward Hinnant value_type* __last2 = __first2; 3095*3e519524SHoward Hinnant ::new(__last2) value_type(_STD::move(*__first1)); 3096*3e519524SHoward Hinnant __d.__incr((value_type*)0); 3097*3e519524SHoward Hinnant for (++__last2; ++__first1 != __last1; ++__last2) 3098*3e519524SHoward Hinnant { 3099*3e519524SHoward Hinnant value_type* __j2 = __last2; 3100*3e519524SHoward Hinnant value_type* __i2 = __j2; 3101*3e519524SHoward Hinnant if (__comp(*__first1, *--__i2)) 3102*3e519524SHoward Hinnant { 3103*3e519524SHoward Hinnant ::new(__j2) value_type(_STD::move(*__i2)); 3104*3e519524SHoward Hinnant __d.__incr((value_type*)0); 3105*3e519524SHoward Hinnant for (--__j2; __i2 != __first2 && __comp(*__first1, *--__i2); --__j2) 3106*3e519524SHoward Hinnant *__j2 = _STD::move(*__i2); 3107*3e519524SHoward Hinnant *__j2 = _STD::move(*__first1); 3108*3e519524SHoward Hinnant } 3109*3e519524SHoward Hinnant else 3110*3e519524SHoward Hinnant { 3111*3e519524SHoward Hinnant ::new(__j2) value_type(_STD::move(*__first1)); 3112*3e519524SHoward Hinnant __d.__incr((value_type*)0); 3113*3e519524SHoward Hinnant } 3114*3e519524SHoward Hinnant } 3115*3e519524SHoward Hinnant __h.release(); 3116*3e519524SHoward Hinnant } 3117*3e519524SHoward Hinnant} 3118*3e519524SHoward Hinnant 3119*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 3120*3e519524SHoward Hinnantvoid 3121*3e519524SHoward Hinnant__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 3122*3e519524SHoward Hinnant{ 3123*3e519524SHoward Hinnant // _Compare is known to be a reference type 3124*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 3125*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 3126*3e519524SHoward Hinnant const difference_type __limit = has_trivial_copy_constructor<value_type>::value && 3127*3e519524SHoward Hinnant has_trivial_copy_assign<value_type>::value ? 30 : 6; 3128*3e519524SHoward Hinnant while (true) 3129*3e519524SHoward Hinnant { 3130*3e519524SHoward Hinnant __restart: 3131*3e519524SHoward Hinnant difference_type __len = __last - __first; 3132*3e519524SHoward Hinnant switch (__len) 3133*3e519524SHoward Hinnant { 3134*3e519524SHoward Hinnant case 0: 3135*3e519524SHoward Hinnant case 1: 3136*3e519524SHoward Hinnant return; 3137*3e519524SHoward Hinnant case 2: 3138*3e519524SHoward Hinnant if (__comp(*--__last, *__first)) 3139*3e519524SHoward Hinnant swap(*__first, *__last); 3140*3e519524SHoward Hinnant return; 3141*3e519524SHoward Hinnant case 3: 3142*3e519524SHoward Hinnant _STD::__sort3<_Compare>(__first, __first+1, --__last, __comp); 3143*3e519524SHoward Hinnant return; 3144*3e519524SHoward Hinnant case 4: 3145*3e519524SHoward Hinnant _STD::__sort4<_Compare>(__first, __first+1, __first+2, --__last, __comp); 3146*3e519524SHoward Hinnant return; 3147*3e519524SHoward Hinnant case 5: 3148*3e519524SHoward Hinnant _STD::__sort5<_Compare>(__first, __first+1, __first+2, __first+3, --__last, __comp); 3149*3e519524SHoward Hinnant return; 3150*3e519524SHoward Hinnant } 3151*3e519524SHoward Hinnant if (__len <= __limit) 3152*3e519524SHoward Hinnant { 3153*3e519524SHoward Hinnant _STD::__insertion_sort_3<_Compare>(__first, __last, __comp); 3154*3e519524SHoward Hinnant return; 3155*3e519524SHoward Hinnant } 3156*3e519524SHoward Hinnant // __len > 5 3157*3e519524SHoward Hinnant _RandomAccessIterator __m = __first; 3158*3e519524SHoward Hinnant _RandomAccessIterator __lm1 = __last; 3159*3e519524SHoward Hinnant --__lm1; 3160*3e519524SHoward Hinnant unsigned __n_swaps; 3161*3e519524SHoward Hinnant { 3162*3e519524SHoward Hinnant difference_type __delta; 3163*3e519524SHoward Hinnant if (__len >= 1000) 3164*3e519524SHoward Hinnant { 3165*3e519524SHoward Hinnant __delta = __len/2; 3166*3e519524SHoward Hinnant __m += __delta; 3167*3e519524SHoward Hinnant __delta /= 2; 3168*3e519524SHoward Hinnant __n_swaps = _STD::__sort5<_Compare>(__first, __first + __delta, __m, __m+__delta, __lm1, __comp); 3169*3e519524SHoward Hinnant } 3170*3e519524SHoward Hinnant else 3171*3e519524SHoward Hinnant { 3172*3e519524SHoward Hinnant __delta = __len/2; 3173*3e519524SHoward Hinnant __m += __delta; 3174*3e519524SHoward Hinnant __n_swaps = _STD::__sort3<_Compare>(__first, __m, __lm1, __comp); 3175*3e519524SHoward Hinnant } 3176*3e519524SHoward Hinnant } 3177*3e519524SHoward Hinnant // *__m is median 3178*3e519524SHoward Hinnant // partition [__first, __m) < *__m and *__m <= [__m, __last) 3179*3e519524SHoward Hinnant // (this inhibits tossing elements equivalent to __m around unnecessarily) 3180*3e519524SHoward Hinnant _RandomAccessIterator __i = __first; 3181*3e519524SHoward Hinnant _RandomAccessIterator __j = __lm1; 3182*3e519524SHoward Hinnant // j points beyond range to be tested, *__m is known to be <= *__lm1 3183*3e519524SHoward Hinnant // The search going up is known to be guarded but the search coming down isn't. 3184*3e519524SHoward Hinnant // Prime the downward search with a guard. 3185*3e519524SHoward Hinnant if (!__comp(*__i, *__m)) // if *__first == *__m 3186*3e519524SHoward Hinnant { 3187*3e519524SHoward Hinnant // *__first == *__m, *__first doesn't go in first part 3188*3e519524SHoward Hinnant // manually guard downward moving __j against __i 3189*3e519524SHoward Hinnant while (true) 3190*3e519524SHoward Hinnant { 3191*3e519524SHoward Hinnant if (__i == --__j) 3192*3e519524SHoward Hinnant { 3193*3e519524SHoward Hinnant // *__first == *__m, *__m <= all other elements 3194*3e519524SHoward Hinnant // Parition instead into [__first, __i) == *__first and *__first < [__i, __last) 3195*3e519524SHoward Hinnant ++__i; // __first + 1 3196*3e519524SHoward Hinnant __j = __last; 3197*3e519524SHoward Hinnant if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1) 3198*3e519524SHoward Hinnant { 3199*3e519524SHoward Hinnant while (true) 3200*3e519524SHoward Hinnant { 3201*3e519524SHoward Hinnant if (__i == __j) 3202*3e519524SHoward Hinnant return; // [__first, __last) all equivalent elements 3203*3e519524SHoward Hinnant if (__comp(*__first, *__i)) 3204*3e519524SHoward Hinnant { 3205*3e519524SHoward Hinnant swap(*__i, *__j); 3206*3e519524SHoward Hinnant ++__n_swaps; 3207*3e519524SHoward Hinnant ++__i; 3208*3e519524SHoward Hinnant break; 3209*3e519524SHoward Hinnant } 3210*3e519524SHoward Hinnant ++__i; 3211*3e519524SHoward Hinnant } 3212*3e519524SHoward Hinnant } 3213*3e519524SHoward Hinnant // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1 3214*3e519524SHoward Hinnant if (__i == __j) 3215*3e519524SHoward Hinnant return; 3216*3e519524SHoward Hinnant while (true) 3217*3e519524SHoward Hinnant { 3218*3e519524SHoward Hinnant while (!__comp(*__first, *__i)) 3219*3e519524SHoward Hinnant ++__i; 3220*3e519524SHoward Hinnant while (__comp(*__first, *--__j)) 3221*3e519524SHoward Hinnant ; 3222*3e519524SHoward Hinnant if (__i >= __j) 3223*3e519524SHoward Hinnant break; 3224*3e519524SHoward Hinnant swap(*__i, *__j); 3225*3e519524SHoward Hinnant ++__n_swaps; 3226*3e519524SHoward Hinnant ++__i; 3227*3e519524SHoward Hinnant } 3228*3e519524SHoward Hinnant // [__first, __i) == *__first and *__first < [__i, __last) 3229*3e519524SHoward Hinnant // The first part is sorted, sort the secod part 3230*3e519524SHoward Hinnant // _STD::__sort<_Compare>(__i, __last, __comp); 3231*3e519524SHoward Hinnant __first = __i; 3232*3e519524SHoward Hinnant goto __restart; 3233*3e519524SHoward Hinnant } 3234*3e519524SHoward Hinnant if (__comp(*__j, *__m)) 3235*3e519524SHoward Hinnant { 3236*3e519524SHoward Hinnant swap(*__i, *__j); 3237*3e519524SHoward Hinnant ++__n_swaps; 3238*3e519524SHoward Hinnant break; // found guard for downward moving __j, now use unguarded partition 3239*3e519524SHoward Hinnant } 3240*3e519524SHoward Hinnant } 3241*3e519524SHoward Hinnant } 3242*3e519524SHoward Hinnant // It is known that *__i < *__m 3243*3e519524SHoward Hinnant ++__i; 3244*3e519524SHoward Hinnant // j points beyond range to be tested, *__m is known to be <= *__lm1 3245*3e519524SHoward Hinnant // if not yet partitioned... 3246*3e519524SHoward Hinnant if (__i < __j) 3247*3e519524SHoward Hinnant { 3248*3e519524SHoward Hinnant // known that *(__i - 1) < *__m 3249*3e519524SHoward Hinnant // known that __i <= __m 3250*3e519524SHoward Hinnant while (true) 3251*3e519524SHoward Hinnant { 3252*3e519524SHoward Hinnant // __m still guards upward moving __i 3253*3e519524SHoward Hinnant while (__comp(*__i, *__m)) 3254*3e519524SHoward Hinnant ++__i; 3255*3e519524SHoward Hinnant // It is now known that a guard exists for downward moving __j 3256*3e519524SHoward Hinnant while (!__comp(*--__j, *__m)) 3257*3e519524SHoward Hinnant ; 3258*3e519524SHoward Hinnant if (__i > __j) 3259*3e519524SHoward Hinnant break; 3260*3e519524SHoward Hinnant swap(*__i, *__j); 3261*3e519524SHoward Hinnant ++__n_swaps; 3262*3e519524SHoward Hinnant // It is known that __m != __j 3263*3e519524SHoward Hinnant // If __m just moved, follow it 3264*3e519524SHoward Hinnant if (__m == __i) 3265*3e519524SHoward Hinnant __m = __j; 3266*3e519524SHoward Hinnant ++__i; 3267*3e519524SHoward Hinnant } 3268*3e519524SHoward Hinnant } 3269*3e519524SHoward Hinnant // [__first, __i) < *__m and *__m <= [__i, __last) 3270*3e519524SHoward Hinnant if (__i != __m && __comp(*__m, *__i)) 3271*3e519524SHoward Hinnant { 3272*3e519524SHoward Hinnant swap(*__i, *__m); 3273*3e519524SHoward Hinnant ++__n_swaps; 3274*3e519524SHoward Hinnant } 3275*3e519524SHoward Hinnant // [__first, __i) < *__i and *__i <= [__i+1, __last) 3276*3e519524SHoward Hinnant // If we were given a perfect partition, see if insertion sort is quick... 3277*3e519524SHoward Hinnant if (__n_swaps == 0) 3278*3e519524SHoward Hinnant { 3279*3e519524SHoward Hinnant bool __fs = _STD::__insertion_sort_incomplete<_Compare>(__first, __i, __comp); 3280*3e519524SHoward Hinnant if (_STD::__insertion_sort_incomplete<_Compare>(__i+1, __last, __comp)) 3281*3e519524SHoward Hinnant { 3282*3e519524SHoward Hinnant if (__fs) 3283*3e519524SHoward Hinnant return; 3284*3e519524SHoward Hinnant __last = __i; 3285*3e519524SHoward Hinnant continue; 3286*3e519524SHoward Hinnant } 3287*3e519524SHoward Hinnant else 3288*3e519524SHoward Hinnant { 3289*3e519524SHoward Hinnant if (__fs) 3290*3e519524SHoward Hinnant { 3291*3e519524SHoward Hinnant __first = ++__i; 3292*3e519524SHoward Hinnant continue; 3293*3e519524SHoward Hinnant } 3294*3e519524SHoward Hinnant } 3295*3e519524SHoward Hinnant } 3296*3e519524SHoward Hinnant // sort smaller range with recursive call and larger with tail recursion elimination 3297*3e519524SHoward Hinnant if (__i - __first < __last - __i) 3298*3e519524SHoward Hinnant { 3299*3e519524SHoward Hinnant _STD::__sort<_Compare>(__first, __i, __comp); 3300*3e519524SHoward Hinnant // _STD::__sort<_Compare>(__i+1, __last, __comp); 3301*3e519524SHoward Hinnant __first = ++__i; 3302*3e519524SHoward Hinnant } 3303*3e519524SHoward Hinnant else 3304*3e519524SHoward Hinnant { 3305*3e519524SHoward Hinnant _STD::__sort<_Compare>(__i+1, __last, __comp); 3306*3e519524SHoward Hinnant // _STD::__sort<_Compare>(__first, __i, __comp); 3307*3e519524SHoward Hinnant __last = __i; 3308*3e519524SHoward Hinnant } 3309*3e519524SHoward Hinnant } 3310*3e519524SHoward Hinnant} 3311*3e519524SHoward Hinnant 3312*3e519524SHoward Hinnant// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare 3313*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 3314*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3315*3e519524SHoward Hinnantvoid 3316*3e519524SHoward Hinnantsort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 3317*3e519524SHoward Hinnant{ 3318*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3319*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3320*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3321*3e519524SHoward Hinnant __sort<_Comp_ref>(__first, __last, __c); 3322*3e519524SHoward Hinnant#else 3323*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3324*3e519524SHoward Hinnant __sort<_Comp_ref>(__first, __last, __comp); 3325*3e519524SHoward Hinnant#endif 3326*3e519524SHoward Hinnant} 3327*3e519524SHoward Hinnant 3328*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 3329*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3330*3e519524SHoward Hinnantvoid 3331*3e519524SHoward Hinnantsort(_RandomAccessIterator __first, _RandomAccessIterator __last) 3332*3e519524SHoward Hinnant{ 3333*3e519524SHoward Hinnant _STD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 3334*3e519524SHoward Hinnant} 3335*3e519524SHoward Hinnant 3336*3e519524SHoward Hinnanttemplate <class _Tp> 3337*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3338*3e519524SHoward Hinnantvoid 3339*3e519524SHoward Hinnantsort(_Tp** __first, _Tp** __last) 3340*3e519524SHoward Hinnant{ 3341*3e519524SHoward Hinnant _STD::sort((size_t*)__first, (size_t*)__last, __less<size_t>()); 3342*3e519524SHoward Hinnant} 3343*3e519524SHoward Hinnant 3344*3e519524SHoward Hinnanttemplate <class _Tp> 3345*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3346*3e519524SHoward Hinnantvoid 3347*3e519524SHoward Hinnantsort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last) 3348*3e519524SHoward Hinnant{ 3349*3e519524SHoward Hinnant _STD::sort(__first.base(), __last.base()); 3350*3e519524SHoward Hinnant} 3351*3e519524SHoward Hinnant 3352*3e519524SHoward Hinnantextern template void __sort<__less<char>&, char*>(char*, char*, __less<char>&); 3353*3e519524SHoward Hinnantextern template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&); 3354*3e519524SHoward Hinnantextern template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&); 3355*3e519524SHoward Hinnantextern template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&); 3356*3e519524SHoward Hinnantextern template void __sort<__less<short>&, short*>(short*, short*, __less<short>&); 3357*3e519524SHoward Hinnantextern template void __sort<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&); 3358*3e519524SHoward Hinnantextern template void __sort<__less<int>&, int*>(int*, int*, __less<int>&); 3359*3e519524SHoward Hinnantextern template void __sort<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&); 3360*3e519524SHoward Hinnantextern template void __sort<__less<long>&, long*>(long*, long*, __less<long>&); 3361*3e519524SHoward Hinnantextern template void __sort<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&); 3362*3e519524SHoward Hinnantextern template void __sort<__less<long long>&, long long*>(long long*, long long*, __less<long long>&); 3363*3e519524SHoward Hinnantextern template void __sort<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&); 3364*3e519524SHoward Hinnantextern template void __sort<__less<float>&, float*>(float*, float*, __less<float>&); 3365*3e519524SHoward Hinnantextern template void __sort<__less<double>&, double*>(double*, double*, __less<double>&); 3366*3e519524SHoward Hinnantextern template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&); 3367*3e519524SHoward Hinnant 3368*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&); 3369*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&); 3370*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&); 3371*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&); 3372*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&); 3373*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned short>&, unsigned short*>(unsigned short*, unsigned short*, __less<unsigned short>&); 3374*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<int>&, int*>(int*, int*, __less<int>&); 3375*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned>&, unsigned*>(unsigned*, unsigned*, __less<unsigned>&); 3376*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<long>&, long*>(long*, long*, __less<long>&); 3377*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned long>&, unsigned long*>(unsigned long*, unsigned long*, __less<unsigned long>&); 3378*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<long long>&, long long*>(long long*, long long*, __less<long long>&); 3379*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<unsigned long long>&, unsigned long long*>(unsigned long long*, unsigned long long*, __less<unsigned long long>&); 3380*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<float>&, float*>(float*, float*, __less<float>&); 3381*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<double>&, double*>(double*, double*, __less<double>&); 3382*3e519524SHoward Hinnantextern template bool __insertion_sort_incomplete<__less<long double>&, long double*>(long double*, long double*, __less<long double>&); 3383*3e519524SHoward Hinnant 3384*3e519524SHoward Hinnantextern template unsigned __sort5<__less<long double>&, long double*>(long double*, long double*, long double*, long double*, long double*, __less<long double>&); 3385*3e519524SHoward Hinnant 3386*3e519524SHoward Hinnant// lower_bound 3387*3e519524SHoward Hinnant 3388*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp> 3389*3e519524SHoward Hinnant_ForwardIterator 3390*3e519524SHoward Hinnant__lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3391*3e519524SHoward Hinnant{ 3392*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; 3393*3e519524SHoward Hinnant difference_type __len = _STD::distance(__first, __last); 3394*3e519524SHoward Hinnant while (__len != 0) 3395*3e519524SHoward Hinnant { 3396*3e519524SHoward Hinnant difference_type __l2 = __len / 2; 3397*3e519524SHoward Hinnant _ForwardIterator __m = __first; 3398*3e519524SHoward Hinnant _STD::advance(__m, __l2); 3399*3e519524SHoward Hinnant if (__comp(*__m, __value)) 3400*3e519524SHoward Hinnant { 3401*3e519524SHoward Hinnant __first = ++__m; 3402*3e519524SHoward Hinnant __len -= __l2 + 1; 3403*3e519524SHoward Hinnant } 3404*3e519524SHoward Hinnant else 3405*3e519524SHoward Hinnant __len = __l2; 3406*3e519524SHoward Hinnant } 3407*3e519524SHoward Hinnant return __first; 3408*3e519524SHoward Hinnant} 3409*3e519524SHoward Hinnant 3410*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare> 3411*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3412*3e519524SHoward Hinnant_ForwardIterator 3413*3e519524SHoward Hinnantlower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3414*3e519524SHoward Hinnant{ 3415*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3416*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3417*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3418*3e519524SHoward Hinnant return __lower_bound<_Comp_ref>(__first, __last, __value, __c); 3419*3e519524SHoward Hinnant#else 3420*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3421*3e519524SHoward Hinnant return __lower_bound<_Comp_ref>(__first, __last, __value, __comp); 3422*3e519524SHoward Hinnant#endif 3423*3e519524SHoward Hinnant} 3424*3e519524SHoward Hinnant 3425*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 3426*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3427*3e519524SHoward Hinnant_ForwardIterator 3428*3e519524SHoward Hinnantlower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) 3429*3e519524SHoward Hinnant{ 3430*3e519524SHoward Hinnant return _STD::lower_bound(__first, __last, __value, 3431*3e519524SHoward Hinnant __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>()); 3432*3e519524SHoward Hinnant} 3433*3e519524SHoward Hinnant 3434*3e519524SHoward Hinnant// upper_bound 3435*3e519524SHoward Hinnant 3436*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp> 3437*3e519524SHoward Hinnant_ForwardIterator 3438*3e519524SHoward Hinnant__upper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3439*3e519524SHoward Hinnant{ 3440*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; 3441*3e519524SHoward Hinnant difference_type __len = _STD::distance(__first, __last); 3442*3e519524SHoward Hinnant while (__len != 0) 3443*3e519524SHoward Hinnant { 3444*3e519524SHoward Hinnant difference_type __l2 = __len / 2; 3445*3e519524SHoward Hinnant _ForwardIterator __m = __first; 3446*3e519524SHoward Hinnant _STD::advance(__m, __l2); 3447*3e519524SHoward Hinnant if (__comp(__value, *__m)) 3448*3e519524SHoward Hinnant __len = __l2; 3449*3e519524SHoward Hinnant else 3450*3e519524SHoward Hinnant { 3451*3e519524SHoward Hinnant __first = ++__m; 3452*3e519524SHoward Hinnant __len -= __l2 + 1; 3453*3e519524SHoward Hinnant } 3454*3e519524SHoward Hinnant } 3455*3e519524SHoward Hinnant return __first; 3456*3e519524SHoward Hinnant} 3457*3e519524SHoward Hinnant 3458*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare> 3459*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3460*3e519524SHoward Hinnant_ForwardIterator 3461*3e519524SHoward Hinnantupper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3462*3e519524SHoward Hinnant{ 3463*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3464*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3465*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3466*3e519524SHoward Hinnant return __upper_bound<_Comp_ref>(__first, __last, __value, __c); 3467*3e519524SHoward Hinnant#else 3468*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3469*3e519524SHoward Hinnant return __upper_bound<_Comp_ref>(__first, __last, __value, __comp); 3470*3e519524SHoward Hinnant#endif 3471*3e519524SHoward Hinnant} 3472*3e519524SHoward Hinnant 3473*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 3474*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3475*3e519524SHoward Hinnant_ForwardIterator 3476*3e519524SHoward Hinnantupper_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) 3477*3e519524SHoward Hinnant{ 3478*3e519524SHoward Hinnant return _STD::upper_bound(__first, __last, __value, 3479*3e519524SHoward Hinnant __less<_Tp, typename iterator_traits<_ForwardIterator>::value_type>()); 3480*3e519524SHoward Hinnant} 3481*3e519524SHoward Hinnant 3482*3e519524SHoward Hinnant// equal_range 3483*3e519524SHoward Hinnant 3484*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp> 3485*3e519524SHoward Hinnantpair<_ForwardIterator, _ForwardIterator> 3486*3e519524SHoward Hinnant__equal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3487*3e519524SHoward Hinnant{ 3488*3e519524SHoward Hinnant typedef typename iterator_traits<_ForwardIterator>::difference_type difference_type; 3489*3e519524SHoward Hinnant difference_type __len = _STD::distance(__first, __last); 3490*3e519524SHoward Hinnant while (__len != 0) 3491*3e519524SHoward Hinnant { 3492*3e519524SHoward Hinnant difference_type __l2 = __len / 2; 3493*3e519524SHoward Hinnant _ForwardIterator __m = __first; 3494*3e519524SHoward Hinnant _STD::advance(__m, __l2); 3495*3e519524SHoward Hinnant if (__comp(*__m, __value)) 3496*3e519524SHoward Hinnant { 3497*3e519524SHoward Hinnant __first = ++__m; 3498*3e519524SHoward Hinnant __len -= __l2 + 1; 3499*3e519524SHoward Hinnant } 3500*3e519524SHoward Hinnant else if (__comp(__value, *__m)) 3501*3e519524SHoward Hinnant { 3502*3e519524SHoward Hinnant __last = __m; 3503*3e519524SHoward Hinnant __len = __l2; 3504*3e519524SHoward Hinnant } 3505*3e519524SHoward Hinnant else 3506*3e519524SHoward Hinnant { 3507*3e519524SHoward Hinnant _ForwardIterator __mp1 = __m; 3508*3e519524SHoward Hinnant return pair<_ForwardIterator, _ForwardIterator> 3509*3e519524SHoward Hinnant ( 3510*3e519524SHoward Hinnant __lower_bound<_Compare>(__first, __m, __value, __comp), 3511*3e519524SHoward Hinnant __upper_bound<_Compare>(++__mp1, __last, __value, __comp) 3512*3e519524SHoward Hinnant ); 3513*3e519524SHoward Hinnant } 3514*3e519524SHoward Hinnant } 3515*3e519524SHoward Hinnant return pair<_ForwardIterator, _ForwardIterator>(__first, __first); 3516*3e519524SHoward Hinnant} 3517*3e519524SHoward Hinnant 3518*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare> 3519*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3520*3e519524SHoward Hinnantpair<_ForwardIterator, _ForwardIterator> 3521*3e519524SHoward Hinnantequal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3522*3e519524SHoward Hinnant{ 3523*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3524*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3525*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3526*3e519524SHoward Hinnant return __equal_range<_Comp_ref>(__first, __last, __value, __c); 3527*3e519524SHoward Hinnant#else 3528*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3529*3e519524SHoward Hinnant return __equal_range<_Comp_ref>(__first, __last, __value, __comp); 3530*3e519524SHoward Hinnant#endif 3531*3e519524SHoward Hinnant} 3532*3e519524SHoward Hinnant 3533*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 3534*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3535*3e519524SHoward Hinnantpair<_ForwardIterator, _ForwardIterator> 3536*3e519524SHoward Hinnantequal_range(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) 3537*3e519524SHoward Hinnant{ 3538*3e519524SHoward Hinnant return _STD::equal_range(__first, __last, __value, 3539*3e519524SHoward Hinnant __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>()); 3540*3e519524SHoward Hinnant} 3541*3e519524SHoward Hinnant 3542*3e519524SHoward Hinnant// binary_search 3543*3e519524SHoward Hinnant 3544*3e519524SHoward Hinnanttemplate <class _Compare, class _ForwardIterator, class _Tp> 3545*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3546*3e519524SHoward Hinnantbool 3547*3e519524SHoward Hinnant__binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3548*3e519524SHoward Hinnant{ 3549*3e519524SHoward Hinnant __first = __lower_bound<_Compare>(__first, __last, __value, __comp); 3550*3e519524SHoward Hinnant return __first != __last && !__comp(__value, *__first); 3551*3e519524SHoward Hinnant} 3552*3e519524SHoward Hinnant 3553*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp, class _Compare> 3554*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3555*3e519524SHoward Hinnantbool 3556*3e519524SHoward Hinnantbinary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value, _Compare __comp) 3557*3e519524SHoward Hinnant{ 3558*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3559*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3560*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3561*3e519524SHoward Hinnant return __binary_search<_Comp_ref>(__first, __last, __value, __c); 3562*3e519524SHoward Hinnant#else 3563*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3564*3e519524SHoward Hinnant return __binary_search<_Comp_ref>(__first, __last, __value, __comp); 3565*3e519524SHoward Hinnant#endif 3566*3e519524SHoward Hinnant} 3567*3e519524SHoward Hinnant 3568*3e519524SHoward Hinnanttemplate <class _ForwardIterator, class _Tp> 3569*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3570*3e519524SHoward Hinnantbool 3571*3e519524SHoward Hinnantbinary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) 3572*3e519524SHoward Hinnant{ 3573*3e519524SHoward Hinnant return _STD::binary_search(__first, __last, __value, 3574*3e519524SHoward Hinnant __less<typename iterator_traits<_ForwardIterator>::value_type, _Tp>()); 3575*3e519524SHoward Hinnant} 3576*3e519524SHoward Hinnant 3577*3e519524SHoward Hinnant// merge 3578*3e519524SHoward Hinnant 3579*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> 3580*3e519524SHoward Hinnant_OutputIterator 3581*3e519524SHoward Hinnant__merge(_InputIterator1 __first1, _InputIterator1 __last1, 3582*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 3583*3e519524SHoward Hinnant{ 3584*3e519524SHoward Hinnant for (; __first1 != __last1; ++__result) 3585*3e519524SHoward Hinnant { 3586*3e519524SHoward Hinnant if (__first2 == __last2) 3587*3e519524SHoward Hinnant return _STD::copy(__first1, __last1, __result); 3588*3e519524SHoward Hinnant if (__comp(*__first2, *__first1)) 3589*3e519524SHoward Hinnant { 3590*3e519524SHoward Hinnant *__result = *__first2; 3591*3e519524SHoward Hinnant ++__first2; 3592*3e519524SHoward Hinnant } 3593*3e519524SHoward Hinnant else 3594*3e519524SHoward Hinnant { 3595*3e519524SHoward Hinnant *__result = *__first1; 3596*3e519524SHoward Hinnant ++__first1; 3597*3e519524SHoward Hinnant } 3598*3e519524SHoward Hinnant } 3599*3e519524SHoward Hinnant return _STD::copy(__first2, __last2, __result); 3600*3e519524SHoward Hinnant} 3601*3e519524SHoward Hinnant 3602*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> 3603*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3604*3e519524SHoward Hinnant_OutputIterator 3605*3e519524SHoward Hinnantmerge(_InputIterator1 __first1, _InputIterator1 __last1, 3606*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 3607*3e519524SHoward Hinnant{ 3608*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3609*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3610*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3611*3e519524SHoward Hinnant return _STD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); 3612*3e519524SHoward Hinnant#else 3613*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3614*3e519524SHoward Hinnant return _STD::__merge<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); 3615*3e519524SHoward Hinnant#endif 3616*3e519524SHoward Hinnant} 3617*3e519524SHoward Hinnant 3618*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator> 3619*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3620*3e519524SHoward Hinnant_OutputIterator 3621*3e519524SHoward Hinnantmerge(_InputIterator1 __first1, _InputIterator1 __last1, 3622*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) 3623*3e519524SHoward Hinnant{ 3624*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator1>::value_type __v1; 3625*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator2>::value_type __v2; 3626*3e519524SHoward Hinnant return merge(__first1, __last1, __first2, __last2, __result, __less<__v1, __v2>()); 3627*3e519524SHoward Hinnant} 3628*3e519524SHoward Hinnant 3629*3e519524SHoward Hinnant// inplace_merge 3630*3e519524SHoward Hinnant 3631*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator> 3632*3e519524SHoward Hinnantvoid 3633*3e519524SHoward Hinnant__buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, 3634*3e519524SHoward Hinnant _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1, 3635*3e519524SHoward Hinnant typename iterator_traits<_BidirectionalIterator>::difference_type __len2, 3636*3e519524SHoward Hinnant typename iterator_traits<_BidirectionalIterator>::value_type* __buff) 3637*3e519524SHoward Hinnant{ 3638*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; 3639*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; 3640*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::pointer pointer; 3641*3e519524SHoward Hinnant __destruct_n __d(0); 3642*3e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h2(__buff, __d); 3643*3e519524SHoward Hinnant if (__len1 <= __len2) 3644*3e519524SHoward Hinnant { 3645*3e519524SHoward Hinnant value_type* __p = __buff; 3646*3e519524SHoward Hinnant for (_BidirectionalIterator __i = __first; __i != __middle; __d.__incr((value_type*)0), ++__i, ++__p) 3647*3e519524SHoward Hinnant ::new(__p) value_type(_STD::move(*__i)); 3648*3e519524SHoward Hinnant __merge<_Compare>(move_iterator<value_type*>(__buff), 3649*3e519524SHoward Hinnant move_iterator<value_type*>(__p), 3650*3e519524SHoward Hinnant move_iterator<_BidirectionalIterator>(__middle), 3651*3e519524SHoward Hinnant move_iterator<_BidirectionalIterator>(__last), 3652*3e519524SHoward Hinnant __first, __comp); 3653*3e519524SHoward Hinnant } 3654*3e519524SHoward Hinnant else 3655*3e519524SHoward Hinnant { 3656*3e519524SHoward Hinnant value_type* __p = __buff; 3657*3e519524SHoward Hinnant for (_BidirectionalIterator __i = __middle; __i != __last; __d.__incr((value_type*)0), ++__i, ++__p) 3658*3e519524SHoward Hinnant ::new(__p) value_type(_STD::move(*__i)); 3659*3e519524SHoward Hinnant typedef reverse_iterator<_BidirectionalIterator> _RBi; 3660*3e519524SHoward Hinnant typedef reverse_iterator<value_type*> _Rv; 3661*3e519524SHoward Hinnant __merge(move_iterator<_RBi>(_RBi(__middle)), move_iterator<_RBi>(_RBi(__first)), 3662*3e519524SHoward Hinnant move_iterator<_Rv>(_Rv(__p)), move_iterator<_Rv>(_Rv(__buff)), 3663*3e519524SHoward Hinnant _RBi(__last), __negate<_Compare>(__comp)); 3664*3e519524SHoward Hinnant } 3665*3e519524SHoward Hinnant} 3666*3e519524SHoward Hinnant 3667*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator> 3668*3e519524SHoward Hinnantvoid 3669*3e519524SHoward Hinnant__inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, 3670*3e519524SHoward Hinnant _Compare __comp, typename iterator_traits<_BidirectionalIterator>::difference_type __len1, 3671*3e519524SHoward Hinnant typename iterator_traits<_BidirectionalIterator>::difference_type __len2, 3672*3e519524SHoward Hinnant typename iterator_traits<_BidirectionalIterator>::value_type* __buff, ptrdiff_t __buff_size) 3673*3e519524SHoward Hinnant{ 3674*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; 3675*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; 3676*3e519524SHoward Hinnant while (true) 3677*3e519524SHoward Hinnant { 3678*3e519524SHoward Hinnant // if __middle == __last, we're done 3679*3e519524SHoward Hinnant if (__len2 == 0) 3680*3e519524SHoward Hinnant return; 3681*3e519524SHoward Hinnant // shrink [__first, __middle) as much as possible (with no moves), returning if it shrinks to 0 3682*3e519524SHoward Hinnant for (; true; ++__first, --__len1) 3683*3e519524SHoward Hinnant { 3684*3e519524SHoward Hinnant if (__len1 == 0) 3685*3e519524SHoward Hinnant return; 3686*3e519524SHoward Hinnant if (__comp(*__middle, *__first)) 3687*3e519524SHoward Hinnant break; 3688*3e519524SHoward Hinnant } 3689*3e519524SHoward Hinnant if (__len1 <= __buff_size || __len2 <= __buff_size) 3690*3e519524SHoward Hinnant { 3691*3e519524SHoward Hinnant __buffered_inplace_merge<_Compare>(__first, __middle, __last, __comp, __len1, __len2, __buff); 3692*3e519524SHoward Hinnant return; 3693*3e519524SHoward Hinnant } 3694*3e519524SHoward Hinnant // __first < __middle < __last 3695*3e519524SHoward Hinnant // *__first > *__middle 3696*3e519524SHoward Hinnant // partition [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) such that 3697*3e519524SHoward Hinnant // all elements in: 3698*3e519524SHoward Hinnant // [__first, __m1) <= [__middle, __m2) 3699*3e519524SHoward Hinnant // [__middle, __m2) < [__m1, __middle) 3700*3e519524SHoward Hinnant // [__m1, __middle) <= [__m2, __last) 3701*3e519524SHoward Hinnant // and __m1 or __m2 is in the middle of its range 3702*3e519524SHoward Hinnant _BidirectionalIterator __m1; // "median" of [__first, __middle) 3703*3e519524SHoward Hinnant _BidirectionalIterator __m2; // "median" of [__middle, __last) 3704*3e519524SHoward Hinnant difference_type __len11; // distance(__first, __m1) 3705*3e519524SHoward Hinnant difference_type __len21; // distance(__middle, __m2) 3706*3e519524SHoward Hinnant // binary search smaller range 3707*3e519524SHoward Hinnant if (__len1 < __len2) 3708*3e519524SHoward Hinnant { // __len >= 1, __len2 >= 2 3709*3e519524SHoward Hinnant __len21 = __len2 / 2; 3710*3e519524SHoward Hinnant __m2 = __middle; 3711*3e519524SHoward Hinnant _STD::advance(__m2, __len21); 3712*3e519524SHoward Hinnant __m1 = __upper_bound<_Compare>(__first, __middle, *__m2, __comp); 3713*3e519524SHoward Hinnant __len11 = _STD::distance(__first, __m1); 3714*3e519524SHoward Hinnant } 3715*3e519524SHoward Hinnant else 3716*3e519524SHoward Hinnant { 3717*3e519524SHoward Hinnant if (__len1 == 1) 3718*3e519524SHoward Hinnant { // __len1 >= __len2 && __len2 > 0, therefore __len2 == 1 3719*3e519524SHoward Hinnant // It is known *__first > *__middle 3720*3e519524SHoward Hinnant swap(*__first, *__middle); 3721*3e519524SHoward Hinnant return; 3722*3e519524SHoward Hinnant } 3723*3e519524SHoward Hinnant // __len1 >= 2, __len2 >= 1 3724*3e519524SHoward Hinnant __len11 = __len1 / 2; 3725*3e519524SHoward Hinnant __m1 = __first; 3726*3e519524SHoward Hinnant _STD::advance(__m1, __len11); 3727*3e519524SHoward Hinnant __m2 = __lower_bound<_Compare>(__middle, __last, *__m1, __comp); 3728*3e519524SHoward Hinnant __len21 = _STD::distance(__middle, __m2); 3729*3e519524SHoward Hinnant } 3730*3e519524SHoward Hinnant difference_type __len12 = __len1 - __len11; // distance(__m1, __middle) 3731*3e519524SHoward Hinnant difference_type __len22 = __len2 - __len21; // distance(__m2, __last) 3732*3e519524SHoward Hinnant // [__first, __m1) [__m1, __middle) [__middle, __m2) [__m2, __last) 3733*3e519524SHoward Hinnant // swap middle two partitions 3734*3e519524SHoward Hinnant __middle = _STD::rotate(__m1, __middle, __m2); 3735*3e519524SHoward Hinnant // __len12 and __len21 now have swapped meanings 3736*3e519524SHoward Hinnant // merge smaller range with recurisve call and larger with tail recursion elimination 3737*3e519524SHoward Hinnant if (__len11 + __len21 < __len12 + __len22) 3738*3e519524SHoward Hinnant { 3739*3e519524SHoward Hinnant __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size); 3740*3e519524SHoward Hinnant// __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size); 3741*3e519524SHoward Hinnant __first = __middle; 3742*3e519524SHoward Hinnant __middle = __m2; 3743*3e519524SHoward Hinnant __len1 = __len12; 3744*3e519524SHoward Hinnant __len2 = __len22; 3745*3e519524SHoward Hinnant } 3746*3e519524SHoward Hinnant else 3747*3e519524SHoward Hinnant { 3748*3e519524SHoward Hinnant __inplace_merge<_Compare>(__middle, __m2, __last, __comp, __len12, __len22, __buff, __buff_size); 3749*3e519524SHoward Hinnant// __inplace_merge<_Compare>(__first, __m1, __middle, __comp, __len11, __len21, __buff, __buff_size); 3750*3e519524SHoward Hinnant __last = __middle; 3751*3e519524SHoward Hinnant __middle = __m1; 3752*3e519524SHoward Hinnant __len1 = __len11; 3753*3e519524SHoward Hinnant __len2 = __len21; 3754*3e519524SHoward Hinnant } 3755*3e519524SHoward Hinnant } 3756*3e519524SHoward Hinnant} 3757*3e519524SHoward Hinnant 3758*3e519524SHoward Hinnanttemplate <class _Tp> 3759*3e519524SHoward Hinnantstruct __inplace_merge_switch 3760*3e519524SHoward Hinnant{ 3761*3e519524SHoward Hinnant static const unsigned value = has_trivial_copy_assign<_Tp>::value; 3762*3e519524SHoward Hinnant}; 3763*3e519524SHoward Hinnant 3764*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _Compare> 3765*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3766*3e519524SHoward Hinnantvoid 3767*3e519524SHoward Hinnantinplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last, 3768*3e519524SHoward Hinnant _Compare __comp) 3769*3e519524SHoward Hinnant{ 3770*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type; 3771*3e519524SHoward Hinnant typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type; 3772*3e519524SHoward Hinnant difference_type __len1 = _STD::distance(__first, __middle); 3773*3e519524SHoward Hinnant difference_type __len2 = _STD::distance(__middle, __last); 3774*3e519524SHoward Hinnant difference_type __buf_size = _STD::min(__len1, __len2); 3775*3e519524SHoward Hinnant pair<value_type*, ptrdiff_t> __buf(0, 0); 3776*3e519524SHoward Hinnant unique_ptr<value_type, __return_temporary_buffer> __h; 3777*3e519524SHoward Hinnant if (__inplace_merge_switch<value_type>::value && __buf_size > 8) 3778*3e519524SHoward Hinnant { 3779*3e519524SHoward Hinnant __buf = _STD::get_temporary_buffer<value_type>(__buf_size); 3780*3e519524SHoward Hinnant __h.reset(__buf.first); 3781*3e519524SHoward Hinnant } 3782*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3783*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3784*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3785*3e519524SHoward Hinnant return _STD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __c, __len1, __len2, 3786*3e519524SHoward Hinnant __buf.first, __buf.second); 3787*3e519524SHoward Hinnant#else 3788*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3789*3e519524SHoward Hinnant return _STD::__inplace_merge<_Comp_ref>(__first, __middle, __last, __comp, __len1, __len2, 3790*3e519524SHoward Hinnant __buf.first, __buf.second); 3791*3e519524SHoward Hinnant#endif 3792*3e519524SHoward Hinnant} 3793*3e519524SHoward Hinnant 3794*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator> 3795*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3796*3e519524SHoward Hinnantvoid 3797*3e519524SHoward Hinnantinplace_merge(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last) 3798*3e519524SHoward Hinnant{ 3799*3e519524SHoward Hinnant _STD::inplace_merge(__first, __middle, __last, 3800*3e519524SHoward Hinnant __less<typename iterator_traits<_BidirectionalIterator>::value_type>()); 3801*3e519524SHoward Hinnant} 3802*3e519524SHoward Hinnant 3803*3e519524SHoward Hinnant// stable_sort 3804*3e519524SHoward Hinnant 3805*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2> 3806*3e519524SHoward Hinnantvoid 3807*3e519524SHoward Hinnant__merge_move_construct(_InputIterator1 __first1, _InputIterator1 __last1, 3808*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, 3809*3e519524SHoward Hinnant typename iterator_traits<_InputIterator1>::value_type* __result, _Compare __comp) 3810*3e519524SHoward Hinnant{ 3811*3e519524SHoward Hinnant typedef typename iterator_traits<_InputIterator1>::value_type value_type; 3812*3e519524SHoward Hinnant __destruct_n __d(0); 3813*3e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h(__result, __d); 3814*3e519524SHoward Hinnant for (; true; ++__result) 3815*3e519524SHoward Hinnant { 3816*3e519524SHoward Hinnant if (__first1 == __last1) 3817*3e519524SHoward Hinnant { 3818*3e519524SHoward Hinnant for (; __first2 != __last2; ++__first2, ++__result, __d.__incr((value_type*)0)) 3819*3e519524SHoward Hinnant ::new (__result) value_type(_STD::move(*__first2)); 3820*3e519524SHoward Hinnant __h.release(); 3821*3e519524SHoward Hinnant return; 3822*3e519524SHoward Hinnant } 3823*3e519524SHoward Hinnant if (__first2 == __last2) 3824*3e519524SHoward Hinnant { 3825*3e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__result, __d.__incr((value_type*)0)) 3826*3e519524SHoward Hinnant ::new (__result) value_type(_STD::move(*__first1)); 3827*3e519524SHoward Hinnant __h.release(); 3828*3e519524SHoward Hinnant return; 3829*3e519524SHoward Hinnant } 3830*3e519524SHoward Hinnant if (__comp(*__first2, *__first1)) 3831*3e519524SHoward Hinnant { 3832*3e519524SHoward Hinnant ::new (__result) value_type(_STD::move(*__first2)); 3833*3e519524SHoward Hinnant __d.__incr((value_type*)0); 3834*3e519524SHoward Hinnant ++__first2; 3835*3e519524SHoward Hinnant } 3836*3e519524SHoward Hinnant else 3837*3e519524SHoward Hinnant { 3838*3e519524SHoward Hinnant ::new (__result) value_type(_STD::move(*__first1)); 3839*3e519524SHoward Hinnant __d.__incr((value_type*)0); 3840*3e519524SHoward Hinnant ++__first1; 3841*3e519524SHoward Hinnant } 3842*3e519524SHoward Hinnant } 3843*3e519524SHoward Hinnant} 3844*3e519524SHoward Hinnant 3845*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> 3846*3e519524SHoward Hinnantvoid 3847*3e519524SHoward Hinnant__merge_move_assign(_InputIterator1 __first1, _InputIterator1 __last1, 3848*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, 3849*3e519524SHoward Hinnant _OutputIterator __result, _Compare __comp) 3850*3e519524SHoward Hinnant{ 3851*3e519524SHoward Hinnant for (; __first1 != __last1; ++__result) 3852*3e519524SHoward Hinnant { 3853*3e519524SHoward Hinnant if (__first2 == __last2) 3854*3e519524SHoward Hinnant { 3855*3e519524SHoward Hinnant for (; __first1 != __last1; ++__first1, ++__result) 3856*3e519524SHoward Hinnant *__result = _STD::move(*__first1); 3857*3e519524SHoward Hinnant return; 3858*3e519524SHoward Hinnant } 3859*3e519524SHoward Hinnant if (__comp(*__first2, *__first1)) 3860*3e519524SHoward Hinnant { 3861*3e519524SHoward Hinnant *__result = _STD::move(*__first2); 3862*3e519524SHoward Hinnant ++__first2; 3863*3e519524SHoward Hinnant } 3864*3e519524SHoward Hinnant else 3865*3e519524SHoward Hinnant { 3866*3e519524SHoward Hinnant *__result = _STD::move(*__first1); 3867*3e519524SHoward Hinnant ++__first1; 3868*3e519524SHoward Hinnant } 3869*3e519524SHoward Hinnant } 3870*3e519524SHoward Hinnant for (; __first2 != __last2; ++__first2, ++__result) 3871*3e519524SHoward Hinnant *__result = _STD::move(*__first2); 3872*3e519524SHoward Hinnant} 3873*3e519524SHoward Hinnant 3874*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 3875*3e519524SHoward Hinnantvoid 3876*3e519524SHoward Hinnant__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, 3877*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len, 3878*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size); 3879*3e519524SHoward Hinnant 3880*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 3881*3e519524SHoward Hinnantvoid 3882*3e519524SHoward Hinnant__stable_sort_move(_RandomAccessIterator __first1, _RandomAccessIterator __last1, _Compare __comp, 3883*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len, 3884*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::value_type* __first2) 3885*3e519524SHoward Hinnant{ 3886*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 3887*3e519524SHoward Hinnant switch (__len) 3888*3e519524SHoward Hinnant { 3889*3e519524SHoward Hinnant case 0: 3890*3e519524SHoward Hinnant return; 3891*3e519524SHoward Hinnant case 1: 3892*3e519524SHoward Hinnant ::new(__first2) value_type(_STD::move(*__first1)); 3893*3e519524SHoward Hinnant return; 3894*3e519524SHoward Hinnant case 2: 3895*3e519524SHoward Hinnant __destruct_n __d(0); 3896*3e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h2(__first2, __d); 3897*3e519524SHoward Hinnant if (__comp(*--__last1, *__first1)) 3898*3e519524SHoward Hinnant { 3899*3e519524SHoward Hinnant ::new(__first2) value_type(_STD::move(*__last1)); 3900*3e519524SHoward Hinnant __d.__incr((value_type*)0); 3901*3e519524SHoward Hinnant ++__first2; 3902*3e519524SHoward Hinnant ::new(__first2) value_type(_STD::move(*__first1)); 3903*3e519524SHoward Hinnant } 3904*3e519524SHoward Hinnant else 3905*3e519524SHoward Hinnant { 3906*3e519524SHoward Hinnant ::new(__first2) value_type(_STD::move(*__first1)); 3907*3e519524SHoward Hinnant __d.__incr((value_type*)0); 3908*3e519524SHoward Hinnant ++__first2; 3909*3e519524SHoward Hinnant ::new(__first2) value_type(_STD::move(*__last1)); 3910*3e519524SHoward Hinnant } 3911*3e519524SHoward Hinnant __h2.release(); 3912*3e519524SHoward Hinnant return; 3913*3e519524SHoward Hinnant } 3914*3e519524SHoward Hinnant if (__len <= 8) 3915*3e519524SHoward Hinnant { 3916*3e519524SHoward Hinnant __insertion_sort_move<_Compare>(__first1, __last1, __first2, __comp); 3917*3e519524SHoward Hinnant return; 3918*3e519524SHoward Hinnant } 3919*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2; 3920*3e519524SHoward Hinnant _RandomAccessIterator __m = __first1 + __l2; 3921*3e519524SHoward Hinnant __stable_sort<_Compare>(__first1, __m, __comp, __l2, __first2, __l2); 3922*3e519524SHoward Hinnant __stable_sort<_Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2); 3923*3e519524SHoward Hinnant __merge_move_construct<_Compare>(__first1, __m, __m, __last1, __first2, __comp); 3924*3e519524SHoward Hinnant} 3925*3e519524SHoward Hinnant 3926*3e519524SHoward Hinnanttemplate <class _Tp> 3927*3e519524SHoward Hinnantstruct __stable_sort_switch 3928*3e519524SHoward Hinnant{ 3929*3e519524SHoward Hinnant static const unsigned value = 128*has_trivial_copy_assign<_Tp>::value; 3930*3e519524SHoward Hinnant}; 3931*3e519524SHoward Hinnant 3932*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 3933*3e519524SHoward Hinnantvoid 3934*3e519524SHoward Hinnant__stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, 3935*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len, 3936*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::value_type* __buff, ptrdiff_t __buff_size) 3937*3e519524SHoward Hinnant{ 3938*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 3939*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 3940*3e519524SHoward Hinnant switch (__len) 3941*3e519524SHoward Hinnant { 3942*3e519524SHoward Hinnant case 0: 3943*3e519524SHoward Hinnant case 1: 3944*3e519524SHoward Hinnant return; 3945*3e519524SHoward Hinnant case 2: 3946*3e519524SHoward Hinnant if (__comp(*--__last, *__first)) 3947*3e519524SHoward Hinnant swap(*__first, *__last); 3948*3e519524SHoward Hinnant return; 3949*3e519524SHoward Hinnant } 3950*3e519524SHoward Hinnant if (__len <= static_cast<difference_type>(__stable_sort_switch<value_type>::value)) 3951*3e519524SHoward Hinnant { 3952*3e519524SHoward Hinnant __insertion_sort<_Compare>(__first, __last, __comp); 3953*3e519524SHoward Hinnant return; 3954*3e519524SHoward Hinnant } 3955*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2; 3956*3e519524SHoward Hinnant _RandomAccessIterator __m = __first + __l2; 3957*3e519524SHoward Hinnant if (__len <= __buff_size) 3958*3e519524SHoward Hinnant { 3959*3e519524SHoward Hinnant __destruct_n __d(0); 3960*3e519524SHoward Hinnant unique_ptr<value_type, __destruct_n&> __h2(__buff, __d); 3961*3e519524SHoward Hinnant __stable_sort_move<_Compare>(__first, __m, __comp, __l2, __buff); 3962*3e519524SHoward Hinnant __d.__set(__l2, (value_type*)0); 3963*3e519524SHoward Hinnant __stable_sort_move<_Compare>(__m, __last, __comp, __len - __l2, __buff + __l2); 3964*3e519524SHoward Hinnant __d.__set(__len, (value_type*)0); 3965*3e519524SHoward Hinnant __merge_move_assign<_Compare>(__buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp); 3966*3e519524SHoward Hinnant// __merge<_Compare>(move_iterator<value_type*>(__buff), 3967*3e519524SHoward Hinnant// move_iterator<value_type*>(__buff + __l2), 3968*3e519524SHoward Hinnant// move_iterator<_RandomAccessIterator>(__buff + __l2), 3969*3e519524SHoward Hinnant// move_iterator<_RandomAccessIterator>(__buff + __len), 3970*3e519524SHoward Hinnant// __first, __comp); 3971*3e519524SHoward Hinnant return; 3972*3e519524SHoward Hinnant } 3973*3e519524SHoward Hinnant __stable_sort<_Compare>(__first, __m, __comp, __l2, __buff, __buff_size); 3974*3e519524SHoward Hinnant __stable_sort<_Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size); 3975*3e519524SHoward Hinnant __inplace_merge<_Compare>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size); 3976*3e519524SHoward Hinnant} 3977*3e519524SHoward Hinnant 3978*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 3979*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 3980*3e519524SHoward Hinnantvoid 3981*3e519524SHoward Hinnantstable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 3982*3e519524SHoward Hinnant{ 3983*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 3984*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 3985*3e519524SHoward Hinnant difference_type __len = __last - __first; 3986*3e519524SHoward Hinnant pair<value_type*, ptrdiff_t> __buf(0, 0); 3987*3e519524SHoward Hinnant unique_ptr<value_type, __return_temporary_buffer> __h; 3988*3e519524SHoward Hinnant if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value)) 3989*3e519524SHoward Hinnant { 3990*3e519524SHoward Hinnant __buf = _STD::get_temporary_buffer<value_type>(__len); 3991*3e519524SHoward Hinnant __h.reset(__buf.first); 3992*3e519524SHoward Hinnant } 3993*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 3994*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 3995*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 3996*3e519524SHoward Hinnant __stable_sort<_Comp_ref>(__first, __last, __c, __len, __buf.first, __buf.second); 3997*3e519524SHoward Hinnant#else 3998*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 3999*3e519524SHoward Hinnant __stable_sort<_Comp_ref>(__first, __last, __comp, __len, __buf.first, __buf.second); 4000*3e519524SHoward Hinnant#endif 4001*3e519524SHoward Hinnant} 4002*3e519524SHoward Hinnant 4003*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 4004*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4005*3e519524SHoward Hinnantvoid 4006*3e519524SHoward Hinnantstable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) 4007*3e519524SHoward Hinnant{ 4008*3e519524SHoward Hinnant _STD::stable_sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4009*3e519524SHoward Hinnant} 4010*3e519524SHoward Hinnant 4011*3e519524SHoward Hinnant// is_heap_until 4012*3e519524SHoward Hinnant 4013*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4014*3e519524SHoward Hinnant_RandomAccessIterator 4015*3e519524SHoward Hinnantis_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4016*3e519524SHoward Hinnant{ 4017*3e519524SHoward Hinnant typedef typename _STD::iterator_traits<_RandomAccessIterator>::difference_type difference_type; 4018*3e519524SHoward Hinnant difference_type __len = __last - __first; 4019*3e519524SHoward Hinnant difference_type __p = 0; 4020*3e519524SHoward Hinnant difference_type __c = 1; 4021*3e519524SHoward Hinnant _RandomAccessIterator __pp = __first; 4022*3e519524SHoward Hinnant while (__c < __len) 4023*3e519524SHoward Hinnant { 4024*3e519524SHoward Hinnant _RandomAccessIterator __cp = __first + __c; 4025*3e519524SHoward Hinnant if (__comp(*__pp, *__cp)) 4026*3e519524SHoward Hinnant return __cp; 4027*3e519524SHoward Hinnant ++__c; 4028*3e519524SHoward Hinnant ++__cp; 4029*3e519524SHoward Hinnant if (__c == __len) 4030*3e519524SHoward Hinnant return __last; 4031*3e519524SHoward Hinnant if (__comp(*__pp, *__cp)) 4032*3e519524SHoward Hinnant return __cp; 4033*3e519524SHoward Hinnant ++__p; 4034*3e519524SHoward Hinnant ++__pp; 4035*3e519524SHoward Hinnant __c = 2 * __p + 1; 4036*3e519524SHoward Hinnant } 4037*3e519524SHoward Hinnant return __last; 4038*3e519524SHoward Hinnant} 4039*3e519524SHoward Hinnant 4040*3e519524SHoward Hinnanttemplate<class _RandomAccessIterator> 4041*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4042*3e519524SHoward Hinnant_RandomAccessIterator 4043*3e519524SHoward Hinnantis_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last) 4044*3e519524SHoward Hinnant{ 4045*3e519524SHoward Hinnant return _STD::is_heap_until(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4046*3e519524SHoward Hinnant} 4047*3e519524SHoward Hinnant 4048*3e519524SHoward Hinnant// is_heap 4049*3e519524SHoward Hinnant 4050*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4051*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4052*3e519524SHoward Hinnantbool 4053*3e519524SHoward Hinnantis_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4054*3e519524SHoward Hinnant{ 4055*3e519524SHoward Hinnant return _STD::is_heap_until(__first, __last, __comp) == __last; 4056*3e519524SHoward Hinnant} 4057*3e519524SHoward Hinnant 4058*3e519524SHoward Hinnanttemplate<class _RandomAccessIterator> 4059*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4060*3e519524SHoward Hinnantbool 4061*3e519524SHoward Hinnantis_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) 4062*3e519524SHoward Hinnant{ 4063*3e519524SHoward Hinnant return _STD::is_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4064*3e519524SHoward Hinnant} 4065*3e519524SHoward Hinnant 4066*3e519524SHoward Hinnant// push_heap 4067*3e519524SHoward Hinnant 4068*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 4069*3e519524SHoward Hinnantvoid 4070*3e519524SHoward Hinnant__push_heap_front(_RandomAccessIterator __first, _RandomAccessIterator, _Compare __comp, 4071*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len) 4072*3e519524SHoward Hinnant{ 4073*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 4074*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 4075*3e519524SHoward Hinnant if (__len > 1) 4076*3e519524SHoward Hinnant { 4077*3e519524SHoward Hinnant difference_type __p = 0; 4078*3e519524SHoward Hinnant _RandomAccessIterator __pp = __first; 4079*3e519524SHoward Hinnant difference_type __c = 2; 4080*3e519524SHoward Hinnant _RandomAccessIterator __cp = __first + __c; 4081*3e519524SHoward Hinnant if (__c == __len || __comp(*__cp, *(__cp - 1))) 4082*3e519524SHoward Hinnant { 4083*3e519524SHoward Hinnant --__c; 4084*3e519524SHoward Hinnant --__cp; 4085*3e519524SHoward Hinnant } 4086*3e519524SHoward Hinnant if (__comp(*__pp, *__cp)) 4087*3e519524SHoward Hinnant { 4088*3e519524SHoward Hinnant value_type __t(_STD::move(*__pp)); 4089*3e519524SHoward Hinnant do 4090*3e519524SHoward Hinnant { 4091*3e519524SHoward Hinnant *__pp = _STD::move(*__cp); 4092*3e519524SHoward Hinnant __pp = __cp; 4093*3e519524SHoward Hinnant __p = __c; 4094*3e519524SHoward Hinnant __c = (__p + 1) * 2; 4095*3e519524SHoward Hinnant if (__c > __len) 4096*3e519524SHoward Hinnant break; 4097*3e519524SHoward Hinnant __cp = __first + __c; 4098*3e519524SHoward Hinnant if (__c == __len || __comp(*__cp, *(__cp - 1))) 4099*3e519524SHoward Hinnant { 4100*3e519524SHoward Hinnant --__c; 4101*3e519524SHoward Hinnant --__cp; 4102*3e519524SHoward Hinnant } 4103*3e519524SHoward Hinnant } while (__comp(__t, *__cp)); 4104*3e519524SHoward Hinnant *__pp = _STD::move(__t); 4105*3e519524SHoward Hinnant } 4106*3e519524SHoward Hinnant } 4107*3e519524SHoward Hinnant} 4108*3e519524SHoward Hinnant 4109*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 4110*3e519524SHoward Hinnantvoid 4111*3e519524SHoward Hinnant__push_heap_back(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, 4112*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len) 4113*3e519524SHoward Hinnant{ 4114*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 4115*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type; 4116*3e519524SHoward Hinnant if (__len > 1) 4117*3e519524SHoward Hinnant { 4118*3e519524SHoward Hinnant __len = (__len - 2) / 2; 4119*3e519524SHoward Hinnant _RandomAccessIterator __ptr = __first + __len; 4120*3e519524SHoward Hinnant if (__comp(*__ptr, *--__last)) 4121*3e519524SHoward Hinnant { 4122*3e519524SHoward Hinnant value_type __t(_STD::move(*__last)); 4123*3e519524SHoward Hinnant do 4124*3e519524SHoward Hinnant { 4125*3e519524SHoward Hinnant *__last = _STD::move(*__ptr); 4126*3e519524SHoward Hinnant __last = __ptr; 4127*3e519524SHoward Hinnant if (__len == 0) 4128*3e519524SHoward Hinnant break; 4129*3e519524SHoward Hinnant __len = (__len - 1) / 2; 4130*3e519524SHoward Hinnant __ptr = __first + __len; 4131*3e519524SHoward Hinnant } while (__comp(*__ptr, __t)); 4132*3e519524SHoward Hinnant *__last = _STD::move(__t); 4133*3e519524SHoward Hinnant } 4134*3e519524SHoward Hinnant } 4135*3e519524SHoward Hinnant} 4136*3e519524SHoward Hinnant 4137*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4138*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4139*3e519524SHoward Hinnantvoid 4140*3e519524SHoward Hinnantpush_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4141*3e519524SHoward Hinnant{ 4142*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4143*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4144*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4145*3e519524SHoward Hinnant __push_heap_back<_Comp_ref>(__first, __last, __c, __last - __first); 4146*3e519524SHoward Hinnant#else 4147*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4148*3e519524SHoward Hinnant __push_heap_back<_Comp_ref>(__first, __last, __comp, __last - __first); 4149*3e519524SHoward Hinnant#endif 4150*3e519524SHoward Hinnant} 4151*3e519524SHoward Hinnant 4152*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 4153*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4154*3e519524SHoward Hinnantvoid 4155*3e519524SHoward Hinnantpush_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) 4156*3e519524SHoward Hinnant{ 4157*3e519524SHoward Hinnant _STD::push_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4158*3e519524SHoward Hinnant} 4159*3e519524SHoward Hinnant 4160*3e519524SHoward Hinnant// pop_heap 4161*3e519524SHoward Hinnant 4162*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 4163*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4164*3e519524SHoward Hinnantvoid 4165*3e519524SHoward Hinnant__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp, 4166*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len) 4167*3e519524SHoward Hinnant{ 4168*3e519524SHoward Hinnant if (__len > 1) 4169*3e519524SHoward Hinnant { 4170*3e519524SHoward Hinnant swap(*__first, *--__last); 4171*3e519524SHoward Hinnant __push_heap_front<_Compare>(__first, __last, __comp, __len-1); 4172*3e519524SHoward Hinnant } 4173*3e519524SHoward Hinnant} 4174*3e519524SHoward Hinnant 4175*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4176*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4177*3e519524SHoward Hinnantvoid 4178*3e519524SHoward Hinnantpop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4179*3e519524SHoward Hinnant{ 4180*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4181*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4182*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4183*3e519524SHoward Hinnant __pop_heap<_Comp_ref>(__first, __last, __c, __last - __first); 4184*3e519524SHoward Hinnant#else 4185*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4186*3e519524SHoward Hinnant __pop_heap<_Comp_ref>(__first, __last, __comp, __last - __first); 4187*3e519524SHoward Hinnant#endif 4188*3e519524SHoward Hinnant} 4189*3e519524SHoward Hinnant 4190*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 4191*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4192*3e519524SHoward Hinnantvoid 4193*3e519524SHoward Hinnantpop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) 4194*3e519524SHoward Hinnant{ 4195*3e519524SHoward Hinnant _STD::pop_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4196*3e519524SHoward Hinnant} 4197*3e519524SHoward Hinnant 4198*3e519524SHoward Hinnant// make_heap 4199*3e519524SHoward Hinnant 4200*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 4201*3e519524SHoward Hinnantvoid 4202*3e519524SHoward Hinnant__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4203*3e519524SHoward Hinnant{ 4204*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 4205*3e519524SHoward Hinnant difference_type __n = __last - __first; 4206*3e519524SHoward Hinnant if (__n > 1) 4207*3e519524SHoward Hinnant { 4208*3e519524SHoward Hinnant __last = __first; 4209*3e519524SHoward Hinnant ++__last; 4210*3e519524SHoward Hinnant for (difference_type __i = 1; __i < __n;) 4211*3e519524SHoward Hinnant __push_heap_back<_Compare>(__first, ++__last, __comp, ++__i); 4212*3e519524SHoward Hinnant } 4213*3e519524SHoward Hinnant} 4214*3e519524SHoward Hinnant 4215*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4216*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4217*3e519524SHoward Hinnantvoid 4218*3e519524SHoward Hinnantmake_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4219*3e519524SHoward Hinnant{ 4220*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4221*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4222*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4223*3e519524SHoward Hinnant __make_heap<_Comp_ref>(__first, __last, __c); 4224*3e519524SHoward Hinnant#else 4225*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4226*3e519524SHoward Hinnant __make_heap<_Comp_ref>(__first, __last, __comp); 4227*3e519524SHoward Hinnant#endif 4228*3e519524SHoward Hinnant} 4229*3e519524SHoward Hinnant 4230*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 4231*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4232*3e519524SHoward Hinnantvoid 4233*3e519524SHoward Hinnantmake_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) 4234*3e519524SHoward Hinnant{ 4235*3e519524SHoward Hinnant _STD::make_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4236*3e519524SHoward Hinnant} 4237*3e519524SHoward Hinnant 4238*3e519524SHoward Hinnant// sort_heap 4239*3e519524SHoward Hinnant 4240*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 4241*3e519524SHoward Hinnantvoid 4242*3e519524SHoward Hinnant__sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4243*3e519524SHoward Hinnant{ 4244*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 4245*3e519524SHoward Hinnant for (difference_type __n = __last - __first; __n > 1; --__last, --__n) 4246*3e519524SHoward Hinnant __pop_heap<_Compare>(__first, __last, __comp, __n); 4247*3e519524SHoward Hinnant} 4248*3e519524SHoward Hinnant 4249*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4250*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4251*3e519524SHoward Hinnantvoid 4252*3e519524SHoward Hinnantsort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) 4253*3e519524SHoward Hinnant{ 4254*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4255*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4256*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4257*3e519524SHoward Hinnant __sort_heap<_Comp_ref>(__first, __last, __c); 4258*3e519524SHoward Hinnant#else 4259*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4260*3e519524SHoward Hinnant __sort_heap<_Comp_ref>(__first, __last, __comp); 4261*3e519524SHoward Hinnant#endif 4262*3e519524SHoward Hinnant} 4263*3e519524SHoward Hinnant 4264*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 4265*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4266*3e519524SHoward Hinnantvoid 4267*3e519524SHoward Hinnantsort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last) 4268*3e519524SHoward Hinnant{ 4269*3e519524SHoward Hinnant _STD::sort_heap(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4270*3e519524SHoward Hinnant} 4271*3e519524SHoward Hinnant 4272*3e519524SHoward Hinnant// partial_sort 4273*3e519524SHoward Hinnant 4274*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 4275*3e519524SHoward Hinnantvoid 4276*3e519524SHoward Hinnant__partial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, 4277*3e519524SHoward Hinnant _Compare __comp) 4278*3e519524SHoward Hinnant{ 4279*3e519524SHoward Hinnant __make_heap<_Compare>(__first, __middle, __comp); 4280*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len = __middle - __first; 4281*3e519524SHoward Hinnant for (_RandomAccessIterator __i = __middle; __i != __last; ++__i) 4282*3e519524SHoward Hinnant { 4283*3e519524SHoward Hinnant if (__comp(*__i, *__first)) 4284*3e519524SHoward Hinnant { 4285*3e519524SHoward Hinnant swap(*__i, *__first); 4286*3e519524SHoward Hinnant __push_heap_front<_Compare>(__first, __middle, __comp, __len); 4287*3e519524SHoward Hinnant } 4288*3e519524SHoward Hinnant } 4289*3e519524SHoward Hinnant __sort_heap<_Compare>(__first, __middle, __comp); 4290*3e519524SHoward Hinnant} 4291*3e519524SHoward Hinnant 4292*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4293*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4294*3e519524SHoward Hinnantvoid 4295*3e519524SHoward Hinnantpartial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last, 4296*3e519524SHoward Hinnant _Compare __comp) 4297*3e519524SHoward Hinnant{ 4298*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4299*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4300*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4301*3e519524SHoward Hinnant __partial_sort<_Comp_ref>(__first, __middle, __last, __c); 4302*3e519524SHoward Hinnant#else 4303*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4304*3e519524SHoward Hinnant __partial_sort<_Comp_ref>(__first, __middle, __last, __comp); 4305*3e519524SHoward Hinnant#endif 4306*3e519524SHoward Hinnant} 4307*3e519524SHoward Hinnant 4308*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 4309*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4310*3e519524SHoward Hinnantvoid 4311*3e519524SHoward Hinnantpartial_sort(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last) 4312*3e519524SHoward Hinnant{ 4313*3e519524SHoward Hinnant _STD::partial_sort(__first, __middle, __last, 4314*3e519524SHoward Hinnant __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4315*3e519524SHoward Hinnant} 4316*3e519524SHoward Hinnant 4317*3e519524SHoward Hinnant// partial_sort_copy 4318*3e519524SHoward Hinnant 4319*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator, class _RandomAccessIterator> 4320*3e519524SHoward Hinnant_RandomAccessIterator 4321*3e519524SHoward Hinnant__partial_sort_copy(_InputIterator __first, _InputIterator __last, 4322*3e519524SHoward Hinnant _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp) 4323*3e519524SHoward Hinnant{ 4324*3e519524SHoward Hinnant _RandomAccessIterator __r = __result_first; 4325*3e519524SHoward Hinnant if (__r != __result_last) 4326*3e519524SHoward Hinnant { 4327*3e519524SHoward Hinnant typename iterator_traits<_RandomAccessIterator>::difference_type __len = 0; 4328*3e519524SHoward Hinnant for (; __first != __last && __r != __result_last; ++__first, ++__r, ++__len) 4329*3e519524SHoward Hinnant *__r = *__first; 4330*3e519524SHoward Hinnant __make_heap<_Compare>(__result_first, __r, __comp); 4331*3e519524SHoward Hinnant for (; __first != __last; ++__first) 4332*3e519524SHoward Hinnant if (__comp(*__first, *__result_first)) 4333*3e519524SHoward Hinnant { 4334*3e519524SHoward Hinnant *__result_first = *__first; 4335*3e519524SHoward Hinnant __push_heap_front<_Compare>(__result_first, __r, __comp, __len); 4336*3e519524SHoward Hinnant } 4337*3e519524SHoward Hinnant __sort_heap<_Compare>(__result_first, __r, __comp); 4338*3e519524SHoward Hinnant } 4339*3e519524SHoward Hinnant return __r; 4340*3e519524SHoward Hinnant} 4341*3e519524SHoward Hinnant 4342*3e519524SHoward Hinnanttemplate <class _InputIterator, class _RandomAccessIterator, class _Compare> 4343*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4344*3e519524SHoward Hinnant_RandomAccessIterator 4345*3e519524SHoward Hinnantpartial_sort_copy(_InputIterator __first, _InputIterator __last, 4346*3e519524SHoward Hinnant _RandomAccessIterator __result_first, _RandomAccessIterator __result_last, _Compare __comp) 4347*3e519524SHoward Hinnant{ 4348*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4349*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4350*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4351*3e519524SHoward Hinnant return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __c); 4352*3e519524SHoward Hinnant#else 4353*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4354*3e519524SHoward Hinnant return __partial_sort_copy<_Comp_ref>(__first, __last, __result_first, __result_last, __comp); 4355*3e519524SHoward Hinnant#endif 4356*3e519524SHoward Hinnant} 4357*3e519524SHoward Hinnant 4358*3e519524SHoward Hinnanttemplate <class _InputIterator, class _RandomAccessIterator> 4359*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4360*3e519524SHoward Hinnant_RandomAccessIterator 4361*3e519524SHoward Hinnantpartial_sort_copy(_InputIterator __first, _InputIterator __last, 4362*3e519524SHoward Hinnant _RandomAccessIterator __result_first, _RandomAccessIterator __result_last) 4363*3e519524SHoward Hinnant{ 4364*3e519524SHoward Hinnant return _STD::partial_sort_copy(__first, __last, __result_first, __result_last, 4365*3e519524SHoward Hinnant __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4366*3e519524SHoward Hinnant} 4367*3e519524SHoward Hinnant 4368*3e519524SHoward Hinnant// nth_element 4369*3e519524SHoward Hinnant 4370*3e519524SHoward Hinnanttemplate <class _Compare, class _RandomAccessIterator> 4371*3e519524SHoward Hinnantvoid 4372*3e519524SHoward Hinnant__nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp) 4373*3e519524SHoward Hinnant{ 4374*3e519524SHoward Hinnant // _Compare is known to be a reference type 4375*3e519524SHoward Hinnant typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type; 4376*3e519524SHoward Hinnant const difference_type __limit = 7; 4377*3e519524SHoward Hinnant while (true) 4378*3e519524SHoward Hinnant { 4379*3e519524SHoward Hinnant __restart: 4380*3e519524SHoward Hinnant difference_type __len = __last - __first; 4381*3e519524SHoward Hinnant switch (__len) 4382*3e519524SHoward Hinnant { 4383*3e519524SHoward Hinnant case 0: 4384*3e519524SHoward Hinnant case 1: 4385*3e519524SHoward Hinnant return; 4386*3e519524SHoward Hinnant case 2: 4387*3e519524SHoward Hinnant if (__comp(*--__last, *__first)) 4388*3e519524SHoward Hinnant swap(*__first, *__last); 4389*3e519524SHoward Hinnant return; 4390*3e519524SHoward Hinnant case 3: 4391*3e519524SHoward Hinnant { 4392*3e519524SHoward Hinnant _RandomAccessIterator __m = __first; 4393*3e519524SHoward Hinnant _STD::__sort3<_Compare>(__first, ++__m, --__last, __comp); 4394*3e519524SHoward Hinnant return; 4395*3e519524SHoward Hinnant } 4396*3e519524SHoward Hinnant } 4397*3e519524SHoward Hinnant if (__len <= __limit) 4398*3e519524SHoward Hinnant { 4399*3e519524SHoward Hinnant __selection_sort<_Compare>(__first, __last, __comp); 4400*3e519524SHoward Hinnant return; 4401*3e519524SHoward Hinnant } 4402*3e519524SHoward Hinnant // __len > __limit >= 3 4403*3e519524SHoward Hinnant _RandomAccessIterator __m = __first + __len/2; 4404*3e519524SHoward Hinnant _RandomAccessIterator __lm1 = __last; 4405*3e519524SHoward Hinnant unsigned __n_swaps = _STD::__sort3<_Compare>(__first, __m, --__lm1, __comp); 4406*3e519524SHoward Hinnant // *__m is median 4407*3e519524SHoward Hinnant // partition [__first, __m) < *__m and *__m <= [__m, __last) 4408*3e519524SHoward Hinnant // (this inhibits tossing elements equivalent to __m around unnecessarily) 4409*3e519524SHoward Hinnant _RandomAccessIterator __i = __first; 4410*3e519524SHoward Hinnant _RandomAccessIterator __j = __lm1; 4411*3e519524SHoward Hinnant // j points beyond range to be tested, *__lm1 is known to be <= *__m 4412*3e519524SHoward Hinnant // The search going up is known to be guarded but the search coming down isn't. 4413*3e519524SHoward Hinnant // Prime the downward search with a guard. 4414*3e519524SHoward Hinnant if (!__comp(*__i, *__m)) // if *__first == *__m 4415*3e519524SHoward Hinnant { 4416*3e519524SHoward Hinnant // *__first == *__m, *__first doesn't go in first part 4417*3e519524SHoward Hinnant // manually guard downward moving __j against __i 4418*3e519524SHoward Hinnant while (true) 4419*3e519524SHoward Hinnant { 4420*3e519524SHoward Hinnant if (__i == --__j) 4421*3e519524SHoward Hinnant { 4422*3e519524SHoward Hinnant // *__first == *__m, *__m <= all other elements 4423*3e519524SHoward Hinnant // Parition instead into [__first, __i) == *__first and *__first < [__i, __last) 4424*3e519524SHoward Hinnant ++__i; // __first + 1 4425*3e519524SHoward Hinnant __j = __last; 4426*3e519524SHoward Hinnant if (!__comp(*__first, *--__j)) // we need a guard if *__first == *(__last-1) 4427*3e519524SHoward Hinnant { 4428*3e519524SHoward Hinnant while (true) 4429*3e519524SHoward Hinnant { 4430*3e519524SHoward Hinnant if (__i == __j) 4431*3e519524SHoward Hinnant return; // [__first, __last) all equivalent elements 4432*3e519524SHoward Hinnant if (__comp(*__first, *__i)) 4433*3e519524SHoward Hinnant { 4434*3e519524SHoward Hinnant swap(*__i, *__j); 4435*3e519524SHoward Hinnant ++__n_swaps; 4436*3e519524SHoward Hinnant ++__i; 4437*3e519524SHoward Hinnant break; 4438*3e519524SHoward Hinnant } 4439*3e519524SHoward Hinnant ++__i; 4440*3e519524SHoward Hinnant } 4441*3e519524SHoward Hinnant } 4442*3e519524SHoward Hinnant // [__first, __i) == *__first and *__first < [__j, __last) and __j == __last - 1 4443*3e519524SHoward Hinnant if (__i == __j) 4444*3e519524SHoward Hinnant return; 4445*3e519524SHoward Hinnant while (true) 4446*3e519524SHoward Hinnant { 4447*3e519524SHoward Hinnant while (!__comp(*__first, *__i)) 4448*3e519524SHoward Hinnant ++__i; 4449*3e519524SHoward Hinnant while (__comp(*__first, *--__j)) 4450*3e519524SHoward Hinnant ; 4451*3e519524SHoward Hinnant if (__i >= __j) 4452*3e519524SHoward Hinnant break; 4453*3e519524SHoward Hinnant swap(*__i, *__j); 4454*3e519524SHoward Hinnant ++__n_swaps; 4455*3e519524SHoward Hinnant ++__i; 4456*3e519524SHoward Hinnant } 4457*3e519524SHoward Hinnant // [__first, __i) == *__first and *__first < [__i, __last) 4458*3e519524SHoward Hinnant // The first part is sorted, 4459*3e519524SHoward Hinnant if (__nth < __i) 4460*3e519524SHoward Hinnant return; 4461*3e519524SHoward Hinnant // __nth_element the secod part 4462*3e519524SHoward Hinnant // __nth_element<_Compare>(__i, __nth, __last, __comp); 4463*3e519524SHoward Hinnant __first = __i; 4464*3e519524SHoward Hinnant goto __restart; 4465*3e519524SHoward Hinnant } 4466*3e519524SHoward Hinnant if (__comp(*__j, *__m)) 4467*3e519524SHoward Hinnant { 4468*3e519524SHoward Hinnant swap(*__i, *__j); 4469*3e519524SHoward Hinnant ++__n_swaps; 4470*3e519524SHoward Hinnant break; // found guard for downward moving __j, now use unguarded partition 4471*3e519524SHoward Hinnant } 4472*3e519524SHoward Hinnant } 4473*3e519524SHoward Hinnant } 4474*3e519524SHoward Hinnant ++__i; 4475*3e519524SHoward Hinnant // j points beyond range to be tested, *__lm1 is known to be <= *__m 4476*3e519524SHoward Hinnant // if not yet partitioned... 4477*3e519524SHoward Hinnant if (__i < __j) 4478*3e519524SHoward Hinnant { 4479*3e519524SHoward Hinnant // known that *(__i - 1) < *__m 4480*3e519524SHoward Hinnant while (true) 4481*3e519524SHoward Hinnant { 4482*3e519524SHoward Hinnant // __m still guards upward moving __i 4483*3e519524SHoward Hinnant while (__comp(*__i, *__m)) 4484*3e519524SHoward Hinnant ++__i; 4485*3e519524SHoward Hinnant // It is now known that a guard exists for downward moving __j 4486*3e519524SHoward Hinnant while (!__comp(*--__j, *__m)) 4487*3e519524SHoward Hinnant ; 4488*3e519524SHoward Hinnant if (__i >= __j) 4489*3e519524SHoward Hinnant break; 4490*3e519524SHoward Hinnant swap(*__i, *__j); 4491*3e519524SHoward Hinnant ++__n_swaps; 4492*3e519524SHoward Hinnant // It is known that __m != __j 4493*3e519524SHoward Hinnant // If __m just moved, follow it 4494*3e519524SHoward Hinnant if (__m == __i) 4495*3e519524SHoward Hinnant __m = __j; 4496*3e519524SHoward Hinnant ++__i; 4497*3e519524SHoward Hinnant } 4498*3e519524SHoward Hinnant } 4499*3e519524SHoward Hinnant // [__first, __i) < *__m and *__m <= [__i, __last) 4500*3e519524SHoward Hinnant if (__i != __m && __comp(*__m, *__i)) 4501*3e519524SHoward Hinnant { 4502*3e519524SHoward Hinnant swap(*__i, *__m); 4503*3e519524SHoward Hinnant ++__n_swaps; 4504*3e519524SHoward Hinnant } 4505*3e519524SHoward Hinnant // [__first, __i) < *__i and *__i <= [__i+1, __last) 4506*3e519524SHoward Hinnant if (__nth == __i) 4507*3e519524SHoward Hinnant return; 4508*3e519524SHoward Hinnant if (__n_swaps == 0) 4509*3e519524SHoward Hinnant { 4510*3e519524SHoward Hinnant // We were given a perfectly partitioned sequence. Coincidence? 4511*3e519524SHoward Hinnant if (__nth < __i) 4512*3e519524SHoward Hinnant { 4513*3e519524SHoward Hinnant // Check for [__first, __i) already sorted 4514*3e519524SHoward Hinnant __j = __m = __first; 4515*3e519524SHoward Hinnant while (++__j != __i) 4516*3e519524SHoward Hinnant { 4517*3e519524SHoward Hinnant if (__comp(*__j, *__m)) 4518*3e519524SHoward Hinnant // not yet sorted, so sort 4519*3e519524SHoward Hinnant goto not_sorted; 4520*3e519524SHoward Hinnant __m = __j; 4521*3e519524SHoward Hinnant } 4522*3e519524SHoward Hinnant // [__first, __i) sorted 4523*3e519524SHoward Hinnant return; 4524*3e519524SHoward Hinnant } 4525*3e519524SHoward Hinnant else 4526*3e519524SHoward Hinnant { 4527*3e519524SHoward Hinnant // Check for [__i, __last) already sorted 4528*3e519524SHoward Hinnant __j = __m = __i; 4529*3e519524SHoward Hinnant while (++__j != __last) 4530*3e519524SHoward Hinnant { 4531*3e519524SHoward Hinnant if (__comp(*__j, *__m)) 4532*3e519524SHoward Hinnant // not yet sorted, so sort 4533*3e519524SHoward Hinnant goto not_sorted; 4534*3e519524SHoward Hinnant __m = __j; 4535*3e519524SHoward Hinnant } 4536*3e519524SHoward Hinnant // [__i, __last) sorted 4537*3e519524SHoward Hinnant return; 4538*3e519524SHoward Hinnant } 4539*3e519524SHoward Hinnant } 4540*3e519524SHoward Hinnantnot_sorted: 4541*3e519524SHoward Hinnant // __nth_element on range containing __nth 4542*3e519524SHoward Hinnant if (__nth < __i) 4543*3e519524SHoward Hinnant { 4544*3e519524SHoward Hinnant // __nth_element<_Compare>(__first, __nth, __i, __comp); 4545*3e519524SHoward Hinnant __last = __i; 4546*3e519524SHoward Hinnant } 4547*3e519524SHoward Hinnant else 4548*3e519524SHoward Hinnant { 4549*3e519524SHoward Hinnant // __nth_element<_Compare>(__i+1, __nth, __last, __comp); 4550*3e519524SHoward Hinnant __first = ++__i; 4551*3e519524SHoward Hinnant } 4552*3e519524SHoward Hinnant } 4553*3e519524SHoward Hinnant} 4554*3e519524SHoward Hinnant 4555*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator, class _Compare> 4556*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4557*3e519524SHoward Hinnantvoid 4558*3e519524SHoward Hinnantnth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last, _Compare __comp) 4559*3e519524SHoward Hinnant{ 4560*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4561*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4562*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4563*3e519524SHoward Hinnant __nth_element<_Comp_ref>(__first, __nth, __last, __c); 4564*3e519524SHoward Hinnant#else 4565*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4566*3e519524SHoward Hinnant __nth_element<_Comp_ref>(__first, __nth, __last, __comp); 4567*3e519524SHoward Hinnant#endif 4568*3e519524SHoward Hinnant} 4569*3e519524SHoward Hinnant 4570*3e519524SHoward Hinnanttemplate <class _RandomAccessIterator> 4571*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4572*3e519524SHoward Hinnantvoid 4573*3e519524SHoward Hinnantnth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomAccessIterator __last) 4574*3e519524SHoward Hinnant{ 4575*3e519524SHoward Hinnant _STD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>()); 4576*3e519524SHoward Hinnant} 4577*3e519524SHoward Hinnant 4578*3e519524SHoward Hinnant// includes 4579*3e519524SHoward Hinnant 4580*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2> 4581*3e519524SHoward Hinnantbool 4582*3e519524SHoward Hinnant__includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, 4583*3e519524SHoward Hinnant _Compare __comp) 4584*3e519524SHoward Hinnant{ 4585*3e519524SHoward Hinnant for (; __first2 != __last2; ++__first1) 4586*3e519524SHoward Hinnant { 4587*3e519524SHoward Hinnant if (__first1 == __last1 || __comp(*__first2, *__first1)) 4588*3e519524SHoward Hinnant return false; 4589*3e519524SHoward Hinnant if (!__comp(*__first1, *__first2)) 4590*3e519524SHoward Hinnant ++__first2; 4591*3e519524SHoward Hinnant } 4592*3e519524SHoward Hinnant return true; 4593*3e519524SHoward Hinnant} 4594*3e519524SHoward Hinnant 4595*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Compare> 4596*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4597*3e519524SHoward Hinnantbool 4598*3e519524SHoward Hinnantincludes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2, 4599*3e519524SHoward Hinnant _Compare __comp) 4600*3e519524SHoward Hinnant{ 4601*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4602*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4603*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4604*3e519524SHoward Hinnant return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __c); 4605*3e519524SHoward Hinnant#else 4606*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4607*3e519524SHoward Hinnant return __includes<_Comp_ref>(__first1, __last1, __first2, __last2, __comp); 4608*3e519524SHoward Hinnant#endif 4609*3e519524SHoward Hinnant} 4610*3e519524SHoward Hinnant 4611*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2> 4612*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4613*3e519524SHoward Hinnantbool 4614*3e519524SHoward Hinnantincludes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) 4615*3e519524SHoward Hinnant{ 4616*3e519524SHoward Hinnant return _STD::includes(__first1, __last1, __first2, __last2, 4617*3e519524SHoward Hinnant __less<typename iterator_traits<_InputIterator1>::value_type, 4618*3e519524SHoward Hinnant typename iterator_traits<_InputIterator2>::value_type>()); 4619*3e519524SHoward Hinnant} 4620*3e519524SHoward Hinnant 4621*3e519524SHoward Hinnant// set_union 4622*3e519524SHoward Hinnant 4623*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> 4624*3e519524SHoward Hinnant_OutputIterator 4625*3e519524SHoward Hinnant__set_union(_InputIterator1 __first1, _InputIterator1 __last1, 4626*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4627*3e519524SHoward Hinnant{ 4628*3e519524SHoward Hinnant for (; __first1 != __last1; ++__result) 4629*3e519524SHoward Hinnant { 4630*3e519524SHoward Hinnant if (__first2 == __last2) 4631*3e519524SHoward Hinnant return _STD::copy(__first1, __last1, __result); 4632*3e519524SHoward Hinnant if (__comp(*__first2, *__first1)) 4633*3e519524SHoward Hinnant { 4634*3e519524SHoward Hinnant *__result = *__first2; 4635*3e519524SHoward Hinnant ++__first2; 4636*3e519524SHoward Hinnant } 4637*3e519524SHoward Hinnant else 4638*3e519524SHoward Hinnant { 4639*3e519524SHoward Hinnant *__result = *__first1; 4640*3e519524SHoward Hinnant if (!__comp(*__first1, *__first2)) 4641*3e519524SHoward Hinnant ++__first2; 4642*3e519524SHoward Hinnant ++__first1; 4643*3e519524SHoward Hinnant } 4644*3e519524SHoward Hinnant } 4645*3e519524SHoward Hinnant return _STD::copy(__first2, __last2, __result); 4646*3e519524SHoward Hinnant} 4647*3e519524SHoward Hinnant 4648*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> 4649*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4650*3e519524SHoward Hinnant_OutputIterator 4651*3e519524SHoward Hinnantset_union(_InputIterator1 __first1, _InputIterator1 __last1, 4652*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4653*3e519524SHoward Hinnant{ 4654*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4655*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4656*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4657*3e519524SHoward Hinnant return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); 4658*3e519524SHoward Hinnant#else 4659*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4660*3e519524SHoward Hinnant return __set_union<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); 4661*3e519524SHoward Hinnant#endif 4662*3e519524SHoward Hinnant} 4663*3e519524SHoward Hinnant 4664*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator> 4665*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4666*3e519524SHoward Hinnant_OutputIterator 4667*3e519524SHoward Hinnantset_union(_InputIterator1 __first1, _InputIterator1 __last1, 4668*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) 4669*3e519524SHoward Hinnant{ 4670*3e519524SHoward Hinnant return _STD::set_union(__first1, __last1, __first2, __last2, __result, 4671*3e519524SHoward Hinnant __less<typename iterator_traits<_InputIterator1>::value_type, 4672*3e519524SHoward Hinnant typename iterator_traits<_InputIterator2>::value_type>()); 4673*3e519524SHoward Hinnant} 4674*3e519524SHoward Hinnant 4675*3e519524SHoward Hinnant// set_intersection 4676*3e519524SHoward Hinnant 4677*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> 4678*3e519524SHoward Hinnant_OutputIterator 4679*3e519524SHoward Hinnant__set_intersection(_InputIterator1 __first1, _InputIterator1 __last1, 4680*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4681*3e519524SHoward Hinnant{ 4682*3e519524SHoward Hinnant while (__first1 != __last1 && __first2 != __last2) 4683*3e519524SHoward Hinnant { 4684*3e519524SHoward Hinnant if (__comp(*__first1, *__first2)) 4685*3e519524SHoward Hinnant ++__first1; 4686*3e519524SHoward Hinnant else 4687*3e519524SHoward Hinnant { 4688*3e519524SHoward Hinnant if (!__comp(*__first2, *__first1)) 4689*3e519524SHoward Hinnant { 4690*3e519524SHoward Hinnant *__result = *__first1; 4691*3e519524SHoward Hinnant ++__result; 4692*3e519524SHoward Hinnant ++__first1; 4693*3e519524SHoward Hinnant } 4694*3e519524SHoward Hinnant ++__first2; 4695*3e519524SHoward Hinnant } 4696*3e519524SHoward Hinnant } 4697*3e519524SHoward Hinnant return __result; 4698*3e519524SHoward Hinnant} 4699*3e519524SHoward Hinnant 4700*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> 4701*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4702*3e519524SHoward Hinnant_OutputIterator 4703*3e519524SHoward Hinnantset_intersection(_InputIterator1 __first1, _InputIterator1 __last1, 4704*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4705*3e519524SHoward Hinnant{ 4706*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4707*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4708*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4709*3e519524SHoward Hinnant return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); 4710*3e519524SHoward Hinnant#else 4711*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4712*3e519524SHoward Hinnant return __set_intersection<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); 4713*3e519524SHoward Hinnant#endif 4714*3e519524SHoward Hinnant} 4715*3e519524SHoward Hinnant 4716*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator> 4717*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4718*3e519524SHoward Hinnant_OutputIterator 4719*3e519524SHoward Hinnantset_intersection(_InputIterator1 __first1, _InputIterator1 __last1, 4720*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) 4721*3e519524SHoward Hinnant{ 4722*3e519524SHoward Hinnant return _STD::set_intersection(__first1, __last1, __first2, __last2, __result, 4723*3e519524SHoward Hinnant __less<typename iterator_traits<_InputIterator1>::value_type, 4724*3e519524SHoward Hinnant typename iterator_traits<_InputIterator2>::value_type>()); 4725*3e519524SHoward Hinnant} 4726*3e519524SHoward Hinnant 4727*3e519524SHoward Hinnant// set_difference 4728*3e519524SHoward Hinnant 4729*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> 4730*3e519524SHoward Hinnant_OutputIterator 4731*3e519524SHoward Hinnant__set_difference(_InputIterator1 __first1, _InputIterator1 __last1, 4732*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4733*3e519524SHoward Hinnant{ 4734*3e519524SHoward Hinnant while (__first1 != __last1) 4735*3e519524SHoward Hinnant { 4736*3e519524SHoward Hinnant if (__first2 == __last2) 4737*3e519524SHoward Hinnant return _STD::copy(__first1, __last1, __result); 4738*3e519524SHoward Hinnant if (__comp(*__first1, *__first2)) 4739*3e519524SHoward Hinnant { 4740*3e519524SHoward Hinnant *__result = *__first1; 4741*3e519524SHoward Hinnant ++__result; 4742*3e519524SHoward Hinnant ++__first1; 4743*3e519524SHoward Hinnant } 4744*3e519524SHoward Hinnant else 4745*3e519524SHoward Hinnant { 4746*3e519524SHoward Hinnant if (!__comp(*__first2, *__first1)) 4747*3e519524SHoward Hinnant ++__first1; 4748*3e519524SHoward Hinnant ++__first2; 4749*3e519524SHoward Hinnant } 4750*3e519524SHoward Hinnant } 4751*3e519524SHoward Hinnant return __result; 4752*3e519524SHoward Hinnant} 4753*3e519524SHoward Hinnant 4754*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> 4755*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4756*3e519524SHoward Hinnant_OutputIterator 4757*3e519524SHoward Hinnantset_difference(_InputIterator1 __first1, _InputIterator1 __last1, 4758*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4759*3e519524SHoward Hinnant{ 4760*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4761*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4762*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4763*3e519524SHoward Hinnant return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); 4764*3e519524SHoward Hinnant#else 4765*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4766*3e519524SHoward Hinnant return __set_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); 4767*3e519524SHoward Hinnant#endif 4768*3e519524SHoward Hinnant} 4769*3e519524SHoward Hinnant 4770*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator> 4771*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4772*3e519524SHoward Hinnant_OutputIterator 4773*3e519524SHoward Hinnantset_difference(_InputIterator1 __first1, _InputIterator1 __last1, 4774*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) 4775*3e519524SHoward Hinnant{ 4776*3e519524SHoward Hinnant return _STD::set_difference(__first1, __last1, __first2, __last2, __result, 4777*3e519524SHoward Hinnant __less<typename iterator_traits<_InputIterator1>::value_type, 4778*3e519524SHoward Hinnant typename iterator_traits<_InputIterator2>::value_type>()); 4779*3e519524SHoward Hinnant} 4780*3e519524SHoward Hinnant 4781*3e519524SHoward Hinnant// set_symmetric_difference 4782*3e519524SHoward Hinnant 4783*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> 4784*3e519524SHoward Hinnant_OutputIterator 4785*3e519524SHoward Hinnant__set_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, 4786*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4787*3e519524SHoward Hinnant{ 4788*3e519524SHoward Hinnant while (__first1 != __last1) 4789*3e519524SHoward Hinnant { 4790*3e519524SHoward Hinnant if (__first2 == __last2) 4791*3e519524SHoward Hinnant return _STD::copy(__first1, __last1, __result); 4792*3e519524SHoward Hinnant if (__comp(*__first1, *__first2)) 4793*3e519524SHoward Hinnant { 4794*3e519524SHoward Hinnant *__result = *__first1; 4795*3e519524SHoward Hinnant ++__result; 4796*3e519524SHoward Hinnant ++__first1; 4797*3e519524SHoward Hinnant } 4798*3e519524SHoward Hinnant else 4799*3e519524SHoward Hinnant { 4800*3e519524SHoward Hinnant if (__comp(*__first2, *__first1)) 4801*3e519524SHoward Hinnant { 4802*3e519524SHoward Hinnant *__result = *__first2; 4803*3e519524SHoward Hinnant ++__result; 4804*3e519524SHoward Hinnant } 4805*3e519524SHoward Hinnant else 4806*3e519524SHoward Hinnant ++__first1; 4807*3e519524SHoward Hinnant ++__first2; 4808*3e519524SHoward Hinnant } 4809*3e519524SHoward Hinnant } 4810*3e519524SHoward Hinnant return _STD::copy(__first2, __last2, __result); 4811*3e519524SHoward Hinnant} 4812*3e519524SHoward Hinnant 4813*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> 4814*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4815*3e519524SHoward Hinnant_OutputIterator 4816*3e519524SHoward Hinnantset_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, 4817*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result, _Compare __comp) 4818*3e519524SHoward Hinnant{ 4819*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4820*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4821*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4822*3e519524SHoward Hinnant return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __c); 4823*3e519524SHoward Hinnant#else 4824*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4825*3e519524SHoward Hinnant return __set_symmetric_difference<_Comp_ref>(__first1, __last1, __first2, __last2, __result, __comp); 4826*3e519524SHoward Hinnant#endif 4827*3e519524SHoward Hinnant} 4828*3e519524SHoward Hinnant 4829*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _OutputIterator> 4830*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4831*3e519524SHoward Hinnant_OutputIterator 4832*3e519524SHoward Hinnantset_symmetric_difference(_InputIterator1 __first1, _InputIterator1 __last1, 4833*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result) 4834*3e519524SHoward Hinnant{ 4835*3e519524SHoward Hinnant return _STD::set_symmetric_difference(__first1, __last1, __first2, __last2, __result, 4836*3e519524SHoward Hinnant __less<typename iterator_traits<_InputIterator1>::value_type, 4837*3e519524SHoward Hinnant typename iterator_traits<_InputIterator2>::value_type>()); 4838*3e519524SHoward Hinnant} 4839*3e519524SHoward Hinnant 4840*3e519524SHoward Hinnant// lexicographical_compare 4841*3e519524SHoward Hinnant 4842*3e519524SHoward Hinnanttemplate <class _Compare, class _InputIterator1, class _InputIterator2> 4843*3e519524SHoward Hinnantbool 4844*3e519524SHoward Hinnant__lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, 4845*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp) 4846*3e519524SHoward Hinnant{ 4847*3e519524SHoward Hinnant for (; __first2 != __last2; ++__first1, ++__first2) 4848*3e519524SHoward Hinnant { 4849*3e519524SHoward Hinnant if (__first1 == __last1 || __comp(*__first1, *__first2)) 4850*3e519524SHoward Hinnant return true; 4851*3e519524SHoward Hinnant if (__comp(*__first2, *__first1)) 4852*3e519524SHoward Hinnant return false; 4853*3e519524SHoward Hinnant } 4854*3e519524SHoward Hinnant return false; 4855*3e519524SHoward Hinnant} 4856*3e519524SHoward Hinnant 4857*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2, class _Compare> 4858*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4859*3e519524SHoward Hinnantbool 4860*3e519524SHoward Hinnantlexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, 4861*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2, _Compare __comp) 4862*3e519524SHoward Hinnant{ 4863*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4864*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4865*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4866*3e519524SHoward Hinnant return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __c); 4867*3e519524SHoward Hinnant#else 4868*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4869*3e519524SHoward Hinnant return __lexicographical_compare<_Comp_ref>(__first1, __last1, __first2, __last2, __comp); 4870*3e519524SHoward Hinnant#endif 4871*3e519524SHoward Hinnant} 4872*3e519524SHoward Hinnant 4873*3e519524SHoward Hinnanttemplate <class _InputIterator1, class _InputIterator2> 4874*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4875*3e519524SHoward Hinnantbool 4876*3e519524SHoward Hinnantlexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1, 4877*3e519524SHoward Hinnant _InputIterator2 __first2, _InputIterator2 __last2) 4878*3e519524SHoward Hinnant{ 4879*3e519524SHoward Hinnant return _STD::lexicographical_compare(__first1, __last1, __first2, __last2, 4880*3e519524SHoward Hinnant __less<typename iterator_traits<_InputIterator1>::value_type, 4881*3e519524SHoward Hinnant typename iterator_traits<_InputIterator2>::value_type>()); 4882*3e519524SHoward Hinnant} 4883*3e519524SHoward Hinnant 4884*3e519524SHoward Hinnant// next_permutation 4885*3e519524SHoward Hinnant 4886*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator> 4887*3e519524SHoward Hinnantbool 4888*3e519524SHoward Hinnant__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) 4889*3e519524SHoward Hinnant{ 4890*3e519524SHoward Hinnant _BidirectionalIterator __i = __last; 4891*3e519524SHoward Hinnant if (__first == __last || __first == --__i) 4892*3e519524SHoward Hinnant return false; 4893*3e519524SHoward Hinnant while (true) 4894*3e519524SHoward Hinnant { 4895*3e519524SHoward Hinnant _BidirectionalIterator __ip1 = __i; 4896*3e519524SHoward Hinnant if (__comp(*--__i, *__ip1)) 4897*3e519524SHoward Hinnant { 4898*3e519524SHoward Hinnant _BidirectionalIterator __j = __last; 4899*3e519524SHoward Hinnant while (!__comp(*__i, *--__j)) 4900*3e519524SHoward Hinnant ; 4901*3e519524SHoward Hinnant swap(*__i, *__j); 4902*3e519524SHoward Hinnant _STD::reverse(__ip1, __last); 4903*3e519524SHoward Hinnant return true; 4904*3e519524SHoward Hinnant } 4905*3e519524SHoward Hinnant if (__i == __first) 4906*3e519524SHoward Hinnant { 4907*3e519524SHoward Hinnant _STD::reverse(__first, __last); 4908*3e519524SHoward Hinnant return false; 4909*3e519524SHoward Hinnant } 4910*3e519524SHoward Hinnant } 4911*3e519524SHoward Hinnant} 4912*3e519524SHoward Hinnant 4913*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _Compare> 4914*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4915*3e519524SHoward Hinnantbool 4916*3e519524SHoward Hinnantnext_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) 4917*3e519524SHoward Hinnant{ 4918*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4919*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4920*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4921*3e519524SHoward Hinnant return __next_permutation<_Comp_ref>(__first, __last, __c); 4922*3e519524SHoward Hinnant#else 4923*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4924*3e519524SHoward Hinnant return __next_permutation<_Comp_ref>(__first, __last, __comp); 4925*3e519524SHoward Hinnant#endif 4926*3e519524SHoward Hinnant} 4927*3e519524SHoward Hinnant 4928*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator> 4929*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4930*3e519524SHoward Hinnantbool 4931*3e519524SHoward Hinnantnext_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) 4932*3e519524SHoward Hinnant{ 4933*3e519524SHoward Hinnant return _STD::next_permutation(__first, __last, 4934*3e519524SHoward Hinnant __less<typename iterator_traits<_BidirectionalIterator>::value_type>()); 4935*3e519524SHoward Hinnant} 4936*3e519524SHoward Hinnant 4937*3e519524SHoward Hinnant// prev_permutation 4938*3e519524SHoward Hinnant 4939*3e519524SHoward Hinnanttemplate <class _Compare, class _BidirectionalIterator> 4940*3e519524SHoward Hinnantbool 4941*3e519524SHoward Hinnant__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) 4942*3e519524SHoward Hinnant{ 4943*3e519524SHoward Hinnant _BidirectionalIterator __i = __last; 4944*3e519524SHoward Hinnant if (__first == __last || __first == --__i) 4945*3e519524SHoward Hinnant return false; 4946*3e519524SHoward Hinnant while (true) 4947*3e519524SHoward Hinnant { 4948*3e519524SHoward Hinnant _BidirectionalIterator __ip1 = __i; 4949*3e519524SHoward Hinnant if (__comp(*__ip1, *--__i)) 4950*3e519524SHoward Hinnant { 4951*3e519524SHoward Hinnant _BidirectionalIterator __j = __last; 4952*3e519524SHoward Hinnant while (!__comp(*--__j, *__i)) 4953*3e519524SHoward Hinnant ; 4954*3e519524SHoward Hinnant swap(*__i, *__j); 4955*3e519524SHoward Hinnant _STD::reverse(__ip1, __last); 4956*3e519524SHoward Hinnant return true; 4957*3e519524SHoward Hinnant } 4958*3e519524SHoward Hinnant if (__i == __first) 4959*3e519524SHoward Hinnant { 4960*3e519524SHoward Hinnant _STD::reverse(__first, __last); 4961*3e519524SHoward Hinnant return false; 4962*3e519524SHoward Hinnant } 4963*3e519524SHoward Hinnant } 4964*3e519524SHoward Hinnant} 4965*3e519524SHoward Hinnant 4966*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator, class _Compare> 4967*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4968*3e519524SHoward Hinnantbool 4969*3e519524SHoward Hinnantprev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) 4970*3e519524SHoward Hinnant{ 4971*3e519524SHoward Hinnant#ifdef _LIBCPP_DEBUG 4972*3e519524SHoward Hinnant typedef typename add_lvalue_reference<__debug_less<_Compare> >::type _Comp_ref; 4973*3e519524SHoward Hinnant __debug_less<_Compare> __c(__comp); 4974*3e519524SHoward Hinnant return __prev_permutation<_Comp_ref>(__first, __last, __c); 4975*3e519524SHoward Hinnant#else 4976*3e519524SHoward Hinnant typedef typename add_lvalue_reference<_Compare>::type _Comp_ref; 4977*3e519524SHoward Hinnant return __prev_permutation<_Comp_ref>(__first, __last, __comp); 4978*3e519524SHoward Hinnant#endif 4979*3e519524SHoward Hinnant} 4980*3e519524SHoward Hinnant 4981*3e519524SHoward Hinnanttemplate <class _BidirectionalIterator> 4982*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4983*3e519524SHoward Hinnantbool 4984*3e519524SHoward Hinnantprev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) 4985*3e519524SHoward Hinnant{ 4986*3e519524SHoward Hinnant return _STD::prev_permutation(__first, __last, 4987*3e519524SHoward Hinnant __less<typename iterator_traits<_BidirectionalIterator>::value_type>()); 4988*3e519524SHoward Hinnant} 4989*3e519524SHoward Hinnant 4990*3e519524SHoward Hinnanttemplate <class _Tp> 4991*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 4992*3e519524SHoward Hinnanttypename enable_if 4993*3e519524SHoward Hinnant< 4994*3e519524SHoward Hinnant is_integral<_Tp>::value, 4995*3e519524SHoward Hinnant _Tp 4996*3e519524SHoward Hinnant>::type 4997*3e519524SHoward Hinnant__rotate_left(_Tp __t, _Tp __n = 1) 4998*3e519524SHoward Hinnant{ 4999*3e519524SHoward Hinnant const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1); 5000*3e519524SHoward Hinnant __n &= __bits; 5001*3e519524SHoward Hinnant return static_cast<_Tp>((__t << __n) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> (__bits - __n))); 5002*3e519524SHoward Hinnant} 5003*3e519524SHoward Hinnant 5004*3e519524SHoward Hinnanttemplate <class _Tp> 5005*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5006*3e519524SHoward Hinnanttypename enable_if 5007*3e519524SHoward Hinnant< 5008*3e519524SHoward Hinnant is_integral<_Tp>::value, 5009*3e519524SHoward Hinnant _Tp 5010*3e519524SHoward Hinnant>::type 5011*3e519524SHoward Hinnant__rotate_right(_Tp __t, _Tp __n = 1) 5012*3e519524SHoward Hinnant{ 5013*3e519524SHoward Hinnant const unsigned __bits = static_cast<unsigned>(sizeof(_Tp) * __CHAR_BIT__ - 1); 5014*3e519524SHoward Hinnant __n &= __bits; 5015*3e519524SHoward Hinnant return static_cast<_Tp>((__t << (__bits - __n)) | (static_cast<typename make_unsigned<_Tp>::type>(__t) >> __n)); 5016*3e519524SHoward Hinnant} 5017*3e519524SHoward Hinnant 5018*3e519524SHoward Hinnant// Precondition: __x != 0 5019*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned __ctz(unsigned __x) {return __builtin_ctz (__x);} 5020*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned long __ctz(unsigned long __x) {return __builtin_ctzl (__x);} 5021*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned long long __ctz(unsigned long long __x) {return __builtin_ctzll(__x);} 5022*3e519524SHoward Hinnant 5023*3e519524SHoward Hinnant// Precondition: __x != 0 5024*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned __clz(unsigned __x) {return __builtin_clz (__x);} 5025*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned long __clz(unsigned long __x) {return __builtin_clzl (__x);} 5026*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY unsigned long long __clz(unsigned long long __x) {return __builtin_clzll(__x);} 5027*3e519524SHoward Hinnant 5028*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned __x) {return __builtin_popcount (__x);} 5029*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long __x) {return __builtin_popcountl (__x);} 5030*3e519524SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY int __pop_count(unsigned long long __x) {return __builtin_popcountll(__x);} 5031*3e519524SHoward Hinnant 5032*3e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 5033*3e519524SHoward Hinnant 5034*3e519524SHoward Hinnant#endif // _LIBCPP_ALGORITHM 5035