17 #ifndef MOMO_INCLUDE_GUARD_STDISH_SET
18 #define MOMO_INCLUDE_GUARD_STDISH_SET
21 # if __has_include(<momo/Utility.h>)
25 #ifndef MOMO_PARENT_HEADER
26 # include "../Utility.h"
29 #include MOMO_PARENT_HEADER(TreeSet)
62 template<
typename TKey,
63 typename TLessComparer = std::less<TKey>,
64 typename TAllocator = std::allocator<TKey>,
65 typename TTreeSet = TreeSet<TKey, TreeTraitsStd<TKey, TLessComparer>, MemManagerStd<TAllocator>>>
69 typedef TTreeSet TreeSet;
106 template<
typename KeyArg>
107 struct IsValidKeyArg :
public TreeTraits::template IsValidKeyArg<KeyArg>
123 : mTreeSet(TreeTraits(), MemManager(alloc))
128 : mTreeSet(TreeTraits(lessComp), MemManager(alloc))
132 template<
typename Iterator>
139 template<
typename Iterator>
142 :
set(lessComp, alloc)
149 : mTreeSet(values, TreeTraits(), MemManager(alloc))
155 : mTreeSet(values, TreeTraits(lessComp), MemManager(alloc))
159 #ifdef MOMO_HAS_CONTAINERS_RANGES
160 template<std::ranges::input_range Range>
161 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
165 insert_range(std::forward<Range>(values));
168 template<std::ranges::input_range Range>
169 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
170 set(std::from_range_t, Range&& values,
const key_compare& lessComp,
172 :
set(lessComp, alloc)
174 insert_range(std::forward<Range>(values));
176 #endif // MOMO_HAS_CONTAINERS_RANGES
184 : mTreeSet(right.mTreeSet.GetTreeTraits(), MemManager(alloc))
186 if (right.get_allocator() == alloc)
188 mTreeSet.Swap(right.mTreeSet);
192 mTreeSet.MergeFrom(right.mTreeSet);
198 : mTreeSet(right.mTreeSet)
203 : mTreeSet(right.mTreeSet, MemManager(alloc))
222 mTreeSet = TreeSet(values, mTreeSet.GetTreeTraits(), MemManager(
get_allocator()));
248 return mTreeSet.GetBegin();
255 return mTreeSet.GetEnd();
296 return mTreeSet.GetTreeTraits().GetLessComparer();
306 return allocator_type(mTreeSet.GetMemManager().GetByteAllocator());
311 return std::allocator_traits<allocator_type>::max_size(
get_allocator());
316 return mTreeSet.GetCount();
321 return mTreeSet.IsEmpty();
331 return mTreeSet.Find(key);
336 template<
typename KeyArg>
340 return mTreeSet.Find(key);
349 return mTreeSet.GetKeyCount(key);
352 template<
typename KeyArg>
356 return mTreeSet.GetKeyCount(key);
361 return mTreeSet.ContainsKey(key);
364 template<
typename KeyArg>
368 return mTreeSet.ContainsKey(key);
373 return mTreeSet.GetLowerBound(key);
378 template<
typename KeyArg>
382 return mTreeSet.GetLowerBound(key);
391 return mTreeSet.GetUpperBound(key);
396 template<
typename KeyArg>
400 return mTreeSet.GetUpperBound(key);
412 if (iter ==
end() || mTreeSet.GetTreeTraits().IsLess(key, *iter))
413 return { iter, iter };
414 return { iter, std::next(iter) };
419 template<
typename KeyArg>
421 std::pair<const_iterator, const_iterator>>
equal_range(
const KeyArg& key)
const
438 if (!pvCheckHint(hint,
static_cast<const key_type&
>(value)))
439 return insert(std::move(value)).first;
440 return mTreeSet.Add(hint, std::move(value));
451 if (!pvCheckHint(hint, value))
452 return insert(value).first;
453 return mTreeSet.Add(hint, value);
461 std::move(NodeTypeProxy::GetExtractedItem(node)));
469 if (!pvCheckHint(hint, node.value()))
470 return insert(std::move(node)).position;
471 return mTreeSet.Add(hint, std::move(NodeTypeProxy::GetExtractedItem(node)));
474 template<
typename Iterator>
475 void insert(Iterator first, Iterator last)
477 pvInsertRange(first, last);
480 void insert(std::initializer_list<value_type> values)
482 mTreeSet.Insert(values);
485 #ifdef MOMO_HAS_CONTAINERS_RANGES
486 template<std::ranges::input_range Range>
487 requires std::convertible_to<std::ranges::range_reference_t<Range>,
value_type>
488 void insert_range(Range&& values)
490 pvInsertRange(std::ranges::begin(values), std::ranges::end(values));
492 #endif // MOMO_HAS_CONTAINERS_RANGES
494 template<
typename... ValueArgs>
495 std::pair<iterator, bool>
emplace(ValueArgs&&... valueArgs)
497 MemManager& memManager = mTreeSet.GetMemManager();
499 typedef typename TreeSet::ItemTraits::template Creator<ValueArgs...> ValueCreator;
500 extItem.
Create(ValueCreator(memManager, std::forward<ValueArgs>(valueArgs)...));
505 template<
typename ValueArg>
507 std::pair<iterator, bool>>
emplace(ValueArg&& valueArg)
510 static_cast<const key_type&
>(valueArg), std::forward<ValueArg>(valueArg));
514 template<
typename... ValueArgs>
517 MemManager& memManager = mTreeSet.GetMemManager();
519 typedef typename TreeSet::ItemTraits::template Creator<ValueArgs...> ValueCreator;
520 extItem.
Create(ValueCreator(memManager, std::forward<ValueArgs>(valueArgs)...));
521 if (!pvCheckHint(hint, extItem.
GetItem()))
522 return mTreeSet.Insert(std::move(extItem)).position;
523 return mTreeSet.Add(hint, std::move(extItem));
526 template<
typename ValueArg>
530 if (!pvCheckHint(hint,
static_cast<const key_type&
>(valueArg)))
531 return emplace(std::forward<ValueArg>(valueArg)).first;
532 return mTreeSet.AddVar(hint, std::forward<ValueArg>(valueArg));
537 return mTreeSet.Remove(where);
544 return mTreeSet.Remove(first, last);
549 return mTreeSet.Remove(key);
552 template<
typename ValueFilter>
555 return cont.mTreeSet.Remove(valueFilter);
569 template<
typename Set>
580 #ifdef MOMO_HAS_THREE_WAY_COMPARISON
581 friend auto operator<=>(
const set& left,
const set& right)
582 requires requires (
const_reference ref) { std::tie(ref) <=> std::tie(ref); }
585 {
return std::tie(value1) <=> std::tie(value2); };
586 return std::lexicographical_compare_three_way(left.begin(), left.end(),
587 right.begin(), right.end(), valueThreeComp);
592 return std::lexicographical_compare(left.
begin(), left.
end(), right.
begin(), right.
end());
601 const TreeTraits& treeTraits = mTreeSet.GetTreeTraits();
603 : treeTraits.
IsLess(key1, key2);
608 if (hint !=
begin() && !pvIsOrdered(*std::prev(hint), key))
610 if (hint !=
end() && !pvIsOrdered(key, *hint))
619 template<
typename Iterator,
typename Sentinel>
621 void> pvInsertRange(Iterator
begin, Sentinel
end)
623 mTreeSet.Insert(std::move(
begin), std::move(
end));
626 template<
typename Iterator,
typename Sentinel>
628 void> pvInsertRange(Iterator
begin, Sentinel
end)
630 for (Iterator iter = std::move(
begin); iter !=
end; ++iter)
646 template<
typename TKey,
647 typename TLessComparer = std::less<TKey>,
648 typename TAllocator = std::allocator<TKey>,
649 typename TTreeSet = TreeSet<TKey, TreeTraitsStd<TKey, TLessComparer, true>,
650 MemManagerStd<TAllocator>>>
651 class multiset :
public set<TKey, TLessComparer, TAllocator, TTreeSet>
695 template<
typename... ValueArgs>
698 return Set::emplace(std::forward<ValueArgs>(valueArgs)...).first;
701 template<
typename ValueFilter>
704 return cont.get_nested_container().Remove(valueFilter);
708 #ifdef MOMO_HAS_DEDUCTION_GUIDES
710 #define MOMO_DECLARE_DEDUCTION_GUIDES(set) \
711 template<typename Iterator, \
712 typename Key = typename std::iterator_traits<Iterator>::value_type, \
713 typename Allocator = std::allocator<Key>, \
714 typename = internal::ordered_checker<Key, Allocator>> \
715 set(Iterator, Iterator, Allocator = Allocator()) \
716 -> set<Key, std::less<Key>, Allocator>; \
717 template<typename Iterator, typename LessComparer, \
718 typename Key = typename std::iterator_traits<Iterator>::value_type, \
719 typename Allocator = std::allocator<Key>, \
720 typename = internal::ordered_checker<Key, Allocator, LessComparer>> \
721 set(Iterator, Iterator, LessComparer, Allocator = Allocator()) \
722 -> set<Key, LessComparer, Allocator>; \
723 template<typename Key, \
724 typename Allocator = std::allocator<Key>, \
725 typename = internal::ordered_checker<Key, Allocator>> \
726 set(std::initializer_list<Key>, Allocator = Allocator()) \
727 -> set<Key, std::less<Key>, Allocator>; \
728 template<typename Key, typename LessComparer, \
729 typename Allocator = std::allocator<Key>, \
730 typename = internal::ordered_checker<Key, Allocator, LessComparer>> \
731 set(std::initializer_list<Key>, LessComparer, Allocator = Allocator()) \
732 -> set<Key, LessComparer, Allocator>;
734 MOMO_DECLARE_DEDUCTION_GUIDES(set)
735 MOMO_DECLARE_DEDUCTION_GUIDES(multiset)
737 #undef MOMO_DECLARE_DEDUCTION_GUIDES
739 #ifdef MOMO_HAS_CONTAINERS_RANGES
741 #define MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(set) \
742 template<std::ranges::input_range Range, \
743 typename Key = std::ranges::range_value_t<Range>, \
744 typename Allocator = std::allocator<Key>, \
745 typename = internal::ordered_checker<Key, Allocator>> \
746 set(std::from_range_t, Range&&, Allocator = Allocator()) \
747 -> set<Key, std::less<Key>, Allocator>; \
748 template<std::ranges::input_range Range, typename LessComparer, \
749 typename Key = std::ranges::range_value_t<Range>, \
750 typename Allocator = std::allocator<Key>, \
751 typename = internal::ordered_checker<Key, Allocator, LessComparer>> \
752 set(std::from_range_t, Range&&, LessComparer, Allocator = Allocator()) \
753 -> set<Key, LessComparer, Allocator>;
755 MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(set)
756 MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(multiset)
758 #undef MOMO_DECLARE_DEDUCTION_GUIDES_RANGES
760 #endif // MOMO_HAS_CONTAINERS_RANGES
762 #endif // MOMO_HAS_DEDUCTION_GUIDES
768 #endif // MOMO_INCLUDE_GUARD_STDISH_SET