269 static_assert(
is_object_v<T>,
"deque only contains object types.");
290 using map_allocator =
typename Alloc::template rebind<pointer>::other;
295 compressed_pair<allocator_type, size_type> map_size_pair_{default_construct_tag{}, 0};
297 compressed_pair<map_allocator, map_pointer> map_pair_{default_construct_tag{},
nullptr};
301 static constexpr size_t init_map_size = 8;
308 map_pointer create_map(
const size_t n) {
309 map_pointer map = map_pair_.get_base().allocate(n);
310 for (
size_t i = 0; i < n; ++i) {
311 *(map + i) =
nullptr;
323 void create_nodes(map_pointer start, map_pointer finish) {
324 map_pointer cur =
nullptr;
326 for (cur = start; cur <= finish; ++cur) {
327 *cur = map_size_pair_.get_base().allocate(
buffer_size);
330 while (cur != start) {
332 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
347 for (map_pointer cur = start; cur <= finish; ++cur) {
348 if (*cur ==
nullptr) {
351 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
362 void create_map_and_nodes(
const size_type n) {
364 map_size_pair_.value = _NEFORCE
max(init_map_size, node_nums + 2);
367 map_pair_.value = deque::create_map(map_size_pair_.value);
369 map_pair_.value =
nullptr;
370 map_size_pair_.value = 0;
374 map_pointer nstart = map_pair_.value + (map_size_pair_.value - node_nums) / 2;
375 map_pointer nfinish = node_nums == 0 ? nstart : nstart + node_nums - 1;
378 deque::create_nodes(nstart, nfinish);
380 deque::destroy_nodes(map_pair_.value, map_pair_.value + map_size_pair_.value - 1);
381 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
382 map_pair_.value =
nullptr;
383 map_size_pair_.value = 0;
387 start_.change_buff(nstart);
388 finish_.change_buff(nfinish);
389 start_.current_ = start_.first_;
392 start_.container_ =
this;
393 finish_.container_ =
this;
401 void fill_initialize(
const size_type n,
const T& value) {
402 deque::create_map_and_nodes(n);
407 for (map_pointer cur = start_.node_; cur < finish_.node_; ++cur) {
419 template <
typename Iterator>
421 deque::create_map_and_nodes(0);
432 template <
typename Iterator>
434 deque::create_map_and_nodes(_NEFORCE
distance(first, last));
436 for (map_pointer cur = start_.node_; cur < finish_.node_; ++cur) {
450 void assign_aux_n(
size_type n,
const T& value) {
466 template <
typename Iterator>
479 template <
typename Iterator>
481 auto first1 =
begin();
484 for (; first != last && first1 != last1; ++first, ++first1) {
488 if (first1 != last1) {
504 void reallocate_map(
const size_type n,
const bool add_at_front) {
505 const size_type begin_left = start_.current_ - start_.first_;
507 if (add_at_front && begin_left < n) {
508 const size_t needed = (n - begin_left) /
buffer_size + 1;
510 if (needed >
static_cast<size_type>(start_.node_ - map_pair_.value)) {
512 _NEFORCE
max(map_size_pair_.value << 1, map_size_pair_.value + needed + init_map_size);
513 map_pointer map = deque::create_map(new_size);
514 const size_type old_buf = finish_.node_ - start_.node_ + 1;
515 const size_type new_buf = needed + old_buf;
517 auto begin = map + (new_size - new_buf) / 2;
518 auto mid =
begin + needed;
519 auto end = mid + old_buf;
521 deque::create_nodes(
begin, mid - 1);
522 for (
auto begin1 = mid, begin2 = start_.node_; begin1 !=
end; ++begin1, ++begin2) {
526 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
527 map_pair_.value = map;
528 map_size_pair_.value = new_size;
529 start_ =
iterator(*mid + (start_.current_ - start_.first_), mid,
this);
530 finish_ =
iterator(*(
end - 1) + (finish_.current_ - finish_.first_),
end - 1,
this);
534 deque::create_nodes(start_.node_ - needed, start_.node_ - 1);
538 const size_type end_left = finish_.last_ - finish_.current_ - 1;
540 if (!add_at_front && end_left < n) {
544 if (needed >
static_cast<size_type>((map_pair_.value + map_size_pair_.value) - finish_.node_ - 1)) {
546 _NEFORCE
max(map_size_pair_.value << 1, map_size_pair_.value + needed + init_map_size);
547 map_pointer map = deque::create_map(new_size);
548 const size_type old_buf = finish_.node_ - start_.node_ + 1;
549 const size_type new_buf = needed + old_buf;
551 auto begin = map + (new_size - new_buf) / 2;
552 auto mid =
begin + old_buf;
553 auto end = mid + needed;
555 for (
auto begin1 =
begin, begin2 = start_.node_; begin1 != mid; ++begin1, ++begin2) {
558 deque::create_nodes(mid,
end - 1);
560 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
561 map_pair_.value = map;
562 map_size_pair_.value = new_size;
564 finish_ =
iterator(*(mid - 1) + (finish_.current_ - finish_.first_), mid - 1,
this);
568 deque::create_nodes(finish_.node_ + 1, finish_.node_ + needed);
580 template <
typename Iterator>
581 void insert_ranges_n(
iterator position, Iterator first, Iterator last,
size_type n) {
585 deque::reallocate_map(n,
true);
586 auto old_start = start_;
587 auto new_start = start_ - n;
588 position = start_ + dist_before;
591 if (dist_before >= n) {
595 _NEFORCE
copy(start_n, position, old_start);
596 _NEFORCE
copy(first, last, position - n);
598 auto mid = _NEFORCE
next(first, n - dist_before);
601 _NEFORCE
copy(mid, last, old_start);
604 if (new_start.node_ != start_.node_) {
605 deque::destroy_nodes(new_start.node_, start_.node_ - 1);
610 deque::reallocate_map(n,
false);
611 auto old_finish = finish_;
612 auto new_finish = finish_ + n;
614 position = finish_ - dist_after;
617 if (dist_after > n) {
618 auto finish_n = finish_ - n;
620 finish_ = new_finish;
622 _NEFORCE
copy(first, last, position);
624 auto mid = _NEFORCE
next(first, dist_after);
626 finish_ = new_finish;
627 _NEFORCE
copy(first, mid, position);
630 if (new_finish.node_ != finish_.node_) {
631 deque::destroy_nodes(finish_.node_ + 1, new_finish.node_);
645 template <
typename Iterator>
648 const size_type dist_before = position - start_;
650 if (dist_before <
size() / 2) {
651 deque::reallocate_map(n,
true);
653 deque::reallocate_map(n,
false);
656 position = start_ + dist_before;
659 for (
size_type i = 0; i < n; ++i, --cur) {
672 template <
typename Iterator>
676 if (position.current_ == start_.current_) {
677 deque::reallocate_map(n,
true);
678 auto new_start = start_ - n;
683 if (new_start.node_ != start_.node_) {
684 deque::destroy_nodes(new_start.node_, start_.node_ - 1);
688 }
else if (position.current_ == finish_.current_) {
689 deque::reallocate_map(n,
false);
690 auto new_finish = finish_ + n;
693 finish_ = new_finish;
695 if (new_finish.node_ != finish_.node_) {
696 deque::destroy_nodes(finish_.node_ + 1, new_finish.node_);
701 deque::insert_ranges_n(position, first, last, n);
715 deque::reallocate_map(n,
true);
716 auto old_start = start_;
717 auto new_start = start_ - n;
718 position = start_ + dist_before;
721 if (dist_before >= n) {
725 _NEFORCE
copy(start_n, position, old_start);
726 _NEFORCE
fill(position - n, position, value);
731 _NEFORCE
fill(old_start, position, value);
734 if (new_start.node_ != start_.node_) {
735 deque::destroy_nodes(new_start.node_, start_.node_ - 1);
740 deque::reallocate_map(n,
false);
741 auto old_finish = finish_;
742 auto new_finish = finish_ + n;
744 position = finish_ - dist_after;
747 if (dist_after > n) {
748 auto finish_n = finish_ - n;
750 finish_ = new_finish;
752 _NEFORCE
fill(position, position + n, value);
756 finish_ = new_finish;
757 _NEFORCE
fill(position, old_finish, value);
760 if (new_finish.node_ != finish_.node_) {
761 deque::destroy_nodes(finish_.node_ + 1, new_finish.node_);
775 template <
typename... Args>
779 if (index <
size() / 2) {
783 if (new_pos != finish_ - 1) {
787 _NEFORCE
destroy(new_pos.current_);
794 if (new_pos != start_) {
798 _NEFORCE
destroy(new_pos.current_);
831 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
832 deque(Iterator first, Iterator last) {
833 deque::copy_initialize(first, last);
840 deque(std::initializer_list<T> ilist) { deque::copy_initialize(ilist.begin(), ilist.end()); }
869 const size_t len =
size();
870 if (len >= other.
size()) {
873 auto mid = other.
begin() + len;
874 _NEFORCE
copy(other.
begin(), mid, start_);
906 if (map_pair_.value ==
nullptr) {
911 if (map_pair_.value !=
nullptr) {
912 for (
size_type i = 0; i < map_size_pair_.value; ++i) {
913 if (map_pair_.value[i] !=
nullptr) {
914 map_size_pair_.get_base().deallocate(map_pair_.value[i],
buffer_size);
915 map_pair_.value[i] =
nullptr;
919 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
920 map_pair_.value =
nullptr;
1012 NEFORCE_NODISCARD
bool empty() const noexcept {
return finish_ == start_; }
1019 NEFORCE_DEBUG_VERIFY(!
empty(),
"front called on empty deque");
1028 NEFORCE_DEBUG_VERIFY(!
empty(),
"front called on empty deque");
1037 NEFORCE_DEBUG_VERIFY(!
empty(),
"back called on empty deque");
1038 return *(finish_ - 1);
1046 NEFORCE_DEBUG_VERIFY(!
empty(),
"back called on empty deque");
1047 return *(finish_ - 1);
1059 const auto old_size =
size();
1080 template <
typename... Args>
1082 if (position.current_ == start_.current_) {
1086 if (position.current_ == finish_.current_) {
1090 return deque::insert_aux(position, _NEFORCE
forward<Args>(args)...);
1098 template <
typename... Args>
1100 if (finish_.current_ != finish_.last_ - 1) {
1104 deque::reallocate_map(1,
false);
1115 template <
typename... Args>
1117 if (start_.current_ != start_.first_) {
1121 deque::reallocate_map(1,
true);
1155 NEFORCE_DEBUG_VERIFY(!
empty(),
"pop_back called on empty deque");
1157 if (finish_.current_ != finish_.first_) {
1159 _NEFORCE
destroy(finish_.current_);
1161 _NEFORCE
destroy(finish_.current_);
1162 auto cur = finish_.node_;
1163 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
1173 NEFORCE_DEBUG_VERIFY(!
empty(),
"pop_front called on empty deque");
1175 if (start_.current_ != start_.last_ - 1) {
1176 _NEFORCE
destroy(start_.current_);
1179 _NEFORCE
destroy(start_.current_);
1180 auto cur = start_.node_;
1181 map_size_pair_.get_base().deallocate(start_.first_,
buffer_size);
1200 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
1202 deque::assign_ranges(first, last);
1209 void assign(std::initializer_list<T> ilist) { deque::assign_ranges(ilist.begin(), ilist.end()); }
1218 if (position.current_ == start_.current_) {
1222 if (position.current_ == finish_.current_) {
1224 return _NEFORCE
prev(finish_);
1226 return deque::insert_aux(position, value);
1236 if (position.current_ == start_.current_) {
1240 if (position.current_ == finish_.current_) {
1242 return _NEFORCE
prev(finish_);
1244 return deque::insert_aux(position, _NEFORCE
move(value));
1254 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
1256 deque::insert_ranges(position, first, last);
1275 if (position.current_ == start_.current_) {
1276 deque::reallocate_map(n,
true);
1277 auto new_start = start_ - n;
1280 }
else if (position.current_ == finish_.current_) {
1281 deque::reallocate_map(n,
false);
1282 auto new_finish = finish_ + n;
1284 finish_ = new_finish;
1286 return deque::insert_n_aux(position, n, value);
1297 const size_type dest_before = position - start_;
1298 if (dest_before <
size() / 2) {
1302 _NEFORCE
copy(
next, finish_, position);
1305 return start_ + dest_before;
1315 if (first == start_ && last == finish_) {
1321 const size_type dist_before = first - start_;
1322 if (dist_before < (
size() - len) / 2) {
1325 _NEFORCE
destroy(start_.current_, new_start.current_);
1328 _NEFORCE
copy(last, finish_, first);
1329 iterator new_finish = finish_ - len;
1330 _NEFORCE
destroy(new_finish.current_, finish_.current_);
1331 finish_ = new_finish;
1333 return start_ + dist_before;
1342 for (map_pointer cur = map_pair_.value; cur < start_.node_; ++cur) {
1343 if (*cur == nullptr) {
1346 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
1349 for (map_pointer cur = finish_.node_ + 1; cur < map_pair_.
value + map_size_pair_.
value; ++cur) {
1350 if (*cur == nullptr) {
1364 for (map_pointer cur = start_.node_ + 1; cur < finish_.node_; ++cur) {
1365 _NEFORCE destroy(*cur, *cur + buffer_size);
1368 if (start_.node_ == finish_.node_) {
1369 _NEFORCE destroy(start_.current_, finish_.current_);
1371 _NEFORCE destroy(start_.current_, start_.last_);
1372 _NEFORCE destroy(finish_.first_, finish_.current_);
1412 if (_NEFORCE
addressof(other) ==
this) {
1416 _NEFORCE
swap(start_, other.start_);
1417 _NEFORCE
swap(finish_, other.finish_);
1418 _NEFORCE
swap(map_pair_, other.map_pair_);
1419 _NEFORCE
swap(map_size_pair_, other.map_size_pair_);