26 using value_type = remove_cvref_t<T>;
30 using const_reverse_iterator =
_MSTD_TYPENAME17 std::vector<value_type>::const_reverse_iterator;
33 std::vector<value_type> _orderedElements;
34 std::unordered_map<value_type, size_t> _elementsMap;
37 static_assert(std::is_copy_constructible_v<value_type>,
"Is not copy constructible");
38 for (size_t i = from; i != _orderedElements.size(); ++i) { _elementsMap[_orderedElements[i]] = i; }
43 if (!contains(item)) {
45 std::clamp<size_t>(std::distance(_orderedElements.cbegin(), where), 0, _orderedElements.size());
47 _orderedElements.insert(where, std::forward<U>(item));
49 _update_indexes(whereOffset);
50 return *std::next(_orderedElements.begin(), whereOffset);
54 std::clamp<size_t>(std::distance(_orderedElements.cbegin(), where), 0, _orderedElements.size() - 1);
55 const size_t& elementOffset = _elementsMap.at(item);
58 _orderedElements.erase(std::next(_orderedElements.cbegin(), elementOffset));
61 _orderedElements.insert(std::next(_orderedElements.cbegin(), whereOffset), std::forward<U>(item));
64 if (whereOffset > elementOffset) { _update_indexes(elementOffset); }
65 else { _update_indexes(whereOffset); }
67 return *std::next(_orderedElements.begin(), whereOffset);
72 return insert(cend(), std::forward<U>(item));
77 if (!contains(item)) {
return; }
79 size_t elementOffset = _elementsMap.at(item);
81 _orderedElements.erase(std::next(_orderedElements.begin(), elementOffset));
82 _elementsMap.erase(std::forward<U>(item));
84 _update_indexes(elementOffset);
90 return _elementsMap.contains(std::forward<U>(item));
92 return _elementsMap.find(std::forward<U>(item)) != _elementsMap.end();
98 auto it = _elementsMap.find(std::forward<U>(item));
99 return it != _elementsMap.end() ? std::next(_orderedElements.begin(), it->second) : _orderedElements.end();
104 auto it = _elementsMap.find(std::forward<U>(item));
105 return it != _elementsMap.end() ? std::next(_orderedElements.begin(), it->second) : _orderedElements.end();
114 _MSTD_CONSTEXPR20 ordered_set(std::initializer_list<value_type> init) { insert_back(init.begin(), init.end()); }
117 template<mstd::iterator_of<value_type> Iter>
119 template<
class Iter, std::enable_if_t<is_iterator_of_v<Iter, value_type>,
bool> =
true>
122 insert_back(begin, end);
131 template<
class... Args>
133 template<
class... Args, std::enable_if_t<std::is_constructible_v<value_type, Args...>,
bool> =
true>
136 Args&&... args)
_MSTD_REQUIRES((std::constructible_from<value_type, Args...>)) {
137 const size_t whereOffset =
138 std::clamp<size_t>(std::distance(_orderedElements.cbegin(), where), 0, _orderedElements.size());
140 _orderedElements.emplace(where, std::forward<Args>(args)...);
142 _update_indexes(whereOffset);
144 return *std::next(_orderedElements.begin(), whereOffset);
148 template<
class... Args>
150 template<
class... Args, std::enable_if_t<std::is_constructible_v<value_type, Args...>,
bool> =
true>
154 )
_MSTD_REQUIRES((std::constructible_from<value_type, Args...>)) {
155 return emplace(cend(), std::forward<Args>(args)...);
158 _MSTD_CONSTEXPR20 value_type& insert(const_iterator where, value_type&& item) {
return _insert(where, std::move(item)); }
160 _MSTD_CONSTEXPR20 value_type& insert(const_iterator where,
const value_type& item) {
return _insert(where, item); }
163 template<mstd::iterator_of<value_type> Iter>
165 template<
class Iter, std::enable_if_t<is_iterator_of_v<Iter, value_type>,
bool> =
true>
168 size_t currWhereOffset = std::distance(_orderedElements.cbegin(), where);
169 for (Iter iter = begin; iter != end; ++iter, ++currWhereOffset) {
170 currWhereOffset = std::clamp<size_t>(currWhereOffset, 0, _orderedElements.size());
171 insert(std::next(_orderedElements.begin(), currWhereOffset), *iter);
176 insert(where, init.begin(), init.end());
179 _MSTD_CONSTEXPR20 value_type& insert_back(
const value_type& item) {
return _insert_back(item); }
181 _MSTD_CONSTEXPR20 value_type& insert_back(value_type&& item) {
return _insert_back(std::move(item)); }
184 template<mstd::iterator_of<value_type> Iter>
186 template<
class Iter, std::enable_if_t<is_iterator_of_v<Iter, value_type>,
bool> =
true>
189 insert(cend(), begin, end);
192 _MSTD_CONSTEXPR20 void insert_back(std::initializer_list<value_type> init) { insert_back(init.begin(), init.end()); }
198 [[nodiscard]]
_MSTD_CONSTEXPR20 bool contains(
const value_type& item)
const {
return _contains(item); }
200 [[nodiscard]]
_MSTD_CONSTEXPR20 bool contains(value_type&& item)
const {
return _contains(std::move(item)); }
204 [[nodiscard]]
_MSTD_CONSTEXPR20 iterator find(value_type&& item) {
return _find(std::move(item)); }
206 [[nodiscard]]
_MSTD_CONSTEXPR20 const_iterator find(
const value_type& item)
const {
return _find(item); }
217 _orderedElements.clear();
218 _elementsMap.clear();
223 [[nodiscard]]
_MSTD_CONSTEXPR20 const value_type& front()
const {
return _orderedElements.front(); }
227 [[nodiscard]]
_MSTD_CONSTEXPR20 const value_type& back()
const {
return _orderedElements.back(); }
229 [[nodiscard]]
_MSTD_CONSTEXPR20 value_type& at(
const size_t idx) {
return _orderedElements.at(idx); }
231 [[nodiscard]]
_MSTD_CONSTEXPR20 const value_type& at(
const size_t idx)
const {
return _orderedElements.at(idx); }
237 [[nodiscard]]
_MSTD_CONSTEXPR20 const_iterator begin()
const {
return _orderedElements.cbegin(); }
241 [[nodiscard]]
_MSTD_CONSTEXPR20 const_iterator cbegin()
const {
return _orderedElements.cbegin(); }
249 [[nodiscard]]
_MSTD_CONSTEXPR20 const_reverse_iterator rbegin()
const {
return _orderedElements.crbegin(); }
251 [[nodiscard]]
_MSTD_CONSTEXPR20 const_reverse_iterator rend()
const {
return _orderedElements.crend(); }
253 [[nodiscard]]
_MSTD_CONSTEXPR20 const_reverse_iterator crbegin()
const {
return _orderedElements.crbegin(); }
255 [[nodiscard]]
_MSTD_CONSTEXPR20 const_reverse_iterator crend()
const {
return _orderedElements.crend(); }
258 return _orderedElements == other._orderedElements;
261 [[nodiscard]]
_MSTD_CONSTEXPR20 bool operator!=(
const ordered_set& other)
const {
return !(*
this == other); }
263 [[nodiscard]]
_MSTD_CONSTEXPR20 value_type& operator[](
const size_t idx) {
return _orderedElements[idx]; }
265 [[nodiscard]]
_MSTD_CONSTEXPR20 const value_type& operator[](
const size_t idx)
const {
return _orderedElements[idx]; }