diff --git a/Kernel/include_std/set b/Kernel/include_std/set new file mode 100644 index 00000000..1bc02ce7 --- /dev/null +++ b/Kernel/include_std/set @@ -0,0 +1,280 @@ +/* + This file is part of Fennix Kernel. + + Fennix Kernel is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + Fennix Kernel is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Fennix Kernel. If not, see . +*/ + +#pragma once + +#include +#include +#include +#include + +namespace std +{ + template , class Allocator = std::allocator> + class multiset; + + template , class Allocator = std::allocator> + class set + { + public: + template + struct __set_return_type + { + Iter position; + bool inserted; + NodeType node; + }; + + using key_type = Key; + using value_type = Key; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using key_compare = Compare; + using value_compare = Compare; + using allocator_type = Allocator; + using reference = value_type &; + using const_reference = const value_type &; + using pointer = std::allocator_traits::pointer; + using const_pointer = std::allocator_traits::const_pointer; + using iterator = value_type; + using const_iterator = const value_type; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + using node_type = std::unique_ptr; + using insert_return_type = __set_return_type; + + private: + public: +#pragma region Constructors + + set() : set(Compare()) {} + + explicit set(const Compare &comp, const Allocator &alloc = Allocator()); + + explicit set(const Allocator &alloc); + + template + set(InputIt first, InputIt last, const Compare &comp = Compare(), const Allocator &alloc = Allocator()); + + template + set(InputIt first, InputIt last, const Allocator &alloc) : set(first, last, Compare(), alloc) {} + + set(const set &other); + + set(const set &other, const Allocator &alloc); + + set(set &&other); + + set(set &&other, const Allocator &alloc); + + set(std::initializer_list init, const Compare &comp = Compare(), const Allocator &alloc = Allocator()); + + set(std::initializer_list init, const Allocator &alloc) : set(init, Compare(), alloc) {} + + ~set(); + +#pragma endregion Constructors + +#pragma region Assignment + + set &operator=(const set &other); + + set &operator=(set &&other) noexcept(std::allocator_traits::is_always_equal::value && std::is_nothrow_move_assignable::value); + + set &operator=(std::initializer_list ilist); + + allocator_type get_allocator() const noexcept; + +#pragma endregion Assignment + +#pragma region Iterators + + iterator begin() noexcept; + + const_iterator begin() const noexcept; + + const_iterator cbegin() const noexcept; + + iterator end() noexcept; + + const_iterator end() const noexcept; + + const_iterator cend() const noexcept; + + reverse_iterator rbegin() noexcept; + + const_reverse_iterator rbegin() const noexcept; + + const_reverse_iterator crbegin() const noexcept; + + reverse_iterator rend() noexcept; + + const_reverse_iterator rend() const noexcept; + + const_reverse_iterator crend() const noexcept; + +#pragma endregion Iterators + +#pragma region Capacity + + bool empty() const noexcept; + + size_type size() const noexcept; + + size_type max_size() const noexcept; + +#pragma endregion Capacity + +#pragma region Modifiers + + void clear() noexcept; + + std::pair insert(const value_type &value); + + std::pair insert(value_type &&value); + + iterator insert(const_iterator pos, const value_type &value); + + iterator insert(const_iterator pos, value_type &&value); + + template + void insert(InputIt first, InputIt last); + + void insert(std::initializer_list ilist); + + insert_return_type insert(node_type &&nh); + + iterator insert(const_iterator pos, node_type &&nh); + + template + std::pair emplace(Args &&...args); + + template + iterator emplace_hint(const_iterator hint, Args &&...args); + + iterator erase(const_iterator pos); + + iterator erase(const_iterator first, const_iterator last); + + size_type erase(const Key &key); + + void swap(set &other) noexcept(std::allocator_traits::is_always_equal::value && std::is_nothrow_swappable::value); + + node_type extract(const_iterator position); + + node_type extract(const Key &k); + + template + void merge(std::set &source); + + template + void merge(std::set &&source); + + template + void merge(std::multiset &source); + + template + void merge(std::multiset &&source); + +#pragma endregion Modifiers + +#pragma region Lookup + + size_type count(const Key &key) const; + + template + size_type count(const K &x) const; + + iterator find(const Key &key); + + const_iterator find(const Key &key) const; + + template + iterator find(const K &x); + + template + const_iterator find(const K &x) const; + + bool contains(const Key &key) const; + + template + bool contains(const K &x) const; + + std::pair equal_range(const Key &key); + + std::pair equal_range(const Key &key) const; + + template + std::pair equal_range(const K &x); + + template + std::pair equal_range(const K &x) const; + + iterator lower_bound(const Key &key); + + const_iterator lower_bound(const Key &key) const; + + template + iterator lower_bound(const K &x); + + template + const_iterator lower_bound(const K &x) const; + + iterator upper_bound(const Key &key); + + const_iterator upper_bound(const Key &key) const; + + template + iterator upper_bound(const K &x); + + template + const_iterator upper_bound(const K &x) const; + +#pragma endregion Lookup + +#pragma region Observers + + key_compare key_comp() const; + + set::value_compare value_comp() const; + +#pragma endregion Observers + }; + + template + bool operator==(const std::set &lhs, const std::set &rhs); + + // template + // std::strong_ordering operator<=>(const std::set &lhs, const std::set &rhs); + + template + void swap(std::set &lhs, std::set &rhs) noexcept(noexcept(lhs.swap(rhs))); + + template + std::set::size_type erase_if(std::set &c, Pred pred) + { + auto old_size = c.size(); + for (auto first = c.begin(), last = c.end(); first != last;) + { + if (pred(*first)) + first = c.erase(first); + else + ++first; + } + return old_size - c.size(); + } +}