2 // { dg-additional-options "-g" }
5 typedef __SIZE_TYPE__ size_t;
6 typedef __PTRDIFF_TYPE__ ptrdiff_t;
7 void __throw_length_error(const char *) __attribute__((__noreturn__, __cold__));
10 namespace std __attribute__((__visibility__("default"))) {
11 template <typename _Tp> struct __is_integer {
14 template <typename _Tp> struct __is_nonvolatile_trivially_copyable {
15 enum { __value = __is_trivially_copyable(_Tp) };
17 template <typename _OutputIter, typename _InputIter> struct __memcpyable {};
18 template <typename _Tp>
19 struct __memcpyable<_Tp *, _Tp *> : __is_nonvolatile_trivially_copyable<_Tp> {
21 template <typename _Tp>
22 struct __memcpyable<_Tp *, const _Tp *>
23 : __is_nonvolatile_trivially_copyable<_Tp> {};
24 template <typename _Tp> struct __is_move_iterator {
27 template <typename _Iterator> inline _Iterator __miter_base(_Iterator __it) {
32 namespace __gnu_cxx __attribute__((__visibility__("default"))) {
33 template <typename _Tp>
34 struct __is_integer_nonstrict : public std::__is_integer<_Tp> {
35 using std::__is_integer<_Tp>::__value;
36 enum { __width = __value ? sizeof(_Tp) * 8 : 0 };
38 template <typename _Value> struct __numeric_traits_integer {
39 static const bool __is_signed = (_Value)(-1) < 0;
40 static const int __digits =
41 __is_integer_nonstrict<_Value>::__width - __is_signed;
42 static const _Value __max =
43 __is_signed ? (((((_Value)1 << (__digits - 1)) - 1) << 1) + 1)
46 template <typename _Value>
47 struct __numeric_traits : public __numeric_traits_integer<_Value> {};
49 namespace std __attribute__((__visibility__("default"))) {
50 template <typename _Tp, _Tp __v> struct integral_constant {
51 static constexpr _Tp value = __v;
52 using type = integral_constant<_Tp, __v>;
54 template <bool __v> using __bool_constant = integral_constant<bool, __v>;
55 using true_type = __bool_constant<true>;
56 using false_type = __bool_constant<false>;
57 template <bool, typename _Tp = void> struct enable_if {};
58 template <typename _Tp> struct enable_if<true, _Tp> { using type = _Tp; };
59 template <bool _Cond, typename _Tp = void>
60 using __enable_if_t = typename enable_if<_Cond, _Tp>::type;
61 template <bool> struct __conditional {
62 template <typename _Tp, typename> using type = _Tp;
64 template <bool _Cond, typename _If, typename _Else>
65 using __conditional_t =
66 typename __conditional<_Cond>::template type<_If, _Else>;
68 template <typename... _Bn> auto __and_fn(...) -> false_type;
70 template <typename... _Bn>
71 struct __and_ : decltype(__detail::__and_fn<_Bn...>(0)) {};
72 template <typename _Pp> struct __not_ : __bool_constant<!bool(_Pp::value)> {};
73 template <typename...> using __void_t = void;
74 template <typename _Tp>
75 struct is_trivial : public __bool_constant<__is_trivial(_Tp)> {};
76 template <typename _Tp, typename _Up = _Tp &&> _Up __declval(int);
77 template <typename _Tp> auto declval() noexcept->decltype(__declval<_Tp>(0));
78 template <typename _Tp, typename... _Args>
79 using __is_constructible_impl =
80 __bool_constant<__is_constructible(_Tp, _Args...)>;
81 template <typename _Tp, typename = void>
82 struct __add_lvalue_reference_helper {
85 template <typename _Tp>
86 using __add_lval_ref_t = typename __add_lvalue_reference_helper<_Tp>::type;
87 template <typename _Tp>
88 struct is_copy_constructible
89 : public __is_constructible_impl<_Tp, __add_lval_ref_t<const _Tp>> {};
90 template <typename _Tp, typename = void>
91 struct __add_rvalue_reference_helper {
94 template <typename _Tp>
95 using __add_rval_ref_t = typename __add_rvalue_reference_helper<_Tp>::type;
96 template <typename _Tp>
97 struct is_move_constructible
98 : public __is_constructible_impl<_Tp, __add_rval_ref_t<_Tp>> {};
99 template <typename _Tp, typename... _Args>
100 using __is_nothrow_constructible_impl =
101 __bool_constant<__is_nothrow_constructible(_Tp, _Args...)>;
102 template <typename _Tp>
103 struct is_nothrow_default_constructible
104 : public __is_nothrow_constructible_impl<_Tp> {};
105 template <typename _Tp>
106 struct is_nothrow_copy_constructible
107 : public __is_nothrow_constructible_impl<_Tp,
108 __add_lval_ref_t<const _Tp>> {};
109 template <typename _Tp>
110 struct is_nothrow_move_constructible
111 : public __is_nothrow_constructible_impl<_Tp, __add_rval_ref_t<_Tp>> {};
112 template <typename _Tp> struct remove_reference {
113 using type = __remove_reference(_Tp);
115 template <typename _Tp>
116 [[__nodiscard__]] constexpr _Tp &&forward(
117 typename std::remove_reference<_Tp>::type & __t) noexcept {
118 return static_cast<_Tp &&>(__t);
120 template <typename _Tp>
121 [[__nodiscard__]] constexpr typename std::remove_reference<_Tp>::type &&move(
122 _Tp && __t) noexcept {
123 return static_cast<typename std::remove_reference<_Tp>::type &&>(__t);
125 template <typename _Tp>
126 struct __move_if_noexcept_cond
127 : public __and_<__not_<is_nothrow_move_constructible<_Tp>>,
128 is_copy_constructible<_Tp>>::type {};
129 struct input_iterator_tag {};
130 struct forward_iterator_tag : public input_iterator_tag {};
131 struct bidirectional_iterator_tag : public forward_iterator_tag {};
132 struct random_access_iterator_tag : public bidirectional_iterator_tag {};
133 template <typename _Iterator, typename = __void_t<>>
134 struct __iterator_traits {
135 typedef typename _Iterator::value_type value_type;
137 template <typename _Iterator>
138 struct iterator_traits : public __iterator_traits<_Iterator> {};
139 template <typename _Tp> struct iterator_traits<_Tp *> {
140 typedef random_access_iterator_tag iterator_category;
141 typedef _Tp value_type;
142 typedef ptrdiff_t difference_type;
143 typedef _Tp &reference;
145 template <typename _Iter>
146 typename iterator_traits<_Iter>::iterator_category __iterator_category(
148 return typename iterator_traits<_Iter>::iterator_category();
150 template <typename _RandomAccessIterator>
151 typename iterator_traits<_RandomAccessIterator>::difference_type __distance(
152 _RandomAccessIterator __first, _RandomAccessIterator __last,
153 random_access_iterator_tag) {
154 return __last - __first;
156 template <typename _InputIterator>
157 typename iterator_traits<_InputIterator>::difference_type distance(
158 _InputIterator __first, _InputIterator __last) {
159 return std::__distance(__first, __last, std::__iterator_category(__first));
162 namespace __gnu_cxx __attribute__((__visibility__("default"))) {
163 template <typename _Iterator, typename _Container> class __normal_iterator {
164 _Iterator _M_current;
165 typedef std::iterator_traits<_Iterator> __traits_type;
167 typedef typename __traits_type::value_type value_type;
168 typedef typename __traits_type::difference_type difference_type;
169 typedef typename __traits_type::reference reference;
170 explicit __normal_iterator(const _Iterator &__i) noexcept
172 reference operator*() const noexcept { return *_M_current; }
173 __normal_iterator &operator++() noexcept {
177 __normal_iterator &operator--() noexcept {
181 __normal_iterator operator+(difference_type __n) const noexcept {
182 return __normal_iterator(_M_current + __n);
184 __normal_iterator operator-(difference_type __n) const noexcept {
185 return __normal_iterator(_M_current - __n);
187 const _Iterator &base() const noexcept { return _M_current; }
189 template <typename _IteratorL, typename _IteratorR, typename _Container>
190 [[__nodiscard__]] inline bool operator!=(
191 const __normal_iterator<_IteratorL, _Container> &__lhs,
192 const __normal_iterator<_IteratorR, _Container> &__rhs) noexcept {
193 return __lhs.base() != __rhs.base();
195 template <typename _Iterator, typename _Container>
196 typename __normal_iterator<_Iterator, _Container>::difference_type operator-(
197 const __normal_iterator<_Iterator, _Container> &__lhs,
198 const __normal_iterator<_Iterator, _Container> &__rhs) noexcept {
199 return __lhs.base() - __rhs.base();
202 namespace std __attribute__((__visibility__("default"))) {
204 namespace __gnu_cxx {
206 template <typename _Compare> struct _Iter_comp_iter {
208 explicit constexpr _Iter_comp_iter(_Compare __comp)
209 : _M_comp(std::move(__comp)) {}
210 template <typename _Iterator1, typename _Iterator2>
211 constexpr bool operator()(_Iterator1 __it1, _Iterator2 __it2) {
212 return bool(_M_comp(*__it1, *__it2));
215 template <typename _Compare>
216 constexpr inline _Iter_comp_iter<_Compare> __iter_comp_iter(_Compare __comp) {
217 return _Iter_comp_iter<_Compare>(std::move(__comp));
219 template <typename _Compare> struct _Val_comp_iter {
221 explicit _Val_comp_iter(const _Iter_comp_iter<_Compare> &__comp)
222 : _M_comp(std::move(__comp._M_comp)) {}
223 template <typename _Value, typename _Iterator>
224 bool operator()(_Value &__val, _Iterator __it) {
225 return bool(_M_comp(__val, *__it));
228 template <typename _Compare>
229 inline _Val_comp_iter<_Compare>
230 __val_comp_iter(_Iter_comp_iter<_Compare> __comp) {
231 return _Val_comp_iter<_Compare>(std::move(__comp));
234 } // namespace __gnu_cxx
235 namespace std __attribute__((__visibility__("default"))) {
236 template <typename _Tp>
237 [[__nodiscard__]] constexpr inline const _Tp &min(const _Tp &__a,
241 template <typename _Tp>
242 [[__nodiscard__]] constexpr inline const _Tp &max(const _Tp &__a,
246 template <typename _Iterator>
247 inline _Iterator __niter_base(_Iterator __it) noexcept(
248 std::is_nothrow_copy_constructible<_Iterator>::value) {
251 template <typename _Iterator>
252 inline _Iterator __niter_wrap(const _Iterator &, _Iterator __res) {
255 template <bool _IsMove, bool _IsSimple, typename _Category>
257 template <typename _Tp, typename _Up>
258 static _Up *__copy_m(_Tp *__first, _Tp *__last, _Up *__result) {
259 const ptrdiff_t _Num = __last - __first;
260 return __result + _Num;
263 template <bool _IsMove, typename _II, typename _OI>
264 inline _OI __copy_move_a2(_II __first, _II __last, _OI __result) {
265 typedef typename iterator_traits<_II>::iterator_category _Category;
266 return std::__copy_move<_IsMove, __memcpyable<_OI, _II>::__value,
267 _Category>::__copy_m(__first, __last, __result);
269 template <bool _IsMove, typename _II, typename _OI>
270 inline _OI __copy_move_a1(_II __first, _II __last, _OI __result) {
271 return std::__copy_move_a2<_IsMove>(__first, __last, __result);
273 template <bool _IsMove, typename _II, typename _OI>
274 inline _OI __copy_move_a(_II __first, _II __last, _OI __result) {
275 return std::__niter_wrap(
276 __result, std::__copy_move_a1<_IsMove>(std::__niter_base(__first),
277 std::__niter_base(__last),
278 std::__niter_base(__result)));
280 template <typename _II, typename _OI>
281 inline _OI copy(_II __first, _II __last, _OI __result) {
282 return std::__copy_move_a<__is_move_iterator<_II>::__value>(
283 std::__miter_base(__first), std::__miter_base(__last), __result);
285 template <typename _Tp> class __new_allocator {
287 typedef _Tp value_type;
288 typedef std::size_t size_type;
289 __attribute__((__always_inline__)) [[__nodiscard__]] _Tp *
290 allocate(size_type __n, const void * = static_cast<const void *>(0)) {
291 return static_cast<_Tp *>(::operator new(__n * sizeof(_Tp)));
293 __attribute__((__always_inline__)) size_type max_size() const noexcept {
294 return _M_max_size();
296 __attribute__((__always_inline__)) constexpr size_type
297 _M_max_size() const noexcept {
298 return std::size_t(0x7fffffffffffffffL) / sizeof(_Tp);
301 template <typename _Tp> using __allocator_base = __new_allocator<_Tp>;
302 template <typename> struct allocator_traits;
303 template <typename _Tp> class allocator : public __allocator_base<_Tp> {};
304 template <typename _Tp> struct allocator_traits<allocator<_Tp>> {
305 using allocator_type = allocator<_Tp>;
306 using value_type = _Tp;
307 using pointer = _Tp *;
308 using size_type = std::size_t;
309 template <typename _Up> using rebind_alloc = allocator<_Up>;
310 [[__nodiscard__, __gnu__::__always_inline__]] static pointer
311 allocate(allocator_type &__a, size_type __n) {
312 return __a.allocate(__n);
314 [[__gnu__::__always_inline__]] static size_type
315 max_size(const allocator_type &__a __attribute__((__unused__))) noexcept {
316 return __a.max_size();
319 template <typename _Alloc, typename _Tp, typename = void>
320 struct __is_alloc_insertable_impl : false_type {};
321 template <typename _Alloc>
322 struct __is_move_insertable
323 : __is_alloc_insertable_impl<_Alloc, typename _Alloc::value_type>::type {
325 template <typename _Tp>
326 struct __is_move_insertable<allocator<_Tp>> : is_move_constructible<_Tp> {};
328 namespace __gnu_cxx __attribute__((__visibility__("default"))) {
329 template <typename _Alloc, typename = typename _Alloc::value_type>
330 struct __alloc_traits : std::allocator_traits<_Alloc> {
331 typedef std::allocator_traits<_Alloc> _Base_type;
332 typedef typename _Base_type::value_type value_type;
333 typedef value_type &reference;
334 template <typename _Tp> struct rebind {
335 typedef typename _Base_type::template rebind_alloc<_Tp> other;
339 namespace std __attribute__((__visibility__("default"))) {
340 template <typename _ValueType, typename _Tp>
341 constexpr bool __check_constructible() {
344 template <bool _TrivialValueTypes> struct __uninitialized_copy {
345 template <typename _InputIterator, typename _ForwardIterator>
346 static _ForwardIterator __uninit_copy(_InputIterator __first,
347 _InputIterator __last,
348 _ForwardIterator __result) {
349 return std::copy(__first, __last, __result);
352 template <typename _InputIterator, typename _ForwardIterator>
353 inline _ForwardIterator uninitialized_copy(_InputIterator __first,
354 _InputIterator __last,
355 _ForwardIterator __result) {
356 typedef typename iterator_traits<_InputIterator>::value_type _ValueType1;
357 typedef typename iterator_traits<_ForwardIterator>::value_type _ValueType2;
358 const bool __can_memmove = __is_trivial(_ValueType1);
359 using _From = decltype(*__first);
360 const bool __assignable = __is_trivial(_ValueType2) &&
361 std::__check_constructible<_ValueType2, _From>();
362 return std::__uninitialized_copy < __can_memmove &&
363 __assignable > ::__uninit_copy(__first, __last, __result);
365 template <typename _InputIterator, typename _ForwardIterator, typename _Tp>
366 inline _ForwardIterator __uninitialized_copy_a(
367 _InputIterator __first, _InputIterator __last, _ForwardIterator __result,
369 return std::uninitialized_copy(__first, __last, __result);
371 template <typename _InputIterator, typename _ForwardIterator,
373 inline _ForwardIterator __uninitialized_move_if_noexcept_a(
374 _InputIterator __first, _InputIterator __last, _ForwardIterator __result,
375 _Allocator & __alloc) {
376 return std::__uninitialized_copy_a(
378 __last, __result, __alloc);
380 template <typename _Tp, typename = void>
381 struct __is_bitwise_relocatable : is_trivial<_Tp> {};
382 template <typename _Tp, typename _Up>
383 inline __enable_if_t<std::__is_bitwise_relocatable<_Tp>::value, _Tp *>
384 __relocate_a_1(_Tp * __first, _Tp * __last, _Tp * __result,
385 [[__maybe_unused__]] allocator<_Up> & __alloc) noexcept {}
386 template <typename _InputIterator, typename _ForwardIterator,
388 inline _ForwardIterator __relocate_a(
389 _InputIterator __first, _InputIterator __last, _ForwardIterator __result,
391 __alloc) noexcept(noexcept(__relocate_a_1(std::__niter_base(__first),
392 std::__niter_base(__last),
393 std::__niter_base(__result),
395 template <class _E> class initializer_list {
396 typedef size_t size_type;
397 typedef const _E *iterator;
398 typedef const _E *const_iterator;
402 constexpr size_type size() const noexcept { return _M_len; }
403 constexpr const_iterator begin() const noexcept { return _M_array; }
404 constexpr const_iterator end() const noexcept { return begin() + size(); }
406 template <typename _Tp, typename _Alloc> struct _Vector_base {
408 typename __gnu_cxx::__alloc_traits<_Alloc>::template rebind<_Tp>::other
410 typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer pointer;
411 struct _Vector_impl_data {
414 pointer _M_end_of_storage;
415 _Vector_impl_data() noexcept
416 : _M_start(), _M_finish(), _M_end_of_storage() {}
418 struct _Vector_impl : public _Tp_alloc_type, public _Vector_impl_data {
419 _Vector_impl() noexcept(
420 is_nothrow_default_constructible<_Tp_alloc_type>::value)
421 : _Tp_alloc_type() {}
422 _Vector_impl(_Tp_alloc_type const &__a) noexcept : _Tp_alloc_type(__a) {}
423 _Vector_impl(_Tp_alloc_type &&__a, _Vector_impl &&__rv) noexcept
424 : _Tp_alloc_type(std::move(__a)), _Vector_impl_data(std::move(__rv)) {
427 typedef _Alloc allocator_type;
428 _Tp_alloc_type &_M_get_Tp_allocator() noexcept { return this->_M_impl; }
429 const _Tp_alloc_type &_M_get_Tp_allocator() const noexcept {
430 return this->_M_impl;
432 _Vector_base() = default;
433 _Vector_base(const allocator_type &__a) noexcept : _M_impl(__a) {}
434 _Vector_impl _M_impl;
435 pointer _M_allocate(size_t __n) {
436 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Tr;
437 return __n != 0 ? _Tr::allocate(_M_impl, __n) : pointer();
440 template <typename _Tp, typename _Alloc = std::allocator<_Tp>>
441 class vector : protected _Vector_base<_Tp, _Alloc> {
442 typedef _Vector_base<_Tp, _Alloc> _Base;
443 typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
444 typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type> _Alloc_traits;
445 typedef _Tp value_type;
446 typedef typename _Base::pointer pointer;
447 typedef typename _Alloc_traits::reference reference;
448 typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator;
449 typedef size_t size_type;
450 typedef _Alloc allocator_type;
451 static constexpr bool _S_nothrow_relocate(true_type) {
452 return noexcept(std::__relocate_a(
453 std::declval<pointer>(), std::declval<pointer>(),
454 std::declval<pointer>(), std::declval<_Tp_alloc_type &>()));
456 static constexpr bool _S_use_relocate() {
457 return _S_nothrow_relocate(__is_move_insertable<_Tp_alloc_type>{});
459 using _Base::_M_get_Tp_allocator;
462 vector(initializer_list<value_type> __l,
463 const allocator_type &__a = allocator_type())
465 _M_range_initialize(__l.begin(), __l.end(), random_access_iterator_tag());
467 [[__nodiscard__]] iterator begin() noexcept {
468 return iterator(this->_M_impl._M_start);
470 [[__nodiscard__]] iterator end() noexcept {
471 return iterator(this->_M_impl._M_finish);
473 [[__nodiscard__]] size_type size() const noexcept {
474 return size_type(this->_M_impl._M_finish - this->_M_impl._M_start);
476 [[__nodiscard__]] size_type max_size() const noexcept {
477 return _S_max_size(_M_get_Tp_allocator());
479 [[__nodiscard__]] reference back() noexcept { return *(end() - 1); }
480 void push_back(value_type &&__x) { emplace_back(std::move(__x)); }
481 template <typename... _Args> reference emplace_back(_Args &&...__args);
482 template <typename _ForwardIterator>
483 void _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last,
484 std::forward_iterator_tag) {
485 const size_type __n = std::distance(__first, __last);
486 this->_M_allocate(_S_check_init_len(__n, _M_get_Tp_allocator()));
487 this->_M_impl._M_finish = std::__uninitialized_copy_a(
488 __first, __last, this->_M_impl._M_start, _M_get_Tp_allocator());
490 template <typename... _Args> void _M_realloc_append(_Args &&...__args);
491 size_type _M_check_len(size_type __n, const char *__s) const {
492 const size_type __len = size() + (std::max)(size(), __n);
493 return (__len < size() || __len > max_size()) ? max_size() : __len;
495 static size_type _S_check_init_len(size_type __n,
496 const allocator_type &__a) {
497 if (__n > _S_max_size(_Tp_alloc_type(__a)))
498 __throw_length_error(
499 ("cannot create std::vector larger than max_size()"));
502 static size_type _S_max_size(const _Tp_alloc_type &__a) noexcept {
503 const size_t __diffmax =
504 __gnu_cxx::__numeric_traits<ptrdiff_t>::__max / sizeof(_Tp);
509 template <typename _Tp>
511 constexpr bool operator()(const _Tp &__x, const _Tp &__y) const {
515 template <typename _Tp, typename _Alloc>
516 template <typename... _Args>
517 typename vector<_Tp, _Alloc>::reference vector<_Tp, _Alloc>::emplace_back(
518 _Args && ...__args) {
519 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) {
520 ++this->_M_impl._M_finish;
522 _M_realloc_append(std::forward<_Args>(__args)...);
525 template <typename _Tp, typename _Alloc>
526 template <typename... _Args>
527 void vector<_Tp, _Alloc>::_M_realloc_append(_Args && ...__args) {
528 const size_type __len = _M_check_len(1u, "vector::_M_realloc_append");
529 pointer __old_start = this->_M_impl._M_start;
530 pointer __old_finish = this->_M_impl._M_finish;
531 pointer __new_start(this->_M_allocate(__len));
532 pointer __new_finish(__new_start);
534 if constexpr (_S_use_relocate()) {
535 __new_finish = std::__uninitialized_move_if_noexcept_a(
536 __old_start, __old_finish, __new_start, _M_get_Tp_allocator());
539 this->_M_impl._M_start = __new_start;
540 this->_M_impl._M_finish = __new_finish;
541 this->_M_impl._M_end_of_storage = __new_start + __len;
543 template <typename _RandomAccessIterator, typename _Compare>
544 void __unguarded_linear_insert(_RandomAccessIterator __last,
546 typename iterator_traits<_RandomAccessIterator>::value_type __val =
548 _RandomAccessIterator __next = __last;
550 while (__comp(__val, __next)) {
551 *__last = std::move(*__next);
555 template <typename _RandomAccessIterator, typename _Compare>
556 void __insertion_sort(_RandomAccessIterator __first,
557 _RandomAccessIterator __last, _Compare __comp) {
558 for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i) {
559 std::__unguarded_linear_insert(__i,
560 __gnu_cxx::__ops::__val_comp_iter(__comp));
563 template <typename _RandomAccessIterator, typename _Compare>
564 inline void __unguarded_insertion_sort(_RandomAccessIterator __first,
565 _RandomAccessIterator __last,
567 for (_RandomAccessIterator __i = __first; __i != __last; ++__i)
568 std::__unguarded_linear_insert(__i,
569 __gnu_cxx::__ops::__val_comp_iter(__comp));
571 enum { _S_threshold = 16 };
572 template <typename _RandomAccessIterator, typename _Compare>
573 void __final_insertion_sort(_RandomAccessIterator __first,
574 _RandomAccessIterator __last, _Compare __comp) {
575 if (__last - __first > int(_S_threshold)) {
576 std::__insertion_sort(__first, __first + int(_S_threshold), __comp);
577 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last,
581 template <typename _RandomAccessIterator, typename _Compare>
582 inline void __sort(_RandomAccessIterator __first,
583 _RandomAccessIterator __last, _Compare __comp) {
584 if (__first != __last) {
585 std::__final_insertion_sort(__first, __last, __comp);
588 template <typename _RandomAccessIterator, typename _Compare>
589 inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
591 std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
598 void f(int nBands, double maxZErr) {
599 for (int iBand = 0; iBand < nBands; iBand++)
602 std::vector<signed char> noDataCandVec;
603 std::vector<signed char> distCandVec = {0, 1, 10, 100, 5, 6};
604 for (signed char dist : distCandVec)
605 noDataCandVec.push_back(1);
606 std::sort(noDataCandVec.begin(), noDataCandVec.end(),
607 std::greater<double>());