268 static_assert(
is_object_v<T>,
"deque only contains object types.");
289 using map_allocator =
typename Alloc::template rebind<pointer>::other;
294 compressed_pair<allocator_type, size_type> map_size_pair_{default_construct_tag{}, 0};
296 compressed_pair<map_allocator, map_pointer> map_pair_{default_construct_tag{},
nullptr};
300 static constexpr size_t init_map_size = 8;
307 map_pointer create_map(
const size_t n) {
308 map_pointer map = map_pair_.get_base().allocate(n);
309 for (
size_t i = 0; i < n; ++i) {
310 *(map + i) =
nullptr;
322 void create_nodes(map_pointer start, map_pointer finish) {
325 for (cur = start; cur <= finish; ++cur) {
326 *cur = map_size_pair_.get_base().allocate(
buffer_size);
329 while (cur != start) {
331 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
346 for (map_pointer cur = start; cur <= finish; ++cur) {
347 if (*cur ==
nullptr) {
350 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
361 void create_map_and_nodes(
const size_type n) {
363 map_size_pair_.value = _NEFORCE
max(init_map_size, node_nums + 2);
366 map_pair_.value = deque::create_map(map_size_pair_.value);
368 map_pair_.value =
nullptr;
369 map_size_pair_.value = 0;
373 map_pointer nstart = map_pair_.value + (map_size_pair_.value - node_nums) / 2;
374 map_pointer nfinish = node_nums == 0 ? nstart : nstart + node_nums - 1;
377 deque::create_nodes(nstart, nfinish);
379 deque::destroy_nodes(map_pair_.value, map_pair_.value + map_size_pair_.value - 1);
380 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
381 map_pair_.value =
nullptr;
382 map_size_pair_.value = 0;
386 start_.change_buff(nstart);
387 finish_.change_buff(nfinish);
388 start_.current_ = start_.first_;
390 start_.container_ =
this;
391 finish_.container_ =
this;
399 void fill_initialize(
const size_type n,
const T& value) {
400 deque::create_map_and_nodes(n);
405 for (map_pointer cur = start_.node_; cur < finish_.node_; ++cur) {
417 template <
typename Iterator>
419 deque::create_map_and_nodes(0);
430 template <
typename Iterator>
432 deque::create_map_and_nodes(_NEFORCE
distance(first, last));
434 for (map_pointer cur = start_.node_; cur < finish_.node_; ++cur) {
448 void assign_aux_n(
size_type n,
const T& value) {
464 template <
typename Iterator>
477 template <
typename Iterator>
479 auto first1 =
begin();
482 for (; first != last && first1 != last1; ++first, ++first1) {
486 if (first1 != last1) {
502 void reallocate_map(
const size_type n,
const bool add_at_front) {
503 const size_type begin_left = start_.current_ - start_.first_;
505 if (add_at_front && begin_left < n) {
506 const size_t needed = (n - begin_left) /
buffer_size + 1;
508 if (needed >
static_cast<size_type>(start_.node_ - map_pair_.value)) {
510 _NEFORCE
max(map_size_pair_.value << 1, map_size_pair_.value + needed + init_map_size);
511 map_pointer map = deque::create_map(new_size);
512 const size_type old_buf = finish_.node_ - start_.node_ + 1;
513 const size_type new_buf = needed + old_buf;
515 auto begin = map + (new_size - new_buf) / 2;
516 auto mid =
begin + needed;
517 auto end = mid + old_buf;
519 deque::create_nodes(
begin, mid - 1);
520 for (
auto begin1 = mid, begin2 = start_.node_; begin1 !=
end; ++begin1, ++begin2) {
524 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
525 map_pair_.value = map;
526 map_size_pair_.value = new_size;
527 start_ =
iterator(*mid + (start_.current_ - start_.first_), mid,
this);
528 finish_ =
iterator(*(
end - 1) + (finish_.current_ - finish_.first_),
end - 1,
this);
532 deque::create_nodes(start_.node_ - needed, start_.node_ - 1);
536 const size_type end_left = finish_.last_ - finish_.current_ - 1;
538 if (!add_at_front && end_left < n) {
542 if (needed >
static_cast<size_type>((map_pair_.value + map_size_pair_.value) - finish_.node_ - 1)) {
544 _NEFORCE
max(map_size_pair_.value << 1, map_size_pair_.value + needed + init_map_size);
545 map_pointer map = deque::create_map(new_size);
546 const size_type old_buf = finish_.node_ - start_.node_ + 1;
547 const size_type new_buf = needed + old_buf;
549 auto begin = map + (new_size - new_buf) / 2;
550 auto mid =
begin + old_buf;
551 auto end = mid + needed;
553 for (
auto begin1 =
begin, begin2 = start_.node_; begin1 != mid; ++begin1, ++begin2) {
556 deque::create_nodes(mid,
end - 1);
558 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
559 map_pair_.value = map;
560 map_size_pair_.value = new_size;
562 finish_ =
iterator(*(mid - 1) + (finish_.current_ - finish_.first_), mid - 1,
this);
566 deque::create_nodes(finish_.node_ + 1, finish_.node_ + needed);
578 template <
typename Iterator>
579 void insert_ranges_n(
iterator position, Iterator first, Iterator last,
size_type n) {
583 deque::reallocate_map(n,
true);
584 auto old_start = start_;
585 auto new_start = start_ - n;
586 position = start_ + dist_before;
589 if (dist_before >= n) {
593 _NEFORCE
copy(start_n, position, old_start);
594 _NEFORCE
copy(first, last, position - n);
596 auto mid = _NEFORCE
next(first, n - dist_before);
599 _NEFORCE
copy(mid, last, old_start);
602 if (new_start.node_ != start_.node_) {
603 deque::destroy_nodes(new_start.node_, start_.node_ - 1);
608 deque::reallocate_map(n,
false);
609 auto old_finish = finish_;
610 auto new_finish = finish_ + n;
612 position = finish_ - dist_after;
615 if (dist_after > n) {
616 auto finish_n = finish_ - n;
618 finish_ = new_finish;
620 _NEFORCE
copy(first, last, position);
622 auto mid = _NEFORCE
next(first, dist_after);
624 finish_ = new_finish;
625 _NEFORCE
copy(first, mid, position);
628 if (new_finish.node_ != finish_.node_) {
629 deque::destroy_nodes(finish_.node_ + 1, new_finish.node_);
643 template <
typename Iterator>
650 const size_type dist_before = position - start_;
652 if (dist_before <
size() / 2) {
653 deque::reallocate_map(n,
true);
655 deque::reallocate_map(n,
false);
658 position = start_ + dist_before;
661 for (
size_type i = 0; i < n; ++i, --cur) {
674 template <
typename Iterator>
681 if (position.current_ == start_.current_) {
682 deque::reallocate_map(n,
true);
683 auto new_start = start_ - n;
688 if (new_start.node_ != start_.node_) {
689 deque::destroy_nodes(new_start.node_, start_.node_ - 1);
693 }
else if (position.current_ == finish_.current_) {
694 deque::reallocate_map(n,
false);
695 auto new_finish = finish_ + n;
698 finish_ = new_finish;
700 if (new_finish.node_ != finish_.node_) {
701 deque::destroy_nodes(finish_.node_ + 1, new_finish.node_);
706 deque::insert_ranges_n(position, first, last, n);
720 deque::reallocate_map(n,
true);
721 auto old_start = start_;
722 auto new_start = start_ - n;
723 position = start_ + dist_before;
726 if (dist_before >= n) {
730 _NEFORCE
copy(start_n, position, old_start);
731 _NEFORCE
fill(position - n, position, value);
736 _NEFORCE
fill(old_start, position, value);
739 if (new_start.node_ != start_.node_) {
740 deque::destroy_nodes(new_start.node_, start_.node_ - 1);
745 deque::reallocate_map(n,
false);
746 auto old_finish = finish_;
747 auto new_finish = finish_ + n;
749 position = finish_ - dist_after;
752 if (dist_after > n) {
753 auto finish_n = finish_ - n;
755 finish_ = new_finish;
757 _NEFORCE
fill(position, position + n, value);
761 finish_ = new_finish;
762 _NEFORCE
fill(position, old_finish, value);
765 if (new_finish.node_ != finish_.node_) {
766 deque::destroy_nodes(finish_.node_ + 1, new_finish.node_);
780 template <
typename... Args>
784 if (index <
size() / 2) {
788 if (new_pos != finish_ - 1) {
792 _NEFORCE
destroy(new_pos.current_);
799 if (new_pos != start_) {
803 _NEFORCE
destroy(new_pos.current_);
836 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
837 deque(Iterator first, Iterator last) {
838 deque::copy_initialize(first, last);
845 deque(std::initializer_list<T> ilist) { deque::copy_initialize(ilist.begin(), ilist.end()); }
874 const size_t len =
size();
875 if (len >= other.
size()) {
878 auto mid = other.
begin() + len;
879 _NEFORCE
copy(other.
begin(), mid, start_);
911 if (map_pair_.value ==
nullptr) {
916 if (map_pair_.value !=
nullptr) {
917 for (
size_type i = 0; i < map_size_pair_.value; ++i) {
918 if (map_pair_.value[i] !=
nullptr) {
919 map_size_pair_.get_base().deallocate(map_pair_.value[i],
buffer_size);
920 map_pair_.value[i] =
nullptr;
924 map_pair_.get_base().deallocate(map_pair_.value, map_size_pair_.value);
925 map_pair_.value =
nullptr;
1017 NEFORCE_NODISCARD
bool empty() const noexcept {
return finish_ == start_; }
1043 return *(finish_ - 1);
1052 return *(finish_ - 1);
1064 const auto old_size =
size();
1085 template <
typename... Args>
1087 if (position.current_ == start_.current_) {
1091 if (position.current_ == finish_.current_) {
1095 return deque::insert_aux(position, _NEFORCE
forward<Args>(args)...);
1103 template <
typename... Args>
1105 if (finish_.current_ != finish_.last_ - 1) {
1109 deque::reallocate_map(1,
false);
1120 template <
typename... Args>
1122 if (start_.current_ != start_.first_) {
1126 deque::reallocate_map(1,
true);
1162 if (finish_.current_ != finish_.first_) {
1164 _NEFORCE
destroy(finish_.current_);
1166 _NEFORCE
destroy(finish_.current_);
1167 auto cur = finish_.node_;
1168 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
1180 if (start_.current_ != start_.last_ - 1) {
1181 _NEFORCE
destroy(start_.current_);
1184 _NEFORCE
destroy(start_.current_);
1185 auto cur = start_.node_;
1186 map_size_pair_.get_base().deallocate(start_.first_,
buffer_size);
1205 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
1207 deque::assign_ranges(first, last);
1214 void assign(std::initializer_list<T> ilist) { deque::assign_ranges(ilist.begin(), ilist.end()); }
1223 if (position.current_ == start_.current_) {
1227 if (position.current_ == finish_.current_) {
1229 return _NEFORCE
prev(finish_);
1231 return deque::insert_aux(position, value);
1241 if (position.current_ == start_.current_) {
1245 if (position.current_ == finish_.current_) {
1247 return _NEFORCE
prev(finish_);
1249 return deque::insert_aux(position, _NEFORCE
move(value));
1259 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
1261 deque::insert_ranges(position, first, last);
1280 if (position.current_ == start_.current_) {
1281 deque::reallocate_map(n,
true);
1282 auto new_start = start_ - n;
1285 }
else if (position.current_ == finish_.current_) {
1286 deque::reallocate_map(n,
false);
1287 auto new_finish = finish_ + n;
1289 finish_ = new_finish;
1291 return deque::insert_n_aux(position, n, value);
1302 const size_type dest_before = position - start_;
1303 if (dest_before <
size() / 2) {
1307 _NEFORCE
copy(
next, finish_, position);
1310 return start_ + dest_before;
1320 if (first == start_ && last == finish_) {
1326 const size_type dist_before = first - start_;
1327 if (dist_before < (
size() - len) / 2) {
1330 _NEFORCE
destroy(start_.current_, new_start.current_);
1333 _NEFORCE
copy(last, finish_, first);
1334 iterator new_finish = finish_ - len;
1335 _NEFORCE
destroy(new_finish.current_, finish_.current_);
1336 finish_ = new_finish;
1338 return start_ + dist_before;
1347 for (map_pointer cur = map_pair_.value; cur < start_.node_; ++cur) {
1348 if (*cur == nullptr) {
1351 map_size_pair_.get_base().deallocate(*cur,
buffer_size);
1354 for (map_pointer cur = finish_.node_ + 1; cur < map_pair_.
value + map_size_pair_.
value; ++cur) {
1355 if (*cur == nullptr) {
1369 for (map_pointer cur = start_.node_ + 1; cur < finish_.node_; ++cur) {
1370 _NEFORCE destroy(*cur, *cur + buffer_size);
1373 if (start_.node_ == finish_.node_) {
1374 _NEFORCE destroy(start_.current_, finish_.current_);
1376 _NEFORCE destroy(start_.current_, start_.last_);
1377 _NEFORCE destroy(finish_.first_, finish_.current_);
1417 if (_NEFORCE
addressof(other) ==
this) {
1421 _NEFORCE
swap(start_, other.start_);
1422 _NEFORCE
swap(finish_, other.finish_);
1423 _NEFORCE
swap(map_pair_, other.map_pair_);
1424 _NEFORCE
swap(map_size_pair_, other.map_size_pair_);