#ifndef __GBLIBCPP_SET__ #define __GBLIBCPP_SET__ #include #include #include #include #include #include namespace std { template , typename Allocator = std::allocator> class set { private: using rbtree_type = impl::rbtree; using node_allocator = typename rbtree_type::node_allocator; private: rbtree_type tree; public: using key_type = Key; using value_type = Key; using size_type = std::size_t; using allocator_type = Allocator; using iterator = typename rbtree_type::iterator; using const_iterator = typename rbtree_type::const_iterator; public: __GBLIBCPP_CONSTEXPR iterator end(void) noexcept { return tree.end(); } __GBLIBCPP_CONSTEXPR const_iterator end(void) const noexcept { return tree.cend(); } __GBLIBCPP_CONSTEXPR const_iterator cend(void) const noexcept { return tree.cend(); } __GBLIBCPP_CONSTEXPR iterator begin(void) noexcept { return tree.begin(); } __GBLIBCPP_CONSTEXPR const_iterator begin(void) const noexcept { return tree.cbegin(); } __GBLIBCPP_CONSTEXPR const_iterator cbegin(void) const noexcept { return tree.cbegin(); } explicit __GBLIBCPP_CONSTEXPR set(const Compare& comp, const Allocator& alloc = Allocator()) : tree(comp, alloc) {} explicit __GBLIBCPP_CONSTEXPR set(const Allocator& alloc) : set(Compare(), alloc) {} __GBLIBCPP_CONSTEXPR set() : set(Compare()) {} template __GBLIBCPP_CONSTEXPR set(InputIter first, InputIter last, const Compare& comp = Compare(), const Allocator& alloc = Allocator()) : set(comp, alloc) { insert(first, last); } template __GBLIBCPP_CONSTEXPR set(InputIter first, InputIter last, const Allocator& alloc = Allocator()) : set(first, last, Compare(), alloc) {} __GBLIBCPP_CONSTEXPR set(const set& other) : tree(other.tree) {} __GBLIBCPP_CONSTEXPR set(const set& other, const Allocator& alloc) : tree(other.tree, alloc) { } __GBLIBCPP_CONSTEXPR set(set&& other) : tree(std::move(other.tree)) {} __GBLIBCPP_CONSTEXPR set(set&& other, const Allocator& alloc) : tree(std::move(other.tree), alloc) {} __GBLIBCPP_CONSTEXPR set(std::initializer_list ilist, const Compare& comp = Compare(), const Allocator& alloc = Allocator()) : set(comp, alloc) { insert(ilist.begin(), ilist.end()); } __GBLIBCPP_CONSTEXPR set(std::initializer_list ilist, const Allocator& alloc) : set(ilist, Compare(), alloc) {} __GBLIBCPP_CONSTEXPR ~set() { clear(); } __GBLIBCPP_CONSTEXPR set& operator=(const set& other) = default; __GBLIBCPP_CONSTEXPR set& operator=(set&& other) = default; __GBLIBCPP_CONSTEXPR set& operator=(std::initializer_list ilist) { clear(); insert(ilist.begin(), ilist.end()); return *this; } __GBLIBCPP_CONSTEXPR iterator find(const Key& key) { return tree.find(key); } __GBLIBCPP_CONSTEXPR const_iterator find(const Key& key) const { return tree.find(key); } template __GBLIBCPP_CONSTEXPR iterator find(const K& key) { return tree.find(key); } template __GBLIBCPP_CONSTEXPR const_iterator find(const K& key) const { return tree.find(key); } __GBLIBCPP_CONSTEXPR std::pair insert(const value_type& value) { return tree.insert(value); } __GBLIBCPP_CONSTEXPR std::pair insert(value_type&& value) { return tree.insert(std::move(value)); } template __GBLIBCPP_CONSTEXPR void insert(InputIter first, InputIter last) { for ( ; first != last; ++first) insert(*first); } template __GBLIBCPP_CONSTEXPR std::pair emplace(Args&&... args) { return tree.emplace(std::forward(args)...); } __GBLIBCPP_CONSTEXPR iterator erase(iterator pos) noexcept { return tree.erase(pos); } __GBLIBCPP_CONSTEXPR iterator erase(const_iterator pos) noexcept { return tree.erase(pos); } __GBLIBCPP_CONSTEXPR iterator erase(const_iterator first, const_iterator last) noexcept { while (first != last) first = erase(first); return first; } __GBLIBCPP_CONSTEXPR size_type erase(const Key& key) { auto iter = find(key); if (!iter) return 0; erase(iter); return 1; } __GBLIBCPP_CONSTEXPR void clear() noexcept { tree.destroy(); } __GBLIBCPP_CONSTEXPR bool empty() const noexcept { return tree.empty(); } __GBLIBCPP_CONSTEXPR size_type size() const noexcept { return tree.size(); } __GBLIBCPP_CONSTEXPR void swap(set& other) { tree.swap(other.tree); } __GBLIBCPP_CONSTEXPR size_type count(const Key& key) const { return find(key) ? 1 : 0; } __GBLIBCPP_CONSTEXPR bool contains(const Key& key) const { return count(key) != 0; } __GBLIBCPP_CONSTEXPR iterator upper_bound(const Key& key) { return tree.upper_bound(key); } __GBLIBCPP_CONSTEXPR const_iterator upper_bound(const Key& key) const { return tree.upper_bound(key); } __GBLIBCPP_CONSTEXPR iterator lower_bound(const Key& key) { return tree.lower_bound(key); } __GBLIBCPP_CONSTEXPR const_iterator lower_bound(const Key& key) const { return tree.lower_bound(key); } }; template void swap(std::set& lhs, std::set& rhs) { lhs.swap(rhs); } template typename std::set::size_type erase_if(std::set& set, Pred pred) { auto iter = set.begin(); typename std::set::size_type count = 0; while (iter != set.end()) { if (pred(*iter)) { iter = set.erase(iter); ++count; } else { ++iter; } } return count; } template , typename Allocator = std::allocator> set(std::initializer_list, Compare = Compare(), Allocator = Allocator()) -> set; template set(std::initializer_list, Allocator) -> set, Allocator>; } // namespace std #endif