Where Online Learning is simpler!
The C and C++ Include Header Files
/usr/include/c++/13/bits/deque.tcc
$ cat -n /usr/include/c++/13/bits/deque.tcc 1 // Deque implementation (out of line) -*- C++ -*- 2 3 // Copyright (C) 2001-2023 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 //
. 24 25 /* 26 * 27 * Copyright (c) 1994 28 * Hewlett-Packard Company 29 * 30 * Permission to use, copy, modify, distribute and sell this software 31 * and its documentation for any purpose is hereby granted without fee, 32 * provided that the above copyright notice appear in all copies and 33 * that both that copyright notice and this permission notice appear 34 * in supporting documentation. Hewlett-Packard Company makes no 35 * representations about the suitability of this software for any 36 * purpose. It is provided "as is" without express or implied warranty. 37 * 38 * 39 * Copyright (c) 1997 40 * Silicon Graphics Computer Systems, Inc. 41 * 42 * Permission to use, copy, modify, distribute and sell this software 43 * and its documentation for any purpose is hereby granted without fee, 44 * provided that the above copyright notice appear in all copies and 45 * that both that copyright notice and this permission notice appear 46 * in supporting documentation. Silicon Graphics makes no 47 * representations about the suitability of this software for any 48 * purpose. It is provided "as is" without express or implied warranty. 49 */ 50 51 /** @file bits/deque.tcc 52 * This is an internal header file, included by other library headers. 53 * Do not attempt to use it directly. @headername{deque} 54 */ 55 56 #ifndef _DEQUE_TCC 57 #define _DEQUE_TCC 1 58 59 #include
60 61 namespace std _GLIBCXX_VISIBILITY(default) 62 { 63 _GLIBCXX_BEGIN_NAMESPACE_VERSION 64 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER 65 66 #if __cplusplus >= 201103L 67 template
68 void 69 deque<_Tp, _Alloc>:: 70 _M_default_initialize() 71 { 72 _Map_pointer __cur; 73 __try 74 { 75 for (__cur = this->_M_impl._M_start._M_node; 76 __cur < this->_M_impl._M_finish._M_node; 77 ++__cur) 78 std::__uninitialized_default_a(*__cur, *__cur + _S_buffer_size(), 79 _M_get_Tp_allocator()); 80 std::__uninitialized_default_a(this->_M_impl._M_finish._M_first, 81 this->_M_impl._M_finish._M_cur, 82 _M_get_Tp_allocator()); 83 } 84 __catch(...) 85 { 86 std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur), 87 _M_get_Tp_allocator()); 88 __throw_exception_again; 89 } 90 } 91 #endif 92 93 template
94 deque<_Tp, _Alloc>& 95 deque<_Tp, _Alloc>:: 96 operator=(const deque& __x) 97 { 98 if (std::__addressof(__x) != this) 99 { 100 #if __cplusplus >= 201103L 101 if (_Alloc_traits::_S_propagate_on_copy_assign()) 102 { 103 if (!_Alloc_traits::_S_always_equal() 104 && _M_get_Tp_allocator() != __x._M_get_Tp_allocator()) 105 { 106 // Replacement allocator cannot free existing storage, 107 // so deallocate everything and take copy of __x's data. 108 _M_replace_map(__x, __x.get_allocator()); 109 std::__alloc_on_copy(_M_get_Tp_allocator(), 110 __x._M_get_Tp_allocator()); 111 return *this; 112 } 113 std::__alloc_on_copy(_M_get_Tp_allocator(), 114 __x._M_get_Tp_allocator()); 115 } 116 #endif 117 const size_type __len = size(); 118 if (__len >= __x.size()) 119 _M_erase_at_end(std::copy(__x.begin(), __x.end(), 120 this->_M_impl._M_start)); 121 else 122 { 123 const_iterator __mid = __x.begin() + difference_type(__len); 124 std::copy(__x.begin(), __mid, this->_M_impl._M_start); 125 _M_range_insert_aux(this->_M_impl._M_finish, __mid, __x.end(), 126 std::random_access_iterator_tag()); 127 } 128 } 129 return *this; 130 } 131 132 #if __cplusplus >= 201103L 133 template
134 template
135 #if __cplusplus > 201402L 136 typename deque<_Tp, _Alloc>::reference 137 #else 138 void 139 #endif 140 deque<_Tp, _Alloc>:: 141 emplace_front(_Args&&... __args) 142 { 143 if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_first) 144 { 145 _Alloc_traits::construct(this->_M_impl, 146 this->_M_impl._M_start._M_cur - 1, 147 std::forward<_Args>(__args)...); 148 --this->_M_impl._M_start._M_cur; 149 } 150 else 151 _M_push_front_aux(std::forward<_Args>(__args)...); 152 #if __cplusplus > 201402L 153 return front(); 154 #endif 155 } 156 157 template
158 template
159 #if __cplusplus > 201402L 160 typename deque<_Tp, _Alloc>::reference 161 #else 162 void 163 #endif 164 deque<_Tp, _Alloc>:: 165 emplace_back(_Args&&... __args) 166 { 167 if (this->_M_impl._M_finish._M_cur 168 != this->_M_impl._M_finish._M_last - 1) 169 { 170 _Alloc_traits::construct(this->_M_impl, 171 this->_M_impl._M_finish._M_cur, 172 std::forward<_Args>(__args)...); 173 ++this->_M_impl._M_finish._M_cur; 174 } 175 else 176 _M_push_back_aux(std::forward<_Args>(__args)...); 177 #if __cplusplus > 201402L 178 return back(); 179 #endif 180 } 181 #endif 182 183 #if __cplusplus >= 201103L 184 template
185 template
186 typename deque<_Tp, _Alloc>::iterator 187 deque<_Tp, _Alloc>:: 188 emplace(const_iterator __position, _Args&&... __args) 189 { 190 if (__position._M_cur == this->_M_impl._M_start._M_cur) 191 { 192 emplace_front(std::forward<_Args>(__args)...); 193 return this->_M_impl._M_start; 194 } 195 else if (__position._M_cur == this->_M_impl._M_finish._M_cur) 196 { 197 emplace_back(std::forward<_Args>(__args)...); 198 iterator __tmp = this->_M_impl._M_finish; 199 --__tmp; 200 return __tmp; 201 } 202 else 203 return _M_insert_aux(__position._M_const_cast(), 204 std::forward<_Args>(__args)...); 205 } 206 #endif 207 208 template
209 typename deque<_Tp, _Alloc>::iterator 210 deque<_Tp, _Alloc>:: 211 #if __cplusplus >= 201103L 212 insert(const_iterator __position, const value_type& __x) 213 #else 214 insert(iterator __position, const value_type& __x) 215 #endif 216 { 217 if (__position._M_cur == this->_M_impl._M_start._M_cur) 218 { 219 push_front(__x); 220 return this->_M_impl._M_start; 221 } 222 else if (__position._M_cur == this->_M_impl._M_finish._M_cur) 223 { 224 push_back(__x); 225 iterator __tmp = this->_M_impl._M_finish; 226 --__tmp; 227 return __tmp; 228 } 229 else 230 return _M_insert_aux(__position._M_const_cast(), __x); 231 } 232 233 template
234 typename deque<_Tp, _Alloc>::iterator 235 deque<_Tp, _Alloc>:: 236 _M_erase(iterator __position) 237 { 238 iterator __next = __position; 239 ++__next; 240 const difference_type __index = __position - begin(); 241 if (static_cast
(__index) < (size() >> 1)) 242 { 243 if (__position != begin()) 244 _GLIBCXX_MOVE_BACKWARD3(begin(), __position, __next); 245 pop_front(); 246 } 247 else 248 { 249 if (__next != end()) 250 _GLIBCXX_MOVE3(__next, end(), __position); 251 pop_back(); 252 } 253 return begin() + __index; 254 } 255 256 template
257 typename deque<_Tp, _Alloc>::iterator 258 deque<_Tp, _Alloc>:: 259 _M_erase(iterator __first, iterator __last) 260 { 261 if (__first == __last) 262 return __first; 263 else if (__first == begin() && __last == end()) 264 { 265 clear(); 266 return end(); 267 } 268 else 269 { 270 const difference_type __n = __last - __first; 271 const difference_type __elems_before = __first - begin(); 272 if (static_cast
(__elems_before) <= (size() - __n) / 2) 273 { 274 if (__first != begin()) 275 _GLIBCXX_MOVE_BACKWARD3(begin(), __first, __last); 276 _M_erase_at_begin(begin() + __n); 277 } 278 else 279 { 280 if (__last != end()) 281 _GLIBCXX_MOVE3(__last, end(), __first); 282 _M_erase_at_end(end() - __n); 283 } 284 return begin() + __elems_before; 285 } 286 } 287 288 template
289 template
290 void 291 deque<_Tp, _Alloc>:: 292 _M_assign_aux(_InputIterator __first, _InputIterator __last, 293 std::input_iterator_tag) 294 { 295 iterator __cur = begin(); 296 for (; __first != __last && __cur != end(); ++__cur, (void)++__first) 297 *__cur = *__first; 298 if (__first == __last) 299 _M_erase_at_end(__cur); 300 else 301 _M_range_insert_aux(end(), __first, __last, 302 std::__iterator_category(__first)); 303 } 304 305 template
306 void 307 deque<_Tp, _Alloc>:: 308 _M_fill_insert(iterator __pos, size_type __n, const value_type& __x) 309 { 310 if (__pos._M_cur == this->_M_impl._M_start._M_cur) 311 { 312 iterator __new_start = _M_reserve_elements_at_front(__n); 313 __try 314 { 315 std::__uninitialized_fill_a(__new_start, this->_M_impl._M_start, 316 __x, _M_get_Tp_allocator()); 317 this->_M_impl._M_start = __new_start; 318 } 319 __catch(...) 320 { 321 _M_destroy_nodes(__new_start._M_node, 322 this->_M_impl._M_start._M_node); 323 __throw_exception_again; 324 } 325 } 326 else if (__pos._M_cur == this->_M_impl._M_finish._M_cur) 327 { 328 iterator __new_finish = _M_reserve_elements_at_back(__n); 329 __try 330 { 331 std::__uninitialized_fill_a(this->_M_impl._M_finish, 332 __new_finish, __x, 333 _M_get_Tp_allocator()); 334 this->_M_impl._M_finish = __new_finish; 335 } 336 __catch(...) 337 { 338 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1, 339 __new_finish._M_node + 1); 340 __throw_exception_again; 341 } 342 } 343 else 344 _M_insert_aux(__pos, __n, __x); 345 } 346 347 #if __cplusplus >= 201103L 348 template
349 void 350 deque<_Tp, _Alloc>:: 351 _M_default_append(size_type __n) 352 { 353 if (__n) 354 { 355 iterator __new_finish = _M_reserve_elements_at_back(__n); 356 __try 357 { 358 std::__uninitialized_default_a(this->_M_impl._M_finish, 359 __new_finish, 360 _M_get_Tp_allocator()); 361 this->_M_impl._M_finish = __new_finish; 362 } 363 __catch(...) 364 { 365 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1, 366 __new_finish._M_node + 1); 367 __throw_exception_again; 368 } 369 } 370 } 371 372 template
373 bool 374 deque<_Tp, _Alloc>:: 375 _M_shrink_to_fit() 376 { 377 const difference_type __front_capacity 378 = (this->_M_impl._M_start._M_cur - this->_M_impl._M_start._M_first); 379 if (__front_capacity == 0) 380 return false; 381 382 const difference_type __back_capacity 383 = (this->_M_impl._M_finish._M_last - this->_M_impl._M_finish._M_cur); 384 if (__front_capacity + __back_capacity < _S_buffer_size()) 385 return false; 386 387 return std::__shrink_to_fit_aux
::_S_do_it(*this); 388 } 389 #endif 390 391 template
392 void 393 deque<_Tp, _Alloc>:: 394 _M_fill_initialize(const value_type& __value) 395 { 396 _Map_pointer __cur; 397 __try 398 { 399 for (__cur = this->_M_impl._M_start._M_node; 400 __cur < this->_M_impl._M_finish._M_node; 401 ++__cur) 402 std::__uninitialized_fill_a(*__cur, *__cur + _S_buffer_size(), 403 __value, _M_get_Tp_allocator()); 404 std::__uninitialized_fill_a(this->_M_impl._M_finish._M_first, 405 this->_M_impl._M_finish._M_cur, 406 __value, _M_get_Tp_allocator()); 407 } 408 __catch(...) 409 { 410 std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur), 411 _M_get_Tp_allocator()); 412 __throw_exception_again; 413 } 414 } 415 416 template
417 template
418 void 419 deque<_Tp, _Alloc>:: 420 _M_range_initialize(_InputIterator __first, _InputIterator __last, 421 std::input_iterator_tag) 422 { 423 this->_M_initialize_map(0); 424 __try 425 { 426 for (; __first != __last; ++__first) 427 #if __cplusplus >= 201103L 428 emplace_back(*__first); 429 #else 430 push_back(*__first); 431 #endif 432 } 433 __catch(...) 434 { 435 clear(); 436 __throw_exception_again; 437 } 438 } 439 440 template
441 template
442 void 443 deque<_Tp, _Alloc>:: 444 _M_range_initialize(_ForwardIterator __first, _ForwardIterator __last, 445 std::forward_iterator_tag) 446 { 447 const size_type __n = std::distance(__first, __last); 448 this->_M_initialize_map(_S_check_init_len(__n, _M_get_Tp_allocator())); 449 450 _Map_pointer __cur_node; 451 __try 452 { 453 for (__cur_node = this->_M_impl._M_start._M_node; 454 __cur_node < this->_M_impl._M_finish._M_node; 455 ++__cur_node) 456 { 457 if (__n < _S_buffer_size()) 458 __builtin_unreachable(); // See PR 100516 459 460 _ForwardIterator __mid = __first; 461 std::advance(__mid, _S_buffer_size()); 462 std::__uninitialized_copy_a(__first, __mid, *__cur_node, 463 _M_get_Tp_allocator()); 464 __first = __mid; 465 } 466 std::__uninitialized_copy_a(__first, __last, 467 this->_M_impl._M_finish._M_first, 468 _M_get_Tp_allocator()); 469 } 470 __catch(...) 471 { 472 std::_Destroy(this->_M_impl._M_start, 473 iterator(*__cur_node, __cur_node), 474 _M_get_Tp_allocator()); 475 __throw_exception_again; 476 } 477 } 478 479 // Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_last - 1. 480 template
481 #if __cplusplus >= 201103L 482 template
483 void 484 deque<_Tp, _Alloc>:: 485 _M_push_back_aux(_Args&&... __args) 486 #else 487 void 488 deque<_Tp, _Alloc>:: 489 _M_push_back_aux(const value_type& __t) 490 #endif 491 { 492 if (size() == max_size()) 493 __throw_length_error( 494 __N("cannot create std::deque larger than max_size()")); 495 496 _M_reserve_map_at_back(); 497 *(this->_M_impl._M_finish._M_node + 1) = this->_M_allocate_node(); 498 __try 499 { 500 #if __cplusplus >= 201103L 501 _Alloc_traits::construct(this->_M_impl, 502 this->_M_impl._M_finish._M_cur, 503 std::forward<_Args>(__args)...); 504 #else 505 this->_M_impl.construct(this->_M_impl._M_finish._M_cur, __t); 506 #endif 507 this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node 508 + 1); 509 this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_first; 510 } 511 __catch(...) 512 { 513 _M_deallocate_node(*(this->_M_impl._M_finish._M_node + 1)); 514 __throw_exception_again; 515 } 516 } 517 518 // Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_first. 519 template
520 #if __cplusplus >= 201103L 521 template
522 void 523 deque<_Tp, _Alloc>:: 524 _M_push_front_aux(_Args&&... __args) 525 #else 526 void 527 deque<_Tp, _Alloc>:: 528 _M_push_front_aux(const value_type& __t) 529 #endif 530 { 531 if (size() == max_size()) 532 __throw_length_error( 533 __N("cannot create std::deque larger than max_size()")); 534 535 _M_reserve_map_at_front(); 536 *(this->_M_impl._M_start._M_node - 1) = this->_M_allocate_node(); 537 __try 538 { 539 this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node 540 - 1); 541 this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_last - 1; 542 #if __cplusplus >= 201103L 543 _Alloc_traits::construct(this->_M_impl, 544 this->_M_impl._M_start._M_cur, 545 std::forward<_Args>(__args)...); 546 #else 547 this->_M_impl.construct(this->_M_impl._M_start._M_cur, __t); 548 #endif 549 } 550 __catch(...) 551 { 552 ++this->_M_impl._M_start; 553 _M_deallocate_node(*(this->_M_impl._M_start._M_node - 1)); 554 __throw_exception_again; 555 } 556 } 557 558 // Called only if _M_impl._M_finish._M_cur == _M_impl._M_finish._M_first. 559 template
560 void deque<_Tp, _Alloc>:: 561 _M_pop_back_aux() 562 { 563 _M_deallocate_node(this->_M_impl._M_finish._M_first); 564 this->_M_impl._M_finish._M_set_node(this->_M_impl._M_finish._M_node - 1); 565 this->_M_impl._M_finish._M_cur = this->_M_impl._M_finish._M_last - 1; 566 _Alloc_traits::destroy(_M_get_Tp_allocator(), 567 this->_M_impl._M_finish._M_cur); 568 } 569 570 // Called only if _M_impl._M_start._M_cur == _M_impl._M_start._M_last - 1. 571 // Note that if the deque has at least one element (a precondition for this 572 // member function), and if 573 // _M_impl._M_start._M_cur == _M_impl._M_start._M_last, 574 // then the deque must have at least two nodes. 575 template
576 void deque<_Tp, _Alloc>:: 577 _M_pop_front_aux() 578 { 579 _Alloc_traits::destroy(_M_get_Tp_allocator(), 580 this->_M_impl._M_start._M_cur); 581 _M_deallocate_node(this->_M_impl._M_start._M_first); 582 this->_M_impl._M_start._M_set_node(this->_M_impl._M_start._M_node + 1); 583 this->_M_impl._M_start._M_cur = this->_M_impl._M_start._M_first; 584 } 585 586 template
587 template
588 void 589 deque<_Tp, _Alloc>:: 590 _M_range_insert_aux(iterator __pos, 591 _InputIterator __first, _InputIterator __last, 592 std::input_iterator_tag) 593 { std::copy(__first, __last, std::inserter(*this, __pos)); } 594 595 template
596 template
597 void 598 deque<_Tp, _Alloc>:: 599 _M_range_insert_aux(iterator __pos, 600 _ForwardIterator __first, _ForwardIterator __last, 601 std::forward_iterator_tag) 602 { 603 const size_type __n = std::distance(__first, __last); 604 if (__pos._M_cur == this->_M_impl._M_start._M_cur) 605 { 606 iterator __new_start = _M_reserve_elements_at_front(__n); 607 __try 608 { 609 std::__uninitialized_copy_a(__first, __last, __new_start, 610 _M_get_Tp_allocator()); 611 this->_M_impl._M_start = __new_start; 612 } 613 __catch(...) 614 { 615 _M_destroy_nodes(__new_start._M_node, 616 this->_M_impl._M_start._M_node); 617 __throw_exception_again; 618 } 619 } 620 else if (__pos._M_cur == this->_M_impl._M_finish._M_cur) 621 { 622 iterator __new_finish = _M_reserve_elements_at_back(__n); 623 __try 624 { 625 std::__uninitialized_copy_a(__first, __last, 626 this->_M_impl._M_finish, 627 _M_get_Tp_allocator()); 628 this->_M_impl._M_finish = __new_finish; 629 } 630 __catch(...) 631 { 632 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1, 633 __new_finish._M_node + 1); 634 __throw_exception_again; 635 } 636 } 637 else 638 _M_insert_aux(__pos, __first, __last, __n); 639 } 640 641 template
642 #if __cplusplus >= 201103L 643 template
644 typename deque<_Tp, _Alloc>::iterator 645 deque<_Tp, _Alloc>:: 646 _M_insert_aux(iterator __pos, _Args&&... __args) 647 { 648 value_type __x_copy(std::forward<_Args>(__args)...); // XXX copy 649 #else 650 typename deque<_Tp, _Alloc>::iterator 651 deque<_Tp, _Alloc>:: 652 _M_insert_aux(iterator __pos, const value_type& __x) 653 { 654 value_type __x_copy = __x; // XXX copy 655 #endif 656 difference_type __index = __pos - this->_M_impl._M_start; 657 if (static_cast
(__index) < size() / 2) 658 { 659 push_front(_GLIBCXX_MOVE(front())); 660 iterator __front1 = this->_M_impl._M_start; 661 ++__front1; 662 iterator __front2 = __front1; 663 ++__front2; 664 __pos = this->_M_impl._M_start + __index; 665 iterator __pos1 = __pos; 666 ++__pos1; 667 _GLIBCXX_MOVE3(__front2, __pos1, __front1); 668 } 669 else 670 { 671 push_back(_GLIBCXX_MOVE(back())); 672 iterator __back1 = this->_M_impl._M_finish; 673 --__back1; 674 iterator __back2 = __back1; 675 --__back2; 676 __pos = this->_M_impl._M_start + __index; 677 _GLIBCXX_MOVE_BACKWARD3(__pos, __back2, __back1); 678 } 679 *__pos = _GLIBCXX_MOVE(__x_copy); 680 return __pos; 681 } 682 683 template
684 void 685 deque<_Tp, _Alloc>:: 686 _M_insert_aux(iterator __pos, size_type __n, const value_type& __x) 687 { 688 const difference_type __elems_before = __pos - this->_M_impl._M_start; 689 const size_type __length = this->size(); 690 value_type __x_copy = __x; 691 if (__elems_before < difference_type(__length / 2)) 692 { 693 iterator __new_start = _M_reserve_elements_at_front(__n); 694 iterator __old_start = this->_M_impl._M_start; 695 __pos = this->_M_impl._M_start + __elems_before; 696 __try 697 { 698 if (__elems_before >= difference_type(__n)) 699 { 700 iterator __start_n = (this->_M_impl._M_start 701 + difference_type(__n)); 702 std::__uninitialized_move_a(this->_M_impl._M_start, 703 __start_n, __new_start, 704 _M_get_Tp_allocator()); 705 this->_M_impl._M_start = __new_start; 706 _GLIBCXX_MOVE3(__start_n, __pos, __old_start); 707 std::fill(__pos - difference_type(__n), __pos, __x_copy); 708 } 709 else 710 { 711 std::__uninitialized_move_fill(this->_M_impl._M_start, 712 __pos, __new_start, 713 this->_M_impl._M_start, 714 __x_copy, 715 _M_get_Tp_allocator()); 716 this->_M_impl._M_start = __new_start; 717 std::fill(__old_start, __pos, __x_copy); 718 } 719 } 720 __catch(...) 721 { 722 _M_destroy_nodes(__new_start._M_node, 723 this->_M_impl._M_start._M_node); 724 __throw_exception_again; 725 } 726 } 727 else 728 { 729 iterator __new_finish = _M_reserve_elements_at_back(__n); 730 iterator __old_finish = this->_M_impl._M_finish; 731 const difference_type __elems_after = 732 difference_type(__length) - __elems_before; 733 __pos = this->_M_impl._M_finish - __elems_after; 734 __try 735 { 736 if (__elems_after > difference_type(__n)) 737 { 738 iterator __finish_n = (this->_M_impl._M_finish 739 - difference_type(__n)); 740 std::__uninitialized_move_a(__finish_n, 741 this->_M_impl._M_finish, 742 this->_M_impl._M_finish, 743 _M_get_Tp_allocator()); 744 this->_M_impl._M_finish = __new_finish; 745 _GLIBCXX_MOVE_BACKWARD3(__pos, __finish_n, __old_finish); 746 std::fill(__pos, __pos + difference_type(__n), __x_copy); 747 } 748 else 749 { 750 std::__uninitialized_fill_move(this->_M_impl._M_finish, 751 __pos + difference_type(__n), 752 __x_copy, __pos, 753 this->_M_impl._M_finish, 754 _M_get_Tp_allocator()); 755 this->_M_impl._M_finish = __new_finish; 756 std::fill(__pos, __old_finish, __x_copy); 757 } 758 } 759 __catch(...) 760 { 761 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1, 762 __new_finish._M_node + 1); 763 __throw_exception_again; 764 } 765 } 766 } 767 768 template
769 template
770 void 771 deque<_Tp, _Alloc>:: 772 _M_insert_aux(iterator __pos, 773 _ForwardIterator __first, _ForwardIterator __last, 774 size_type __n) 775 { 776 const difference_type __elemsbefore = __pos - this->_M_impl._M_start; 777 const size_type __length = size(); 778 if (static_cast
(__elemsbefore) < __length / 2) 779 { 780 iterator __new_start = _M_reserve_elements_at_front(__n); 781 iterator __old_start = this->_M_impl._M_start; 782 __pos = this->_M_impl._M_start + __elemsbefore; 783 __try 784 { 785 if (__elemsbefore >= difference_type(__n)) 786 { 787 iterator __start_n = (this->_M_impl._M_start 788 + difference_type(__n)); 789 std::__uninitialized_move_a(this->_M_impl._M_start, 790 __start_n, __new_start, 791 _M_get_Tp_allocator()); 792 this->_M_impl._M_start = __new_start; 793 _GLIBCXX_MOVE3(__start_n, __pos, __old_start); 794 std::copy(__first, __last, __pos - difference_type(__n)); 795 } 796 else 797 { 798 _ForwardIterator __mid = __first; 799 std::advance(__mid, difference_type(__n) - __elemsbefore); 800 std::__uninitialized_move_copy(this->_M_impl._M_start, 801 __pos, __first, __mid, 802 __new_start, 803 _M_get_Tp_allocator()); 804 this->_M_impl._M_start = __new_start; 805 std::copy(__mid, __last, __old_start); 806 } 807 } 808 __catch(...) 809 { 810 _M_destroy_nodes(__new_start._M_node, 811 this->_M_impl._M_start._M_node); 812 __throw_exception_again; 813 } 814 } 815 else 816 { 817 iterator __new_finish = _M_reserve_elements_at_back(__n); 818 iterator __old_finish = this->_M_impl._M_finish; 819 const difference_type __elemsafter = 820 difference_type(__length) - __elemsbefore; 821 __pos = this->_M_impl._M_finish - __elemsafter; 822 __try 823 { 824 if (__elemsafter > difference_type(__n)) 825 { 826 iterator __finish_n = (this->_M_impl._M_finish 827 - difference_type(__n)); 828 std::__uninitialized_move_a(__finish_n, 829 this->_M_impl._M_finish, 830 this->_M_impl._M_finish, 831 _M_get_Tp_allocator()); 832 this->_M_impl._M_finish = __new_finish; 833 _GLIBCXX_MOVE_BACKWARD3(__pos, __finish_n, __old_finish); 834 std::copy(__first, __last, __pos); 835 } 836 else 837 { 838 _ForwardIterator __mid = __first; 839 std::advance(__mid, __elemsafter); 840 std::__uninitialized_copy_move(__mid, __last, __pos, 841 this->_M_impl._M_finish, 842 this->_M_impl._M_finish, 843 _M_get_Tp_allocator()); 844 this->_M_impl._M_finish = __new_finish; 845 std::copy(__first, __mid, __pos); 846 } 847 } 848 __catch(...) 849 { 850 _M_destroy_nodes(this->_M_impl._M_finish._M_node + 1, 851 __new_finish._M_node + 1); 852 __throw_exception_again; 853 } 854 } 855 } 856 857 template
858 void 859 deque<_Tp, _Alloc>:: 860 _M_destroy_data_aux(iterator __first, iterator __last) 861 { 862 for (_Map_pointer __node = __first._M_node + 1; 863 __node < __last._M_node; ++__node) 864 std::_Destroy(*__node, *__node + _S_buffer_size(), 865 _M_get_Tp_allocator()); 866 867 if (__first._M_node != __last._M_node) 868 { 869 std::_Destroy(__first._M_cur, __first._M_last, 870 _M_get_Tp_allocator()); 871 std::_Destroy(__last._M_first, __last._M_cur, 872 _M_get_Tp_allocator()); 873 } 874 else 875 std::_Destroy(__first._M_cur, __last._M_cur, 876 _M_get_Tp_allocator()); 877 } 878 879 template
880 void 881 deque<_Tp, _Alloc>:: 882 _M_new_elements_at_front(size_type __new_elems) 883 { 884 if (this->max_size() - this->size() < __new_elems) 885 __throw_length_error(__N("deque::_M_new_elements_at_front")); 886 887 const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1) 888 / _S_buffer_size()); 889 _M_reserve_map_at_front(__new_nodes); 890 size_type __i; 891 __try 892 { 893 for (__i = 1; __i <= __new_nodes; ++__i) 894 *(this->_M_impl._M_start._M_node - __i) = this->_M_allocate_node(); 895 } 896 __catch(...) 897 { 898 for (size_type __j = 1; __j < __i; ++__j) 899 _M_deallocate_node(*(this->_M_impl._M_start._M_node - __j)); 900 __throw_exception_again; 901 } 902 } 903 904 template
905 void 906 deque<_Tp, _Alloc>:: 907 _M_new_elements_at_back(size_type __new_elems) 908 { 909 if (this->max_size() - this->size() < __new_elems) 910 __throw_length_error(__N("deque::_M_new_elements_at_back")); 911 912 const size_type __new_nodes = ((__new_elems + _S_buffer_size() - 1) 913 / _S_buffer_size()); 914 _M_reserve_map_at_back(__new_nodes); 915 size_type __i; 916 __try 917 { 918 for (__i = 1; __i <= __new_nodes; ++__i) 919 *(this->_M_impl._M_finish._M_node + __i) = this->_M_allocate_node(); 920 } 921 __catch(...) 922 { 923 for (size_type __j = 1; __j < __i; ++__j) 924 _M_deallocate_node(*(this->_M_impl._M_finish._M_node + __j)); 925 __throw_exception_again; 926 } 927 } 928 929 template
930 void 931 deque<_Tp, _Alloc>:: 932 _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front) 933 { 934 const size_type __old_num_nodes 935 = this->_M_impl._M_finish._M_node - this->_M_impl._M_start._M_node + 1; 936 const size_type __new_num_nodes = __old_num_nodes + __nodes_to_add; 937 938 _Map_pointer __new_nstart; 939 if (this->_M_impl._M_map_size > 2 * __new_num_nodes) 940 { 941 __new_nstart = this->_M_impl._M_map + (this->_M_impl._M_map_size 942 - __new_num_nodes) / 2 943 + (__add_at_front ? __nodes_to_add : 0); 944 if (__new_nstart < this->_M_impl._M_start._M_node) 945 std::copy(this->_M_impl._M_start._M_node, 946 this->_M_impl._M_finish._M_node + 1, 947 __new_nstart); 948 else 949 std::copy_backward(this->_M_impl._M_start._M_node, 950 this->_M_impl._M_finish._M_node + 1, 951 __new_nstart + __old_num_nodes); 952 } 953 else 954 { 955 size_type __new_map_size = this->_M_impl._M_map_size 956 + std::max(this->_M_impl._M_map_size, 957 __nodes_to_add) + 2; 958 959 _Map_pointer __new_map = this->_M_allocate_map(__new_map_size); 960 __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2 961 + (__add_at_front ? __nodes_to_add : 0); 962 std::copy(this->_M_impl._M_start._M_node, 963 this->_M_impl._M_finish._M_node + 1, 964 __new_nstart); 965 _M_deallocate_map(this->_M_impl._M_map, this->_M_impl._M_map_size); 966 967 this->_M_impl._M_map = __new_map; 968 this->_M_impl._M_map_size = __new_map_size; 969 } 970 971 this->_M_impl._M_start._M_set_node(__new_nstart); 972 this->_M_impl._M_finish._M_set_node(__new_nstart + __old_num_nodes - 1); 973 } 974 975 _GLIBCXX_END_NAMESPACE_CONTAINER 976 977 // Overload for deque::iterators, exploiting the "segmented-iterator 978 // optimization". 979 template
980 void 981 __fill_a1(const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>& __first, 982 const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*>& __last, 983 const _VTp& __value) 984 { 985 typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> _Iter; 986 if (__first._M_node != __last._M_node) 987 { 988 std::__fill_a1(__first._M_cur, __first._M_last, __value); 989 990 for (typename _Iter::_Map_pointer __node = __first._M_node + 1; 991 __node < __last._M_node; ++__node) 992 std::__fill_a1(*__node, *__node + _Iter::_S_buffer_size(), __value); 993 994 std::__fill_a1(__last._M_first, __last._M_cur, __value); 995 } 996 else 997 std::__fill_a1(__first._M_cur, __last._M_cur, __value); 998 } 999 1000 template
1002 _OI 1003 __copy_move_dit(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first, 1004 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last, 1005 _OI __result) 1006 { 1007 typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter; 1008 if (__first._M_node != __last._M_node) 1009 { 1010 __result 1011 = std::__copy_move_a1<_IsMove>(__first._M_cur, __first._M_last, 1012 __result); 1013 1014 for (typename _Iter::_Map_pointer __node = __first._M_node + 1; 1015 __node != __last._M_node; ++__node) 1016 __result 1017 = std::__copy_move_a1<_IsMove>(*__node, 1018 *__node + _Iter::_S_buffer_size(), 1019 __result); 1020 1021 return std::__copy_move_a1<_IsMove>(__last._M_first, __last._M_cur, 1022 __result); 1023 } 1024 1025 return std::__copy_move_a1<_IsMove>(__first._M_cur, __last._M_cur, 1026 __result); 1027 } 1028 1029 template
1031 _OI 1032 __copy_move_a1(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first, 1033 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last, 1034 _OI __result) 1035 { return __copy_move_dit<_IsMove>(__first, __last, __result); } 1036 1037 template
1039 _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> 1040 __copy_move_a1(_GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first, 1041 _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last, 1042 _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result) 1043 { return __copy_move_dit<_IsMove>(__first, __last, __result); } 1044 1045 template
1046 typename __gnu_cxx::__enable_if< 1047 __is_random_access_iter<_II>::__value, 1048 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> >::__type 1049 __copy_move_a1(_II __first, _II __last, 1050 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> __result) 1051 { 1052 typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> _Iter; 1053 typedef typename _Iter::difference_type difference_type; 1054 1055 difference_type __len = __last - __first; 1056 while (__len > 0) 1057 { 1058 const difference_type __clen 1059 = std::min(__len, __result._M_last - __result._M_cur); 1060 std::__copy_move_a1<_IsMove>(__first, __first + __clen, 1061 __result._M_cur); 1062 1063 __first += __clen; 1064 __result += __clen; 1065 __len -= __clen; 1066 } 1067 1068 return __result; 1069 } 1070 1071 template
1072 typename __gnu_cxx::__enable_if< 1073 __is_char<_CharT>::__value, 1074 _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> >::__type 1075 __copy_move_a2( 1076 istreambuf_iterator<_CharT, char_traits<_CharT> > __first, 1077 istreambuf_iterator<_CharT, char_traits<_CharT> > __last, 1078 _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> __result) 1079 { 1080 if (__first == __last) 1081 return __result; 1082 1083 for (;;) 1084 { 1085 const std::ptrdiff_t __len = __result._M_last - __result._M_cur; 1086 const std::ptrdiff_t __nb 1087 = std::__copy_n_a(__first, __len, __result._M_cur, false) 1088 - __result._M_cur; 1089 __result += __nb; 1090 1091 if (__nb != __len) 1092 break; 1093 } 1094 1095 return __result; 1096 } 1097 1098 template
1099 typename __gnu_cxx::__enable_if< 1100 __is_char<_CharT>::__value, 1101 _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> >::__type 1102 __copy_n_a( 1103 istreambuf_iterator<_CharT, char_traits<_CharT> > __it, _Size __size, 1104 _GLIBCXX_STD_C::_Deque_iterator<_CharT, _CharT&, _CharT*> __result, 1105 bool __strict) 1106 { 1107 if (__size == 0) 1108 return __result; 1109 1110 do 1111 { 1112 const _Size __len 1113 = std::min<_Size>(__result._M_last - __result._M_cur, __size); 1114 std::__copy_n_a(__it, __len, __result._M_cur, __strict); 1115 __result += __len; 1116 __size -= __len; 1117 } 1118 while (__size != 0); 1119 return __result; 1120 } 1121 1122 template
1124 _OI 1125 __copy_move_backward_dit( 1126 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first, 1127 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last, 1128 _OI __result) 1129 { 1130 typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter; 1131 if (__first._M_node != __last._M_node) 1132 { 1133 __result = std::__copy_move_backward_a1<_IsMove>( 1134 __last._M_first, __last._M_cur, __result); 1135 1136 for (typename _Iter::_Map_pointer __node = __last._M_node - 1; 1137 __node != __first._M_node; --__node) 1138 __result = std::__copy_move_backward_a1<_IsMove>( 1139 *__node, *__node + _Iter::_S_buffer_size(), __result); 1140 1141 return std::__copy_move_backward_a1<_IsMove>( 1142 __first._M_cur, __first._M_last, __result); 1143 } 1144 1145 return std::__copy_move_backward_a1<_IsMove>( 1146 __first._M_cur, __last._M_cur, __result); 1147 } 1148 1149 template
1151 _OI 1152 __copy_move_backward_a1( 1153 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first, 1154 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last, 1155 _OI __result) 1156 { return __copy_move_backward_dit<_IsMove>(__first, __last, __result); } 1157 1158 template
1160 _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> 1161 __copy_move_backward_a1( 1162 _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __first, 1163 _GLIBCXX_STD_C::_Deque_iterator<_ITp, _IRef, _IPtr> __last, 1164 _GLIBCXX_STD_C::_Deque_iterator<_OTp, _OTp&, _OTp*> __result) 1165 { return __copy_move_backward_dit<_IsMove>(__first, __last, __result); } 1166 1167 template
1168 typename __gnu_cxx::__enable_if< 1169 __is_random_access_iter<_II>::__value, 1170 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> >::__type 1171 __copy_move_backward_a1(_II __first, _II __last, 1172 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> __result) 1173 { 1174 typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Tp&, _Tp*> _Iter; 1175 typedef typename _Iter::difference_type difference_type; 1176 1177 difference_type __len = __last - __first; 1178 while (__len > 0) 1179 { 1180 difference_type __rlen = __result._M_cur - __result._M_first; 1181 _Tp* __rend = __result._M_cur; 1182 if (!__rlen) 1183 { 1184 __rlen = _Iter::_S_buffer_size(); 1185 __rend = *(__result._M_node - 1) + __rlen; 1186 } 1187 1188 const difference_type __clen = std::min(__len, __rlen); 1189 std::__copy_move_backward_a1<_IsMove>(__last - __clen, __last, __rend); 1190 1191 __last -= __clen; 1192 __result -= __clen; 1193 __len -= __clen; 1194 } 1195 1196 return __result; 1197 } 1198 1199 template
1200 bool 1201 __equal_dit( 1202 const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>& __first1, 1203 const _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr>& __last1, 1204 _II __first2) 1205 { 1206 typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter; 1207 if (__first1._M_node != __last1._M_node) 1208 { 1209 if (!std::__equal_aux1(__first1._M_cur, __first1._M_last, __first2)) 1210 return false; 1211 1212 __first2 += __first1._M_last - __first1._M_cur; 1213 for (typename _Iter::_Map_pointer __node = __first1._M_node + 1; 1214 __node != __last1._M_node; 1215 __first2 += _Iter::_S_buffer_size(), ++__node) 1216 if (!std::__equal_aux1(*__node, *__node + _Iter::_S_buffer_size(), 1217 __first2)) 1218 return false; 1219 1220 return std::__equal_aux1(__last1._M_first, __last1._M_cur, __first2); 1221 } 1222 1223 return std::__equal_aux1(__first1._M_cur, __last1._M_cur, __first2); 1224 } 1225 1226 template
1227 typename __gnu_cxx::__enable_if< 1228 __is_random_access_iter<_II>::__value, bool>::__type 1229 __equal_aux1(_GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first1, 1230 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __last1, 1231 _II __first2) 1232 { return std::__equal_dit(__first1, __last1, __first2); } 1233 1234 template
1236 bool 1237 __equal_aux1(_GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __first1, 1238 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __last1, 1239 _GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __first2) 1240 { return std::__equal_dit(__first1, __last1, __first2); } 1241 1242 template
1243 typename __gnu_cxx::__enable_if< 1244 __is_random_access_iter<_II>::__value, bool>::__type 1245 __equal_aux1(_II __first1, _II __last1, 1246 _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> __first2) 1247 { 1248 typedef _GLIBCXX_STD_C::_Deque_iterator<_Tp, _Ref, _Ptr> _Iter; 1249 typedef typename _Iter::difference_type difference_type; 1250 1251 difference_type __len = __last1 - __first1; 1252 while (__len > 0) 1253 { 1254 const difference_type __clen 1255 = std::min(__len, __first2._M_last - __first2._M_cur); 1256 if (!std::__equal_aux1(__first1, __first1 + __clen, __first2._M_cur)) 1257 return false; 1258 1259 __first1 += __clen; 1260 __len -= __clen; 1261 __first2 += __clen; 1262 } 1263 1264 return true; 1265 } 1266 1267 template
1268 int 1269 __lex_cmp_dit( 1270 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref, _Ptr> __first1, 1271 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref, _Ptr> __last1, 1272 const _Tp2* __first2, const _Tp2* __last2) 1273 { 1274 const bool __simple = 1275 (__is_memcmp_ordered_with<_Tp1, _Tp2>::__value 1276 && __is_pointer<_Ptr>::__value 1277 #if __cplusplus > 201703L && __cpp_lib_concepts 1278 // For C++20 iterator_traits
::value_type is non-volatile 1279 // so __is_byte
could be true, but we can't use memcmp with 1280 // volatile data. 1281 && !is_volatile_v<_Tp1> 1282 && !is_volatile_v<_Tp2> 1283 #endif 1284 ); 1285 typedef std::__lexicographical_compare<__simple> _Lc; 1286 1287 while (__first1._M_node != __last1._M_node) 1288 { 1289 const ptrdiff_t __len1 = __first1._M_last - __first1._M_cur; 1290 const ptrdiff_t __len2 = __last2 - __first2; 1291 const ptrdiff_t __len = std::min(__len1, __len2); 1292 // if __len1 > __len2 this will return a positive value: 1293 if (int __ret = _Lc::__3way(__first1._M_cur, __first1._M_last, 1294 __first2, __first2 + __len)) 1295 return __ret; 1296 1297 __first1 += __len; 1298 __first2 += __len; 1299 } 1300 return _Lc::__3way(__first1._M_cur, __last1._M_cur, 1301 __first2, __last2); 1302 } 1303 1304 template
1306 inline bool 1307 __lexicographical_compare_aux1( 1308 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __first1, 1309 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __last1, 1310 _Tp2* __first2, _Tp2* __last2) 1311 { return std::__lex_cmp_dit(__first1, __last1, __first2, __last2) < 0; } 1312 1313 template
1315 inline bool 1316 __lexicographical_compare_aux1(_Tp1* __first1, _Tp1* __last1, 1317 _GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __first2, 1318 _GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __last2) 1319 { return std::__lex_cmp_dit(__first2, __last2, __first1, __last1) > 0; } 1320 1321 template
1323 inline bool 1324 __lexicographical_compare_aux1( 1325 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __first1, 1326 _GLIBCXX_STD_C::_Deque_iterator<_Tp1, _Ref1, _Ptr1> __last1, 1327 _GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __first2, 1328 _GLIBCXX_STD_C::_Deque_iterator<_Tp2, _Ref2, _Ptr2> __last2) 1329 { 1330 const bool __simple = 1331 (__is_memcmp_ordered_with<_Tp1, _Tp2>::__value 1332 && __is_pointer<_Ptr1>::__value 1333 && __is_pointer<_Ptr2>::__value 1334 #if __cplusplus > 201703L && __cpp_lib_concepts 1335 // For C++20 iterator_traits
::value_type is non-volatile 1336 // so __is_byte
could be true, but we can't use memcmp with 1337 // volatile data. 1338 && !is_volatile_v<_Tp1> 1339 && !is_volatile_v<_Tp2> 1340 #endif 1341 ); 1342 typedef std::__lexicographical_compare<__simple> _Lc; 1343 1344 while (__first1 != __last1) 1345 { 1346 const ptrdiff_t __len2 = __first2._M_node == __last2._M_node 1347 ? __last2._M_cur - __first2._M_cur 1348 : __first2._M_last - __first2._M_cur; 1349 if (__len2 == 0) 1350 return false; 1351 const ptrdiff_t __len1 = __first1._M_node == __last1._M_node 1352 ? __last1._M_cur - __first1._M_cur 1353 : __first1._M_last - __first1._M_cur; 1354 const ptrdiff_t __len = std::min(__len1, __len2); 1355 if (int __ret = _Lc::__3way(__first1._M_cur, __first1._M_cur + __len, 1356 __first2._M_cur, __first2._M_cur + __len)) 1357 return __ret < 0; 1358 1359 __first1 += __len; 1360 __first2 += __len; 1361 } 1362 1363 return __last2 != __first2; 1364 } 1365 1366 _GLIBCXX_END_NAMESPACE_VERSION 1367 } // namespace std 1368 1369 #endif
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2025 MyWebUniversity.com ™