1#ifndef NEFORCE_CORE_CONTAINER_LIST_HPP__
2#define NEFORCE_CORE_CONTAINER_LIST_HPP__
17NEFORCE_BEGIN_NAMESPACE__
53 template <
typename... Args>
67template <
bool IsConst,
typename List>
68struct list_iterator :
iiterator<list_iterator<IsConst, List>> {
72 using size_type =
typename container_type::size_type;
76 typename container_type::reference>;
78 typename container_type::pointer>;
83 node_type* current_ =
nullptr;
87 list_iterator() noexcept = default;
88 ~list_iterator() = default;
90 list_iterator(const list_iterator&) noexcept = default;
91 list_iterator& operator=(const list_iterator&) noexcept = default;
92 list_iterator(list_iterator&&) noexcept = default;
93 list_iterator& operator=(list_iterator&&) noexcept = default;
110 NEFORCE_DEBUG_VERIFY(current_ != container_->head_,
"Attempting to dereference out of boundary");
111 return current_->data;
120 current_ = current_->next;
128 NEFORCE_DEBUG_VERIFY(current_->prev != container_->head_,
"Attempting to decrement out of boundary");
129 current_ = current_->prev;
137 NEFORCE_NODISCARD
bool equal(
const list_iterator& rhs)
const noexcept {
138 NEFORCE_DEBUG_VERIFY(container_ == rhs.container_,
"Attempting to equal to a different container");
139 return current_ == rhs.current_;
146 NEFORCE_NODISCARD node_type*
base() const noexcept {
return current_; }
165template <
typename T,
typename Alloc = allocator<list_node<T>>>
169 static_assert(
is_object_v<T>,
"list only contains object types.");
187 using link_type = node_type*;
189 link_type head_ =
nullptr;
192 template <
bool,
typename>
204 template <
typename... Args>
205 link_type create_node(Args&&... args) {
206 link_type p = pair_.
get_base().allocate();
210 pair_.get_base().deallocate(p);
224 pair_.get_base().deallocate(p);
233 head_ = pair_.
get_base().allocate();
237 pair_.get_base().deallocate(head_);
240 head_->prev = head_->next = head_;
249 list() { list::init_header(); }
282 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
283 list(Iterator first, Iterator last) {
287 while (first != last) {
301 list(std::initializer_list<T> ilist) :
366 link_type p = head_->next;
370 list::destroy_node(q);
372 list::destroy_node(head_);
463 NEFORCE_NODISCARD
bool empty() const noexcept {
return head_->next == head_; }
471 return head_->next->data;
480 return head_->next->data;
489 return head_->prev->data;
498 return head_->prev->data;
508 template <
typename... Args>
510 link_type temp = list::create_node(_NEFORCE
forward<Args>(args)...);
525 template <
typename... Args>
536 template <
typename... Args>
591 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
592 void assign(Iterator first, Iterator last) {
629 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
635 link_type original_prev = position.
base()->
prev;
636 link_type current_prev = original_prev;
637 link_type first_inserted =
nullptr;
640 while (first != last) {
641 link_type temp = list::create_node(*first);
642 temp->
prev = current_prev;
644 current_prev->
next = temp;
646 if (first_inserted ==
nullptr) {
647 first_inserted = temp;
654 if (first_inserted !=
nullptr) {
655 link_type to_delete = first_inserted;
656 while (to_delete != position.
base()) {
658 list::destroy_node(to_delete);
662 original_prev->
next = position.
base();
663 position.
base()->
prev = original_prev;
691 link_type original_prev = position.
base()->
prev;
692 link_type current_prev = original_prev;
693 link_type first_inserted =
nullptr;
697 link_type temp = list::create_node(value);
698 temp->
prev = current_prev;
700 current_prev->
next = temp;
702 if (first_inserted ==
nullptr) {
703 first_inserted = temp;
709 if (first_inserted !=
nullptr) {
710 link_type to_delete = first_inserted;
711 while (to_delete != position.
base()) {
713 list::destroy_node(to_delete);
717 original_prev->
next = position.
base();
718 position.
base()->
prev = original_prev;
733 link_type ret = position.base()->next;
734 position.base()->prev->next = position.base()->next;
735 position.base()->next->prev = position.base()->prev;
736 list::destroy_node(position.base());
748 while (first != last) {
760 link_type cur = head_->next;
761 while (cur != head_) {
762 link_type temp = cur;
764 list::destroy_node(temp);
776 _NEFORCE
swap(head_, other.head_);
777 _NEFORCE
swap(pair_, other.pair_);
790 if (position == last) {
796 link_type tmp = position.
base()->
prev;
807 template <
typename Pred>
810 while (iter != last) {
824 return list::remove_if([&](
const T& other) ->
bool {
return other == value; });
835 if (!other.
empty()) {
839 other.pair_.
value = 0;
854 if (iter == position || j == position) {
876 for (
iterator it = first; it != last; ++it) {
881 other.pair_.
value -= n;
893 template <
typename Pred>
898 while (first1 != last1 && first2 != last2) {
899 if (!pred(*first2, *first1)) {
911 if (first2 != last2) {
915 other.pair_.
value = 0;
932 link_type current = head_;
935 current = current->
prev;
936 }
while (current != head_);
946 template <
typename Pred>
954 if (pred(*current, *
next)) {
975 template <
typename Pred>
980 link_type p = head_->next->next;
984 while (
prev != head_ && pred(temp,
prev->data)) {
988 prev->next->data = temp;
1005 while (position--) {
1018 while (position--) {
1059#ifdef NEFORCE_STANDARD_17
1060template <
typename Iterator,
typename Alloc>
1066NEFORCE_END_NAMESPACE__
void assign(Iterator first, Iterator last)
范围赋值
NEFORCE_NODISCARD const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
void swap(list &other) noexcept(is_nothrow_swappable_v< allocator_type >)
交换两个链表的内容
void push_front(T &&value)
在开头移动插入元素
list & operator=(std::initializer_list< T > ilist)
初始化列表赋值运算符
iterator insert(iterator position, T &&value)
在指定位置移动插入元素
NEFORCE_NODISCARD const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
void splice(iterator position, list &other, iterator first, iterator last)
拼接范围内的元素
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
常量反向迭代器类型
list(std::initializer_list< T > ilist)
初始化列表构造函数
void pop_front() noexcept
移除开头元素
list & operator=(list &&other) noexcept(is_nothrow_swappable_v< compressed_pair< allocator_type, size_type > > &&is_nothrow_destructible_v< node_type >)
移动赋值运算符
void transfer(iterator position, iterator first, iterator last)
传输元素
NEFORCE_NODISCARD const_reference at(size_type position) const
常量索引访问
iterator emplace_front(Args &&... args)
在开头构造元素
iterator emplace_back(Args &&... args)
在末尾构造元素
void push_front(const T &value)
在开头拷贝插入元素
NEFORCE_NODISCARD reference at(size_type position)
索引访问
void sort()
对链表进行排序(默认使用小于比较)
void merge(list &other)
合并两个有序链表(默认使用小于比较)
void unique_if(Pred pred) noexcept
移除连续的重复元素
void sort_if(Pred pred)
对链表进行排序
NEFORCE_NODISCARD iterator begin() noexcept
void reverse() noexcept
反转链表
list(const list &other)
拷贝构造函数
ptrdiff_t difference_type
差值类型
void insert(iterator position, size_type n, const T &value)
插入n个指定值的元素
void push_back(T &&value)
在末尾移动插入元素
void pop_back() noexcept
移除末尾元素
void insert(iterator position, std::initializer_list< T > ilist)
初始化列表插入
NEFORCE_NODISCARD const_iterator cbegin() const noexcept
获取常量起始迭代器
void unique() noexcept
移除连续的重复元素(默认使用等于比较)
list(Iterator first, Iterator last)
范围构造函数
void push_back(const T &value)
在末尾拷贝插入元素
void assign(std::initializer_list< T > ilist)
初始化列表赋值
NEFORCE_NODISCARD size_type max_size() const noexcept
获取最大可能大小
list & operator=(const list &other)
拷贝赋值运算符
NEFORCE_NODISCARD bool empty() const noexcept
检查是否为空
void remove_if(Pred pred)
根据谓词移除元素
list_iterator< true, list > const_iterator
常量迭代器类型
NEFORCE_NODISCARD reference operator[](const size_type position)
下标访问操作符
NEFORCE_NODISCARD bool operator<(const list &rhs) const noexcept(noexcept(_NEFORCE lexicographical_compare(cbegin(), cend(), rhs.cbegin(), rhs.cend())))
小于比较操作符
NEFORCE_NODISCARD const_iterator end() const noexcept
获取常量结束迭代器
list(list &&other) noexcept(is_nothrow_swappable_v< compressed_pair< allocator_type, size_type > >)
移动构造函数
iterator insert(iterator position, const T &value)
在指定位置拷贝插入元素
void insert(iterator position, Iterator first, Iterator last)
范围插入
iterator erase(iterator first, iterator last) noexcept(is_nothrow_destructible_v< node_type >)
删除指定范围内的元素
NEFORCE_NODISCARD bool operator==(const list &rhs) const noexcept(noexcept(_NEFORCE equal(cbegin(), cend(), rhs.cbegin())))
相等比较操作符
Alloc allocator_type
分配器类型
void splice(iterator position, list &other, iterator iter)
拼接单个元素
void splice(iterator position, list &other)
拼接整个链表
NEFORCE_NODISCARD const_iterator begin() const noexcept
获取常量起始迭代器
const T * const_pointer
常量指针类型
NEFORCE_NODISCARD iterator end() noexcept
获取结束迭代器
NEFORCE_NODISCARD reverse_iterator rbegin() noexcept
获取反向起始迭代器
NEFORCE_NODISCARD reference front() noexcept
访问第一个元素
list_iterator< false, list > iterator
迭代器类型
NEFORCE_NODISCARD reverse_iterator rend() noexcept
获取反向结束迭代器
void remove(const T &value)
移除指定值的元素
list(size_type n, T &&value)
构造包含n个指定值元素的链表
iterator erase(iterator position) noexcept(is_nothrow_destructible_v< node_type >)
删除指定位置的元素
void assign(const size_type n, const T &value)
赋值n个指定值的元素
NEFORCE_NODISCARD const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
NEFORCE_NODISCARD const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
iterator emplace(iterator position, Args &&... args)
在指定位置构造元素
const T & const_reference
常量引用类型
NEFORCE_NODISCARD const_reference front() const noexcept
访问第一个常量元素
NEFORCE_NODISCARD reference back() noexcept
访问最后一个元素
_NEFORCE reverse_iterator< iterator > reverse_iterator
反向迭代器类型
void merge_if(list &other, Pred pred)
合并两个有序链表
void clear() noexcept(is_nothrow_destructible_v< node_type >)
清空链表
list(size_type n)
构造包含n个默认构造元素的链表
NEFORCE_NODISCARD const_reference back() const noexcept
访问最后一个常量元素
NEFORCE_NODISCARD const_reference operator[](const size_type position) const
常量下标访问操作符
NEFORCE_NODISCARD size_type size() const noexcept
获取当前元素数量
NEFORCE_NODISCARD const_iterator cend() const noexcept
获取常量结束迭代器
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
NEFORCE_NODISCARD constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, BinaryPredicate binary_pred) noexcept(noexcept(++first1) &&noexcept(++first2) &&noexcept(binary_pred(*first1, *first2)))
比较两个范围是否相等
NEFORCE_NODISCARD constexpr bool lexicographical_compare(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Compare comp) noexcept(noexcept(++first1) &&noexcept(++first2) &&noexcept(comp(*first1, *first2)) &&noexcept(first1==last1 &&first2 !=last2))
字典序比较两个范围
#define NEFORCE_DEBUG_VERIFY(CON, MESG)
调试模式断言
NEFORCE_CONSTEXPR20 T * construct(T *ptr, Args &&... args) noexcept(is_nothrow_constructible_v< T, Args... >)
在指定内存位置构造对象
NEFORCE_CONSTEXPR20 void destroy(T *pointer) noexcept(is_nothrow_destructible_v< T >)
销毁单个对象
constexpr Iterator prev(Iterator iter, iter_difference_t< Iterator > n=-1)
获取迭代器的前一个位置
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
void swap()=delete
删除无参数的swap重载
NEFORCE_INLINE17 constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_allocator_v
is_allocator的便捷变量模板
NEFORCE_ALWAYS_INLINE constexpr T initialize() noexcept(is_nothrow_default_constructible< T >::value)
返回类型T的默认初始化值
NEFORCE_INLINE17 constexpr bool is_nothrow_default_constructible_v
is_nothrow_default_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_constructible_v
is_nothrow_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_destructible_v
is_nothrow_destructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
constexpr compressed_pair & get_base() noexcept
获取基类引用
void decrement() noexcept
递减操作
NEFORCE_NODISCARD node_type * base() const noexcept
获取底层节点指针
void increment() noexcept
递增操作
NEFORCE_NODISCARD reference dereference() const noexcept
解引用操作实现
NEFORCE_NODISCARD const container_type * container() const noexcept
获取关联容器
conditional_t< IsConst, typename container_type::const_pointer, typename container_type::pointer > pointer
指针类型
conditional_t< IsConst, typename container_type::const_reference, typename container_type::reference > reference
引用类型
NEFORCE_NODISCARD bool equal(const list_iterator &rhs) const noexcept
相等比较
typename container_type::value_type value_type
值类型
bidirectional_iterator_tag iterator_category
迭代器类别
typename container_type::difference_type difference_type
差值类型
typename container_type::size_type size_type
大小类型
list_node() noexcept(is_nothrow_default_constructible_v< T >)
默认构造函数
list_node(Args &&... args) noexcept(is_nothrow_constructible_v< T, Args... >)
参数构造