1#ifndef NEFORCE_CORE_CONTAINER_BITMAP_HPP__
2#define NEFORCE_CORE_CONTAINER_BITMAP_HPP__
15NEFORCE_BEGIN_NAMESPACE__
67 return *
this =
static_cast<bool>(other);
87 *
this =
static_cast<bool>(other);
111 NEFORCE_CONSTEXPR20
explicit operator bool() const noexcept {
return *ptr_ & mask_; }
116 NEFORCE_CONSTEXPR20
void flip() const noexcept { *ptr_ ^= mask_; }
126 const bool tmp =
static_cast<bool>(other);
137 return static_cast<bool>(*this) ==
static_cast<bool>(rhs);
146 return static_cast<bool>(*this) <
static_cast<bool>(rhs);
153 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
size_t to_hash() const noexcept {
154 return hash<bool>()(
static_cast<bool>(*this));
161 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string to_string()
const {
return static_cast<bool>(*this) ?
"1"_s :
"0"_s; }
173template <
bool IsConst,
typename BitMap>
174struct bitmap_iterator :
iiterator<bitmap_iterator<IsConst, BitMap>> {
182 typename container_type::reference>;
184 typename container_type::pointer>;
192 template <
bool,
typename>
193 friend struct bitmap_iterator;
196 template <
typename Ref>
198 return (*ptr_ & (1U << off_)) != 0;
201 template <
typename Ref>
203 return Ref(ptr_, 1U << off_);
207 NEFORCE_CONSTEXPR20 bitmap_iterator() noexcept = default;
208 NEFORCE_CONSTEXPR20 ~bitmap_iterator() = default;
210 NEFORCE_CONSTEXPR20 bitmap_iterator(const bitmap_iterator&) noexcept = default;
211 NEFORCE_CONSTEXPR20 bitmap_iterator& operator=(const bitmap_iterator&) noexcept = default;
212 NEFORCE_CONSTEXPR20 bitmap_iterator(bitmap_iterator&&) noexcept = default;
213 NEFORCE_CONSTEXPR20 bitmap_iterator& operator=(bitmap_iterator&&) noexcept = default;
231 template <
bool IsConst2>
232 NEFORCE_CONSTEXPR20
explicit bitmap_iterator(
const bitmap_iterator<IsConst2, BitMap>& other) noexcept :
235 container_(other.container_) {}
243 return reference_dispatch<reference>();
291 NEFORCE_DEBUG_VERIFY(container_ == other.container_,
"Attempting to distance to a different container");
307 NEFORCE_CONSTEXPR20
bool equal(
const bitmap_iterator& rhs)
const noexcept {
308 NEFORCE_DEBUG_VERIFY(container_ == rhs.container_,
"Attempting to equal to a different container");
309 return ptr_ == rhs.ptr_ && off_ == rhs.off_;
317 NEFORCE_CONSTEXPR20
bool less_than(
const bitmap_iterator& rhs)
const noexcept {
318 NEFORCE_DEBUG_VERIFY(container_ == rhs.container_,
"Attempting to equal to a different container");
319 return ptr_ < rhs.ptr_ || (ptr_ == rhs.ptr_ && off_ < rhs.off_);
326 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
pointer base() const noexcept {
return ptr_; }
372 NEFORCE_CONSTEXPR20 bit_storage()
noexcept =
default;
378 explicit NEFORCE_CONSTEXPR20 bit_storage(
const size_t word) {
382 ptr = cpair.
get_base().allocate(word);
389 NEFORCE_CONSTEXPR20 ~bit_storage() {
395 bit_storage(
const bit_storage&) =
delete;
396 bit_storage&
operator=(
const bit_storage&) =
delete;
402 NEFORCE_CONSTEXPR20 bit_storage(bit_storage&& other) noexcept :
404 cpair(_NEFORCE
move(other.cpair)) {
406 other.cpair.
value = 0;
414 NEFORCE_CONSTEXPR20 bit_storage&
operator=(bit_storage&& other)
noexcept {
420 cpair = _NEFORCE
move(other.cpair);
422 other.cpair.value = 0;
432 NEFORCE_CONSTEXPR20
void reset(
uint32_t* new_ptr =
nullptr,
const size_t cap = 0) {
444 NEFORCE_CONSTEXPR20
void allocate(
const size_t word) { reset(cpair.
get_base().allocate(word), word); }
450 NEFORCE_CONSTEXPR20
uint32_t*
get()
const noexcept {
return ptr; }
456 NEFORCE_CONSTEXPR20
size_t capacity()
const noexcept {
return cpair.
value; }
461 bit_storage storage_{};
469 static constexpr size_t word_count(
const size_type word)
noexcept {
477 NEFORCE_CONSTEXPR20
void allocate_storage(
const size_type word) {
481 storage_.allocate(word_count(word));
488 NEFORCE_CONSTEXPR20
void set_iterators(
const size_type word)
noexcept {
489 start_ =
iterator(storage_.get(), 0,
this);
502 template <
typename Iterator1,
typename Iterator2>
503 NEFORCE_CONSTEXPR20 Iterator2 bit_copy(Iterator1 first, Iterator1 last, Iterator2 result) {
505 for (; n > 0; --n, ++first, ++result) {
520 template <
typename Iterator1,
typename Iterator2>
521 NEFORCE_CONSTEXPR20 Iterator2 bit_copy_backward(Iterator1 first, Iterator1 last, Iterator2 result) {
535 void reallocate_insert(
const iterator& position,
const size_type extra_len,
const bool value) {
537 const size_type new_size = old_size + extra_len;
538 const size_type new_words = word_count(new_size);
539 bit_storage new_storage(new_words);
541 const iterator new_start(new_storage.get(), 0,
this);
542 auto new_finish = bitmap::bit_copy(
begin(), position, new_start);
543 _NEFORCE
fill_n(new_finish, extra_len, value);
545 bitmap::bit_copy(position,
end(), new_finish);
546 new_finish += (
end() - position);
548 storage_ = _NEFORCE
move(new_storage);
550 finish_ = new_finish;
561 template <
typename Iterator>
562 void reallocate_insert_range(
const iterator position, Iterator first, Iterator last,
const size_type extra_len) {
564 const size_type new_size = old_size + extra_len;
565 const size_type new_words = word_count(new_size);
566 bit_storage new_storage(new_words);
568 const iterator new_start(new_storage.get(), 0,
this);
569 auto new_finish = bitmap::bit_copy(
begin(), position, new_start);
570 new_finish = bitmap::bit_copy(first, last, new_finish);
571 new_finish = bitmap::bit_copy(position,
end(), new_finish);
573 storage_ = _NEFORCE
move(new_storage);
575 finish_ = new_finish;
583 void insert_aux(
const iterator& position,
const bool value) {
584 if (finish_.ptr_ != storage_.get() + storage_.capacity()) {
585 bit_copy_backward(position, finish_, finish_ + 1);
590 reallocate_insert(position, 1, value);
600 template <
typename Iterator>
607 while (first != last) {
622 template <
typename Iterator>
629 bit_storage tmp_storage(word_count(n));
630 iterator tmp_start(tmp_storage.get(), 0,
this);
631 const iterator tmp_finish = bitmap::bit_copy(first, last, tmp_start);
633 storage_ = _NEFORCE
move(tmp_storage);
635 finish_ = tmp_finish;
646 template <
typename Iterator>
652 insert_range(position, tmp.
begin(), tmp.
end());
663 template <
typename Iterator>
670 bitmap::bit_copy_backward(position,
end(), finish_ +
static_cast<difference_type>(n));
671 bitmap::bit_copy(first, last, position);
674 bitmap::reallocate_insert_range(position, first, last, n);
685 NEFORCE_CONSTEXPR20
bitmap() noexcept = default;
697 allocate_storage(word);
699 _NEFORCE
fill(storage_.get(), storage_.get() + storage_.capacity(), 0);
711 allocate_storage(word);
713 _NEFORCE
fill(storage_.get(), storage_.get() + storage_.capacity(), value ? ~0U : 0U);
742 bit_storage tmp(word_count(n));
743 const iterator tmp_start(tmp.get(), 0,
this);
744 const auto tmp_finish = bit_copy(other.
cbegin(), other.
cend(), tmp_start);
746 storage_ = _NEFORCE
move(tmp);
748 finish_ = tmp_finish;
770 start_(other.start_.ptr_, other.start_.off_,
this),
771 finish_(other.finish_.ptr_, other.finish_.off_,
this),
772 storage_(_NEFORCE
move(other.storage_)) {
796 template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
797 NEFORCE_CONSTEXPR20
bitmap(Iterator first, Iterator last) {
798 bitmap::range_init(first, last);
810 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
iterator begin() noexcept {
return start_; }
816 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
iterator end() noexcept {
return finish_; }
898 NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
bool empty() const noexcept {
return start_ == finish_; }
958 const size_type new_words = word_count(n);
959 bit_storage new_storage(new_words);
960 const iterator new_start(new_storage.get(), 0,
this);
961 const auto new_finish = bit_copy(
begin(),
end(), new_start);
963 storage_ = _NEFORCE
move(new_storage);
965 finish_ = new_finish;
974 if (finish_.ptr_ != storage_.get() + storage_.capacity()) {
977 insert_aux(
end(), value);
989 if (finish_.ptr_ != storage_.get() + storage_.capacity() && position ==
end()) {
992 insert_aux(position, value);
1004 template <
typename Iterator>
1006 bitmap::insert_range(position, first, last);
1015 NEFORCE_CONSTEXPR20
void insert(
const iterator& position,
const bool* first,
const bool* last) {
1016 if (first == last) {
1021 bitmap::bit_copy_backward(position,
end(), finish_ +
static_cast<difference_type>(n));
1022 bitmap::bit_copy(first, last, position);
1025 bitmap::reallocate_insert_range(position, first, last, n);
1040 bitmap::bit_copy_backward(position,
end(), finish_ +
static_cast<difference_type>(n));
1044 bitmap::reallocate_insert(position, n, value);
1079 if (position + 1 !=
end()) {
1080 bitmap::bit_copy(position + 1,
end(), position);
1093 finish_ = bitmap::bit_copy(last,
end(), first);
1120 if (_NEFORCE
addressof(other) ==
this) {
1123 _NEFORCE
swap(start_, other.start_);
1124 _NEFORCE
swap(finish_, other.finish_);
1125 _NEFORCE
swap(storage_, other.storage_);
1126 start_.container_ =
this;
1127 finish_.container_ =
this;
1128 other.start_.container_ = &other;
1129 other.finish_.container_ = &other;
1138 noexcept(
noexcept(_NEFORCE
equal(this->
cbegin(), this->
cend(), rhs.cbegin()))) {
1139 return this->
size() == rhs.size() && _NEFORCE
equal(this->
cbegin(), this->
cend(), rhs.cbegin());
1156NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reference front() const
常量版本,访问第一个位
NEFORCE_CONSTEXPR20 bitmap & operator=(const bitmap &other)
拷贝赋值运算符
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
常量反向迭代器类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference operator[](const size_type n)
下标访问操作符
NEFORCE_CONSTEXPR20 void resize(const size_type n, const bool value=bool())
调整大小
bit_reference reference
引用类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reference operator[](const size_type n) const
常量下标访问操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
bitmap_iterator< false, bitmap > iterator
迭代器类型
NEFORCE_CONSTEXPR20 bitmap(const size_type word, const bool value)
构造函数,指定大小和初始值
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference front()
访问第一个位
NEFORCE_CONSTEXPR20 void insert(iterator position, Iterator first, Iterator last)
范围插入
allocator< uint32_t > allocator_type
分配器类型
NEFORCE_CONSTEXPR20 void insert(const iterator &pos, const int32_t n, const bool value)
插入n个相同的位
ptrdiff_t difference_type
差值类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
NEFORCE_CONSTEXPR20 iterator erase(const iterator &first, const iterator &last)
删除指定范围内的位
NEFORCE_CONSTEXPR20 bitmap(const bitmap &other)
拷贝构造函数
NEFORCE_CONSTEXPR20 bitmap() noexcept=default
默认构造函数
bitmap_iterator< true, bitmap > const_iterator
常量迭代器类型
_NEFORCE reverse_iterator< iterator > reverse_iterator
反向迭代器类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const bitmap &rhs) const noexcept(noexcept(_NEFORCE equal(this->cbegin(), this->cend(), rhs.cbegin())))
相等比较操作符
bit_reference * pointer
指针类型
NEFORCE_CONSTEXPR20 void reserve(const size_type n)
预留容量
NEFORCE_CONSTEXPR20 void clear()
清空位图
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type max_size() const noexcept
获取最大可能位数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reverse_iterator rend() noexcept
获取反向结束迭代器
const bool const_reference
常量引用类型
NEFORCE_CONSTEXPR20 ~bitmap()=default
析构函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator end() const noexcept
获取常量结束迭代器
NEFORCE_CONSTEXPR20 void insert(const iterator &pos, const int64_t n, const bool value)
插入n个相同的位
NEFORCE_CONSTEXPR20 bitmap & operator=(bitmap &&other) noexcept
移动赋值运算符
const bool * const_pointer
常量指针类型
NEFORCE_CONSTEXPR20 iterator insert(const iterator &position, const bool value)
在指定位置插入位
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reverse_iterator rbegin() noexcept
获取反向起始迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const bitmap &rhs) const noexcept(noexcept(_NEFORCE lexicographical_compare(this->cbegin(), this->cend(), rhs.cbegin(), rhs.cend())))
小于比较操作符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type capacity() const noexcept
获取容量(位数)
NEFORCE_CONSTEXPR20 bitmap(const int64_t word, const bool value)
64位整数构造函数
NEFORCE_CONSTEXPR20 void insert(const iterator &position, const bool *first, const bool *last)
插入布尔数组范围
NEFORCE_CONSTEXPR20 iterator erase(const iterator &position)
删除指定位置的位
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator cend() const noexcept
获取常量结束迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 iterator begin() noexcept
获取起始迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 iterator end() noexcept
获取结束迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference back()
访问最后一个位
NEFORCE_CONSTEXPR20 void swap(bitmap &other) noexcept
交换两个位图的内容
NEFORCE_CONSTEXPR20 bitmap(bitmap &&other) noexcept
移动构造函数
NEFORCE_CONSTEXPR20 void insert(const iterator &position, const size_type n, const bool value)
插入n个相同的位
NEFORCE_CONSTEXPR20 bitmap(const int32_t word, const bool value)
32位整数构造函数
NEFORCE_CONSTEXPR20 void pop_back()
删除末尾位
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reference back() const
常量版本,访问最后一个位
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
NEFORCE_CONSTEXPR20 void push_back(const bool value)
在末尾插入位
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator cbegin() const noexcept
获取常量起始迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const_iterator begin() const noexcept
获取常量起始迭代器
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_type size() const noexcept
获取位数
NEFORCE_CONSTEXPR20 bitmap(Iterator first, Iterator last)
范围构造函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool empty() const noexcept
检查是否为空
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
NEFORCE_ALWAYS_INLINE enable_if_t< is_void_v< T >, future_result_t< T > > get(future< T > &f)
通用future结果获取函数
NEFORCE_INLINE17 constexpr uint32_t BITMAP_WORD_SIZE
每个字的位数
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))
字典序比较两个范围
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
#define NEFORCE_DEBUG_VERIFY(CON, MESG)
调试模式断言
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
standard_allocator< T > allocator
标准分配器别名
NEFORCE_ALLOC_OPTIMIZE NEFORCE_CONSTEXPR20 void * allocate(const inner::alloc_size_t bytes)
内存分配函数
constexpr void fill(Iterator first, Iterator last, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充范围元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr Iterator fill_n(Iterator first, iter_difference_t< Iterator > n, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充指定数量的元素
void swap()=delete
删除无参数的swap重载
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
NEFORCE_CONSTEXPR20 bit_reference & operator=(const bit_reference &other) noexcept
拷贝赋值运算符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator<(const bit_reference &rhs) const noexcept
小于比较操作符
NEFORCE_CONSTEXPR20 bit_reference()=default
默认构造函数
NEFORCE_CONSTEXPR20 bit_reference(uint32_t *ptr, const uint32_t mask) noexcept
构造函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 size_t to_hash() const noexcept
计算哈希值
NEFORCE_CONSTEXPR20 bit_reference(bit_reference &&other) noexcept
移动构造函数
NEFORCE_CONSTEXPR20 bit_reference & operator=(bit_reference &&other) noexcept
移动赋值运算符
NEFORCE_CONSTEXPR20 bit_reference & operator=(const bool value) noexcept
赋值布尔值
NEFORCE_CONSTEXPR20 bit_reference(const bit_reference &other) noexcept
拷贝构造函数
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_string() const
转换为字符串
NEFORCE_CONSTEXPR20 void swap(bit_reference &other) noexcept
交换两个位引用
NEFORCE_CONSTEXPR20 void flip() const noexcept
翻转位值
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 bool operator==(const bit_reference &rhs) const noexcept
相等比较操作符
typename container_type::value_type value_type
值类型
BitMap container_type
容器类型
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 pointer base() const noexcept
获取底层指针
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 const container_type * container() const noexcept
获取关联容器
random_access_iterator_tag iterator_category
迭代器类别
NEFORCE_CONSTEXPR20 bitmap_iterator(const bitmap_iterator< IsConst2, BitMap > &other) noexcept
从另一个迭代器转换构造
conditional_t< IsConst, typename container_type::const_reference, typename container_type::reference > reference
引用类型
conditional_t< IsConst, typename container_type::const_pointer, typename container_type::pointer > pointer
指针类型
NEFORCE_CONSTEXPR20 void increment() noexcept
递增操作
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 reference dereference() const noexcept
解引用操作
NEFORCE_CONSTEXPR20 void decrement() noexcept
递减操作
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 difference_type distance_to(const bitmap_iterator &other) const noexcept
计算距离操作
typename container_type::size_type size_type
大小类型
NEFORCE_CONSTEXPR20 bool less_than(const bitmap_iterator &rhs) const noexcept
小于比较
NEFORCE_CONSTEXPR20 reference operator[](const difference_type n) const noexcept
下标访问操作符
NEFORCE_CONSTEXPR20 void advance(difference_type off) noexcept
前进操作
NEFORCE_CONSTEXPR20 bool equal(const bitmap_iterator &rhs) const noexcept
相等比较
typename container_type::difference_type difference_type
差值类型
constexpr compressed_pair & get_base() noexcept
获取基类引用