Go to the documentation of this file.
19 #ifndef MOMO_INCLUDE_GUARD_STDISH_SET
20 #define MOMO_INCLUDE_GUARD_STDISH_SET
23 #include MOMO_PARENT_HEADER(TreeSet)
31 template<
typename TTreeSet>
35 typedef TTreeSet TreeSet;
50 typedef typename std::allocator_traits<typename MemManager::ByteAllocator>
73 template<
typename KeyArg>
74 struct IsValidKeyArg :
public TreeTraits::template IsValidKeyArg<KeyArg>
90 : mTreeSet(TreeTraits(), MemManager(alloc))
95 : mTreeSet(TreeTraits(lessComp), MemManager(alloc))
99 template<
typename Iterator>
106 template<
typename Iterator>
116 : mTreeSet(values, TreeTraits(), MemManager(alloc))
122 : mTreeSet(values, TreeTraits(lessComp), MemManager(alloc))
126 #ifdef MOMO_HAS_CONTAINERS_RANGES
127 template<std::ranges::input_range Range>
128 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
132 insert_range(std::forward<Range>(values));
135 template<std::ranges::input_range Range>
136 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
141 insert_range(std::forward<Range>(values));
143 #endif // MOMO_HAS_CONTAINERS_RANGES
151 : mTreeSet(right.mTreeSet.GetTreeTraits(), MemManager(alloc))
153 if (right.get_allocator() == alloc)
155 mTreeSet.Swap(right.mTreeSet);
159 mTreeSet.MergeFrom(right.mTreeSet);
165 : mTreeSet(right.mTreeSet)
170 : mTreeSet(right.mTreeSet, MemManager(alloc))
189 mTreeSet = TreeSet(values, mTreeSet.GetTreeTraits(), MemManager(
get_allocator()));
215 return mTreeSet.GetBegin();
222 return mTreeSet.GetEnd();
263 return mTreeSet.GetTreeTraits().GetLessComparer();
273 return allocator_type(mTreeSet.GetMemManager().GetByteAllocator());
278 return std::allocator_traits<allocator_type>::max_size(
get_allocator());
283 return mTreeSet.GetCount();
288 return mTreeSet.IsEmpty();
298 return mTreeSet.Find(key);
303 template<
typename KeyArg>
307 return mTreeSet.Find(key);
316 return mTreeSet.GetKeyCount(key);
319 template<
typename KeyArg>
323 return mTreeSet.GetKeyCount(key);
328 return mTreeSet.ContainsKey(key);
331 template<
typename KeyArg>
335 return mTreeSet.ContainsKey(key);
340 return mTreeSet.GetLowerBound(key);
345 template<
typename KeyArg>
349 return mTreeSet.GetLowerBound(key);
358 return mTreeSet.GetUpperBound(key);
363 template<
typename KeyArg>
367 return mTreeSet.GetUpperBound(key);
383 if (iter ==
end() || mTreeSet.GetTreeTraits().IsLess(key, *iter))
384 return { iter, iter };
385 return { iter, std::next(iter) };
391 template<
typename KeyArg>
393 std::pair<const_iterator, const_iterator>>
equal_range(
const KeyArg& key)
const
410 if (!pvCheckHint(hint,
static_cast<const key_type&
>(value)))
411 return insert(std::move(value)).first;
412 return mTreeSet.Add(hint, std::move(value));
423 if (!pvCheckHint(hint, value))
424 return insert(value).first;
425 return mTreeSet.Add(hint, value);
433 std::move(NodeTypeProxy::GetExtractedItem(node)));
441 if (!pvCheckHint(hint, node.value()))
442 return insert(std::move(node)).position;
443 return mTreeSet.Add(hint, std::move(NodeTypeProxy::GetExtractedItem(node)));
446 template<
typename Iterator>
447 void insert(Iterator first, Iterator last)
449 pvInsertRange(first, last);
452 void insert(std::initializer_list<value_type> values)
454 mTreeSet.Insert(values);
457 #ifdef MOMO_HAS_CONTAINERS_RANGES
458 template<std::ranges::input_range Range>
459 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
460 void insert_range(Range&& values)
462 pvInsertRange(std::ranges::begin(values), std::ranges::end(values));
464 #endif // MOMO_HAS_CONTAINERS_RANGES
466 template<
typename... ValueArgs>
467 std::pair<iterator, bool>
emplace(ValueArgs&&... valueArgs)
469 MemManager& memManager = mTreeSet.GetMemManager();
471 typedef typename TreeSet::ItemTraits::template Creator<ValueArgs...> ValueCreator;
472 extItem.
Create(ValueCreator(memManager, std::forward<ValueArgs>(valueArgs)...));
477 template<
typename ValueArg>
479 std::pair<iterator, bool>>
emplace(ValueArg&& valueArg)
482 static_cast<const key_type&
>(valueArg), std::forward<ValueArg>(valueArg));
486 template<
typename... ValueArgs>
489 MemManager& memManager = mTreeSet.GetMemManager();
491 typedef typename TreeSet::ItemTraits::template Creator<ValueArgs...> ValueCreator;
492 extItem.
Create(ValueCreator(memManager, std::forward<ValueArgs>(valueArgs)...));
493 if (!pvCheckHint(hint, extItem.
GetItem()))
494 return mTreeSet.Insert(std::move(extItem)).position;
495 return mTreeSet.Add(hint, std::move(extItem));
498 template<
typename ValueArg>
502 if (!pvCheckHint(hint,
static_cast<const key_type&
>(valueArg)))
503 return emplace(std::forward<ValueArg>(valueArg)).first;
504 return mTreeSet.AddVar(hint, std::forward<ValueArg>(valueArg));
509 return mTreeSet.Remove(where);
516 return mTreeSet.Remove(first, last);
521 return mTreeSet.Remove(key);
524 template<
typename ValueFilter>
527 return cont.mTreeSet.Remove(valueFilter);
541 template<
typename Set>
552 #ifdef MOMO_HAS_THREE_WAY_COMPARISON
554 requires requires (
const_reference ref) { std::tie(ref) <=> std::tie(ref); }
557 {
return std::tie(value1) <=> std::tie(value2); };
558 return std::lexicographical_compare_three_way(left.begin(), left.end(),
559 right.begin(), right.end(), valueThreeComp);
564 return std::lexicographical_compare(left.
begin(), left.
end(), right.
begin(), right.
end());
573 const TreeTraits& treeTraits = mTreeSet.GetTreeTraits();
575 : treeTraits.
IsLess(key1, key2);
580 if (hint !=
begin() && !pvIsOrdered(*std::prev(hint), key))
582 if (hint !=
end() && !pvIsOrdered(key, *hint))
591 template<
typename Iterator,
typename Sentinel>
593 void> pvInsertRange(Iterator
begin, Sentinel
end)
595 mTreeSet.Insert(std::move(
begin), std::move(
end));
598 template<
typename Iterator,
typename Sentinel>
600 void> pvInsertRange(Iterator
begin, Sentinel
end)
602 for (Iterator iter = std::move(
begin); iter !=
end; ++iter)
610 template<
typename TTreeSet>
624 using SetAdaptor::SetAdaptor;
654 template<
typename... ValueArgs>
685 template<
typename TKey,
686 typename TLessComparer = std::less<TKey>,
687 typename TAllocator = std::allocator<TKey>>
689 TreeTraitsStd<TKey, TLessComparer>, MemManagerStd<TAllocator>>>
696 using SetAdaptor::SetAdaptor;
698 set&
operator=(std::initializer_list<typename SetAdaptor::value_type> values)
718 template<
typename TKey,
719 typename TLessComparer = std::less<TKey>,
720 typename TAllocator = std::allocator<TKey>>
722 TreeTraitsStd<TKey, TLessComparer, true>, MemManagerStd<TAllocator>>>
729 using MultiSetAdaptor::MultiSetAdaptor;
743 #ifdef MOMO_HAS_DEDUCTION_GUIDES
745 #define MOMO_DECLARE_DEDUCTION_GUIDES(set) \
746 template<typename Iterator, \
747 typename Key = typename std::iterator_traits<Iterator>::value_type, \
748 typename Allocator = std::allocator<Key>, \
749 typename = internal::tree_checker<Key, Allocator>> \
750 set(Iterator, Iterator, Allocator = Allocator()) \
751 -> set<Key, std::less<Key>, Allocator>; \
752 template<typename Iterator, typename LessComparer, \
753 typename Key = typename std::iterator_traits<Iterator>::value_type, \
754 typename Allocator = std::allocator<Key>, \
755 typename = internal::tree_checker<Key, Allocator, LessComparer>> \
756 set(Iterator, Iterator, LessComparer, Allocator = Allocator()) \
757 -> set<Key, LessComparer, Allocator>; \
758 template<typename Key, \
759 typename Allocator = std::allocator<Key>, \
760 typename = internal::tree_checker<Key, Allocator>> \
761 set(std::initializer_list<Key>, Allocator = Allocator()) \
762 -> set<Key, std::less<Key>, Allocator>; \
763 template<typename Key, typename LessComparer, \
764 typename Allocator = std::allocator<Key>, \
765 typename = internal::tree_checker<Key, Allocator, LessComparer>> \
766 set(std::initializer_list<Key>, LessComparer, Allocator = Allocator()) \
767 -> set<Key, LessComparer, Allocator>; \
768 template<typename Key, typename LessComparer, typename Allocator> \
769 set(set<Key, LessComparer, Allocator>, momo::internal::Identity<Allocator>) \
770 -> set<Key, LessComparer, Allocator>;
772 MOMO_DECLARE_DEDUCTION_GUIDES(set)
773 MOMO_DECLARE_DEDUCTION_GUIDES(multiset)
775 #undef MOMO_DECLARE_DEDUCTION_GUIDES
777 #ifdef MOMO_HAS_CONTAINERS_RANGES
779 #define MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(set) \
780 template<std::ranges::input_range Range, \
781 typename Key = std::ranges::range_value_t<Range>, \
782 typename Allocator = std::allocator<Key>, \
783 typename = internal::tree_checker<Key, Allocator>> \
784 set(std::from_range_t, Range&&, Allocator = Allocator()) \
785 -> set<Key, std::less<Key>, Allocator>; \
786 template<std::ranges::input_range Range, typename LessComparer, \
787 typename Key = std::ranges::range_value_t<Range>, \
788 typename Allocator = std::allocator<Key>, \
789 typename = internal::tree_checker<Key, Allocator, LessComparer>> \
790 set(std::from_range_t, Range&&, LessComparer, Allocator = Allocator()) \
791 -> set<Key, LessComparer, Allocator>;
793 MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(set)
794 MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(multiset)
796 #undef MOMO_DECLARE_DEDUCTION_GUIDES_RANGES
798 #endif // MOMO_HAS_CONTAINERS_RANGES
800 #endif // MOMO_HAS_DEDUCTION_GUIDES
806 #endif // MOMO_INCLUDE_GUARD_STDISH_SET
const_iterator::Reference const_reference
Definition: set.h:58
Position position
Definition: IteratorUtility.h:132
const_reverse_iterator crend() const noexcept
Definition: set.h:256
#define MOMO_MORE_COMPARISON_OPERATORS(RClass)
Definition: Utility.h:86
iterator insert(const value_type &value)
Definition: set.h:644
iterator insert(node_type &&node)
Definition: set.h:649
value_type * pointer
Definition: set.h:61
set_adaptor(const allocator_type &alloc)
Definition: set.h:89
#define MOMO_DECLARE_PROXY_FUNCTION(Class, Func)
Definition: Utility.h:116
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, size_type > count(const KeyArg &key) const
Definition: set.h:321
const Item * Pointer
Definition: TreeSet.h:42
bool IsLess(const KeyArg1 &key1, const KeyArg2 &key2) const
Definition: TreeTraits.h:107
momo::internal::EnableIf< std::is_same< key_type, typename std::decay< ValueArg >::type >::value, iterator > emplace_hint(const_iterator hint, ValueArg &&valueArg)
Definition: set.h:500
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, bool > contains(const KeyArg &key) const
Definition: set.h:333
nested_container_type & get_nested_container() noexcept
Definition: set.h:208
node_type extract(const key_type &key)
Definition: set.h:535
std::pair< const_iterator, const_iterator > equal_range(const key_type &key) const
Definition: set.h:374
const Item & Reference
Definition: TreeSet.h:41
const_iterator lower_bound(const key_type &key) const
Definition: set.h:338
void clear() noexcept
Definition: set.h:291
set_adaptor(set_adaptor &&right, const allocator_type &alloc)
Definition: set.h:150
size_type count(const key_type &key) const
Definition: set.h:314
size_type size() const noexcept
Definition: set.h:281
iterator insert(value_type &&value)
Definition: set.h:639
std::pair< iterator, bool > emplace(ValueArgs &&... valueArgs)
Definition: set.h:467
value_type & reference
Definition: set.h:57
Definition: set_map_utility.h:202
std::reverse_iterator< iterator > reverse_iterator
Definition: set.h:66
friend bool operator==(const set_adaptor &left, const set_adaptor &right)
Definition: set.h:547
internal::set_node_handle< typename TreeSet::ExtractedItem > node_type
Definition: set.h:69
const_iterator cend() const noexcept
Definition: set.h:246
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, std::pair< const_iterator, const_iterator > > equal_range(const KeyArg &key) const
Definition: set.h:393
iterator emplace_hint(const_iterator hint, ValueArgs &&... valueArgs)
Definition: set.h:487
momo::stdish::set is similar to std::set, but much more efficient in memory usage....
Definition: set.h:690
set_adaptor(std::initializer_list< value_type > values, const key_compare &lessComp, const allocator_type &alloc=allocator_type())
Definition: set.h:120
MemManagerStd uses allocator<unsigned char>::allocate and deallocate
Definition: MemManager.h:179
Definition: TreeTraits.h:82
iterator insert_return_type
Definition: set.h:621
set_adaptor(std::initializer_list< value_type > values, const allocator_type &alloc=allocator_type())
Definition: set.h:114
static Container & Move(Container &&srcCont, Container &dstCont) noexcept(IsNothrowMoveAssignable< Container >::value)
Definition: Utility.h:515
friend void swap(multiset_adaptor &left, multiset_adaptor &right) noexcept
Definition: set.h:632
Definition: IteratorUtility.h:100
iterator emplace(ValueArgs &&... valueArgs)
Definition: set.h:655
momo::stdish::multiset is similar to std::multiset, but much more efficient in memory usage....
Definition: set.h:723
TTreeTraits TreeTraits
Definition: TreeSet.h:300
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, const_iterator > find(const KeyArg &key) const
Definition: set.h:305
multiset & operator=(std::initializer_list< typename MultiSetAdaptor::value_type > values)
Definition: set.h:731
iterator erase(const_iterator where)
Definition: set.h:507
size_t size_type
Definition: set.h:45
typename std::enable_if< value, Type >::type EnableIf
Definition: Utility.h:199
key_compare value_compare
Definition: set.h:49
void swap(set_adaptor &right) noexcept
Definition: set.h:193
allocator_type get_allocator() const noexcept
Definition: set.h:271
friend void swap(multiset &left, multiset &right) noexcept
Definition: set.h:737
BoolConstant< std::is_empty< Allocator >::value||std::allocator_traits< Allocator >::propagate_on_container_move_assignment::value > IsNothrowMoveAssignable
Definition: Utility.h:511
const_reverse_iterator crbegin() const noexcept
Definition: set.h:251
TreeTraits::LessComparer key_compare
Definition: set.h:41
bool inserted
Definition: IteratorUtility.h:135
Definition: TreeTraits.h:124
insert_return_type insert(node_type &&node)
Definition: set.h:428
const_iterator find(const key_type &key) const
Definition: set.h:296
const_iterator cbegin() const noexcept
Definition: set.h:241
iterator insert(const_iterator hint, value_type &&value)
Definition: set.h:408
internal::insert_return_type< iterator, node_type > insert_return_type
Definition: set.h:70
friend size_type erase_if(set_adaptor &cont, const ValueFilter &valueFilter)
Definition: set.h:525
friend bool operator<(const set_adaptor &left, const set_adaptor &right)
Definition: set.h:562
friend void swap(set_adaptor &left, set_adaptor &right) noexcept
Definition: set.h:198
TreeSet::ConstIterator const_iterator
Definition: set.h:53
key_type value_type
Definition: set.h:48
void insert(Iterator first, Iterator last)
Definition: set.h:447
bool contains(const key_type &key) const
Definition: set.h:326
key_compare key_comp() const
Definition: set.h:261
size_type erase(const key_type &key)
Definition: set.h:519
TreeSet::Iterator iterator
Definition: set.h:54
multiset_adaptor & operator=(std::initializer_list< value_type > values)
Definition: set.h:626
#define MOMO_CONSTEXPR_IF
Definition: UserSettings.h:228
std::pair< iterator, bool > insert(const value_type &value)
Definition: set.h:415
set_adaptor(Iterator first, Iterator last, const key_compare &lessComp, const allocator_type &alloc=allocator_type())
Definition: set.h:107
const_reverse_iterator rend() const noexcept
Definition: set.h:234
ptrdiff_t difference_type
Definition: set.h:46
iterator insert(const_iterator hint, const value_type &value)
Definition: set.h:421
const_reverse_iterator rbegin() const noexcept
Definition: set.h:227
const_iterator upper_bound(const key_type &key) const
Definition: set.h:356
set_adaptor(const key_compare &lessComp, const allocator_type &alloc=allocator_type())
Definition: set.h:94
iterator insert(const_iterator hint, node_type &&node)
Definition: set.h:437
set_adaptor(Iterator first, Iterator last, const allocator_type &alloc=allocator_type())
Definition: set.h:100
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, const_iterator > lower_bound(const KeyArg &key) const
Definition: set.h:347
MOMO_NODISCARD bool empty() const noexcept
Definition: set.h:286
ItemTraits::MemManager MemManager
Definition: TreeSet.h:304
set_adaptor(const set_adaptor &right, const allocator_type &alloc)
Definition: set.h:169
momo::internal::EnableIf< std::is_same< key_type, typename std::decay< ValueArg >::type >::value, std::pair< iterator, bool > > emplace(ValueArg &&valueArg)
Definition: set.h:479
void merge(Set &&set_adaptor)
Definition: set.h:542
std::allocator_traits< typename MemManager::ByteAllocator >::template rebind_alloc< value_type > allocator_type
Definition: set.h:51
friend void swap(set &left, set &right) noexcept
Definition: set.h:704
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: set.h:67
std::pair< iterator, bool > insert(value_type &&value)
Definition: set.h:402
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, const_iterator > upper_bound(const KeyArg &key) const
Definition: set.h:365
Definition: set_map_utility.h:42
set_adaptor(const set_adaptor &right)
Definition: set.h:164
set_adaptor(set_adaptor &&right)
Definition: set.h:145
set & operator=(std::initializer_list< typename SetAdaptor::value_type > values)
Definition: set.h:698
set_adaptor & operator=(const set_adaptor &right)
Definition: set.h:182
ItemTraits::Key Key
Definition: TreeSet.h:302
TreeSet nested_container_type
Definition: set.h:43
set_adaptor()
Definition: set.h:85
set_adaptor & operator=(set_adaptor &&right) noexcept(momo::internal::ContainerAssignerStd::IsNothrowMoveAssignable< set_adaptor >::value)
Definition: set.h:176
static Container & Copy(const Container &srcCont, Container &dstCont)
Definition: Utility.h:531
static const bool multiKey
Definition: TreeTraits.h:87
set_adaptor & operator=(std::initializer_list< value_type > values)
Definition: set.h:187
TreeSet::Key key_type
Definition: set.h:40
size_type max_size() const noexcept
Definition: set.h:276
Definition: TreeSet.h:297
const nested_container_type & get_nested_container() const noexcept
Definition: set.h:203
static void Swap(Container &cont1, Container &cont2) noexcept
Definition: Utility.h:546
const_iterator::Pointer const_pointer
Definition: set.h:62
iterator erase(const_iterator first, const_iterator last)
Definition: set.h:514
TreeSetCore< TreeSetItemTraits< TKey, TMemManager >, TTreeTraits > TreeSet
Definition: TreeSet.h:1726
#define MOMO_NODISCARD
Definition: UserSettings.h:262
void insert(std::initializer_list< value_type > values)
Definition: set.h:452
value_compare value_comp() const
Definition: set.h:266
const_iterator end() const noexcept
Definition: set.h:220
const_iterator begin() const noexcept
Definition: set.h:213
node_type extract(const_iterator where)
Definition: set.h:530