11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
14#include <initializer_list>
20PROMEKI_NAMESPACE_BEGIN
45template <
typename T>
class Set {
46 PROMEKI_SHARED_FINAL(Set)
49 using Ptr = SharedPtr<Set>;
52 using Data = std::set<T>;
55 using Iterator =
typename Data::iterator;
58 using ConstIterator =
typename Data::const_iterator;
61 using RevIterator =
typename Data::reverse_iterator;
64 using ConstRevIterator =
typename Data::const_reverse_iterator;
70 Set(
const Set &other) : d(other.d) {}
73 Set(Set &&other) noexcept : d(std::move(other.d)) {}
79 Set(std::initializer_list<T> initList) : d(initList) {}
85 Set &operator=(
const Set &other) {
91 Set &operator=(Set &&other)
noexcept {
92 d = std::move(other.d);
99 Iterator begin() noexcept {
return d.begin(); }
102 ConstIterator begin() const noexcept {
return d.cbegin(); }
105 ConstIterator cbegin() const noexcept {
return d.cbegin(); }
108 ConstIterator constBegin() const noexcept {
return d.cbegin(); }
111 Iterator end() noexcept {
return d.end(); }
114 ConstIterator end() const noexcept {
return d.cend(); }
117 ConstIterator cend() const noexcept {
return d.cend(); }
120 ConstIterator constEnd() const noexcept {
return d.cend(); }
123 RevIterator rbegin() noexcept {
return d.rbegin(); }
126 RevIterator revBegin() noexcept {
return d.rbegin(); }
129 ConstRevIterator crbegin() const noexcept {
return d.crbegin(); }
132 ConstRevIterator constRevBegin() const noexcept {
return d.crbegin(); }
135 RevIterator rend() noexcept {
return d.rend(); }
138 RevIterator revEnd() noexcept {
return d.rend(); }
141 ConstRevIterator crend() const noexcept {
return d.crend(); }
144 ConstRevIterator constRevEnd() const noexcept {
return d.crend(); }
149 bool isEmpty() const noexcept {
return d.empty(); }
152 size_t size() const noexcept {
return d.size(); }
157 bool contains(
const T &value)
const {
return d.find(value) != d.end(); }
164 Iterator find(
const T &value) {
return d.find(value); }
167 ConstIterator find(
const T &value)
const {
return d.find(value); }
174 Iterator lowerBound(
const T &value) {
return d.lower_bound(value); }
177 ConstIterator lowerBound(
const T &value)
const {
return d.lower_bound(value); }
184 Iterator upperBound(
const T &value) {
return d.upper_bound(value); }
187 ConstIterator upperBound(
const T &value)
const {
return d.upper_bound(value); }
199 Pair<Iterator, bool> insert(
const T &value) {
return Pair<Iterator, bool>(d.insert(value)); }
207 Pair<Iterator, bool> insert(T &&value) {
return Pair<Iterator, bool>(d.insert(std::move(value))); }
214 bool remove(
const T &value) {
return d.erase(value) > 0; }
221 Iterator remove(Iterator pos) {
return d.erase(pos); }
224 void clear() noexcept {
233 void swap(Set &other)
noexcept {
245 Set unite(
const Set &other)
const {
247 for (
const auto &v : other.d) ret.d.insert(v);
256 Set intersect(
const Set &other)
const {
258 for (
const auto &v : d) {
259 if (other.contains(v)) ret.d.insert(v);
269 Set subtract(
const Set &other)
const {
271 for (
const auto &v : d) {
272 if (!other.contains(v)) ret.d.insert(v);
283 List<T> toList()
const {
285 ret.reserve(d.size());
286 for (
const auto &v : d) ret.pushToBack(v);
295 template <
typename Func>
void forEach(Func &&func)
const {
296 for (
const auto &v : d) func(v);
303 friend bool operator==(
const Set &lhs,
const Set &rhs) {
return lhs.d == rhs.d; }
306 friend bool operator!=(
const Set &lhs,
const Set &rhs) {
return lhs.d != rhs.d; }