momo  3.11
map.h
Go to the documentation of this file.
1 /**********************************************************\
2 
3  This file is part of the
4  https://github.com/morzhovets/momo
5  project, distributed under the MIT License. See
6  https://github.com/morzhovets/momo/blob/branch_cpp11/LICENSE
7  for details.
8 
9  momo/stdish/map.h
10 
11  namespace momo::stdish:
12  class map
13  class multimap
14 
15 \**********************************************************/
16 
17 #ifndef MOMO_INCLUDE_GUARD_STDISH_MAP
18 #define MOMO_INCLUDE_GUARD_STDISH_MAP
19 
20 #ifdef __has_include
21 # if __has_include(<momo/Utility.h>)
22 # include <momo/Utility.h>
23 # endif
24 #endif
25 #ifndef MOMO_PARENT_HEADER
26 # include "../Utility.h"
27 #endif
28 
29 #include MOMO_PARENT_HEADER(TreeMap)
30 #include "set_map_utility.h"
31 
32 namespace momo
33 {
34 
35 namespace stdish
36 {
37 
38 namespace internal
39 {
40  template<typename TKey, typename TLessComparer>
42  {
43  protected:
44  typedef TKey Key;
45  typedef TLessComparer LessComparer;
46 
47  public:
48  template<typename Value>
49  bool operator()(const Value& value1, const Value& value2) const
50  {
51  MOMO_STATIC_ASSERT(std::is_same<Key,
52  typename std::decay<decltype(value1.first)>::type>::value);
53  return comp(value1.first, value2.first);
54  }
55 
56  protected:
58  : comp(lessComp)
59  {
60  }
61 
62  protected:
64  };
65 
66  template<typename TKey, typename TMapped, typename TLessComparer, typename TAllocator,
67  typename TTreeMap>
68  class map_base
69  {
70  private:
71  typedef TTreeMap TreeMap;
72  typedef typename TreeMap::TreeTraits TreeTraits;
73  typedef typename TreeMap::MemManager MemManager;
74 
75  typedef typename TreeMap::Iterator TreeMapIterator;
76 
77  public:
78  typedef TKey key_type;
79  typedef TMapped mapped_type;
80  typedef TLessComparer key_compare;
81  typedef TAllocator allocator_type;
82 
83  typedef TreeMap nested_container_type;
84 
85  typedef size_t size_type;
86  typedef ptrdiff_t difference_type;
87 
88  typedef std::pair<const key_type, mapped_type> value_type;
89 
91 
95 
96  typedef typename iterator::Reference reference;
98 
99  typedef typename iterator::Pointer pointer;
101  //typedef typename std::allocator_traits<allocator_type>::pointer pointer;
102  //typedef typename std::allocator_traits<allocator_type>::const_pointer const_pointer;
103 
104  typedef std::reverse_iterator<iterator> reverse_iterator;
105  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
106 
109 
110  private:
111  template<typename KeyArg>
112  struct IsValidKeyArg : public TreeTraits::template IsValidKeyArg<KeyArg>
113  {
114  };
115 
116  struct ConstIteratorProxy : public const_iterator
117  {
118  typedef const_iterator ConstIterator;
119  MOMO_DECLARE_PROXY_CONSTRUCTOR(ConstIterator)
120  MOMO_DECLARE_PROXY_FUNCTION(ConstIterator, GetBaseIterator)
121  };
122 
123  struct IteratorProxy : public iterator
124  {
125  typedef iterator Iterator;
127  MOMO_DECLARE_PROXY_FUNCTION(Iterator, GetBaseIterator)
128  };
129 
130  struct NodeTypeProxy : private node_type
131  {
132  typedef node_type NodeType;
133  MOMO_DECLARE_PROXY_FUNCTION(NodeType, GetExtractedPair)
134  };
135 
136  public:
138  {
139  }
140 
141  explicit map_base(const allocator_type& alloc)
142  : mTreeMap(TreeTraits(), MemManager(alloc))
143  {
144  }
145 
146  explicit map_base(const key_compare& lessComp, const allocator_type& alloc = allocator_type())
147  : mTreeMap(TreeTraits(lessComp), MemManager(alloc))
148  {
149  }
150 
151  template<typename Iterator>
152  map_base(Iterator first, Iterator last, const allocator_type& alloc = allocator_type())
153  : map_base(alloc)
154  {
155  insert(first, last);
156  }
157 
158  template<typename Iterator>
159  map_base(Iterator first, Iterator last, const key_compare& lessComp,
160  const allocator_type& alloc = allocator_type())
161  : map_base(lessComp, alloc)
162  {
163  insert(first, last);
164  }
165 
166  map_base(std::initializer_list<momo::internal::Identity<value_type>> values,
167  const allocator_type& alloc = allocator_type())
168  : map_base(values.begin(), values.end(), alloc)
169  {
170  }
171 
172  map_base(std::initializer_list<momo::internal::Identity<value_type>> values,
173  const key_compare& lessComp, const allocator_type& alloc = allocator_type())
174  : map_base(values.begin(), values.end(), lessComp, alloc)
175  {
176  }
177 
178 #ifdef MOMO_HAS_CONTAINERS_RANGES
179  template<std::ranges::input_range Range>
180  requires std::convertible_to<std::ranges::range_reference_t<Range>, value_type>
181  map_base(std::from_range_t, Range&& values, const allocator_type& alloc = allocator_type())
182  : map_base(alloc)
183  {
184  insert_range(std::forward<Range>(values));
185  }
186 
187  template<std::ranges::input_range Range>
188  requires std::convertible_to<std::ranges::range_reference_t<Range>, value_type>
189  map_base(std::from_range_t, Range&& values, const key_compare& lessComp,
190  const allocator_type& alloc = allocator_type())
191  : map_base(lessComp, alloc)
192  {
193  insert_range(std::forward<Range>(values));
194  }
195 #endif // MOMO_HAS_CONTAINERS_RANGES
196 
198  : map_base(std::move(right), right.get_allocator())
199  {
200  }
201 
203  : mTreeMap(right.mTreeMap.GetTreeTraits(), MemManager(alloc))
204  {
205  if (right.get_allocator() == alloc)
206  {
207  mTreeMap.Swap(right.mTreeMap);
208  }
209  else
210  {
211  mTreeMap.MergeFrom(right.mTreeMap);
212  right.clear();
213  }
214  }
215 
216  map_base(const map_base& right)
217  : mTreeMap(right.mTreeMap)
218  {
219  }
220 
222  : mTreeMap(right.mTreeMap, MemManager(alloc))
223  {
224  }
225 
226  ~map_base() = default;
227 
230  {
231  return momo::internal::ContainerAssignerStd::Move(std::move(right), *this);
232  }
233 
234  map_base& operator=(const map_base& right)
235  {
236  return momo::internal::ContainerAssignerStd::Copy(right, *this);
237  }
238 
239  void swap(map_base& right) noexcept
240  {
242  }
243 
245  {
246  return mTreeMap;
247  }
248 
250  {
251  return mTreeMap;
252  }
253 
254  const_iterator begin() const noexcept
255  {
256  return ConstIteratorProxy(mTreeMap.GetBegin());
257  }
258 
259  iterator begin() noexcept
260  {
261  return IteratorProxy(mTreeMap.GetBegin());
262  }
263 
264  const_iterator end() const noexcept
265  {
266  return ConstIteratorProxy(mTreeMap.GetEnd());
267  }
268 
269  iterator end() noexcept
270  {
271  return IteratorProxy(mTreeMap.GetEnd());
272  }
273 
275  {
276  return const_reverse_iterator(end());
277  }
278 
280  {
281  return reverse_iterator(end());
282  }
283 
284  const_reverse_iterator rend() const noexcept
285  {
286  return const_reverse_iterator(begin());
287  }
288 
290  {
291  return reverse_iterator(begin());
292  }
293 
294  const_iterator cbegin() const noexcept
295  {
296  return begin();
297  }
298 
299  const_iterator cend() const noexcept
300  {
301  return end();
302  }
303 
305  {
306  return rbegin();
307  }
308 
309  const_reverse_iterator crend() const noexcept
310  {
311  return rend();
312  }
313 
315  {
316  return mTreeMap.GetTreeTraits().GetLessComparer();
317  }
318 
320  {
321  struct ValueCompareProxy : public value_compare
322  {
323  explicit ValueCompareProxy(const key_compare& keyComp)
324  : value_compare(keyComp)
325  {
326  }
327  };
328  return ValueCompareProxy(key_comp());
329  }
330 
331  allocator_type get_allocator() const noexcept
332  {
333  return allocator_type(mTreeMap.GetMemManager().GetByteAllocator());
334  }
335 
336  size_type max_size() const noexcept
337  {
338  return std::allocator_traits<allocator_type>::max_size(get_allocator());
339  }
340 
341  size_type size() const noexcept
342  {
343  return mTreeMap.GetCount();
344  }
345 
346  MOMO_NODISCARD bool empty() const noexcept
347  {
348  return mTreeMap.IsEmpty();
349  }
350 
351  void clear() noexcept
352  {
353  mTreeMap.Clear();
354  }
355 
356  const_iterator find(const key_type& key) const
357  {
358  return ConstIteratorProxy(mTreeMap.Find(key));
359  }
360 
361  iterator find(const key_type& key)
362  {
363  return IteratorProxy(mTreeMap.Find(key));
364  }
365 
366  template<typename KeyArg>
368  const_iterator> find(const KeyArg& key) const
369  {
370  return ConstIteratorProxy(mTreeMap.Find(key));
371  }
372 
373  template<typename KeyArg>
375  iterator> find(const KeyArg& key)
376  {
377  return IteratorProxy(mTreeMap.Find(key));
378  }
379 
380  size_type count(const key_type& key) const
381  {
382  return mTreeMap.GetKeyCount(key);
383  }
384 
385  template<typename KeyArg>
387  size_type> count(const KeyArg& key) const
388  {
389  return mTreeMap.GetKeyCount(key);
390  }
391 
392  bool contains(const key_type& key) const
393  {
394  return mTreeMap.ContainsKey(key);
395  }
396 
397  template<typename KeyArg>
399  bool> contains(const KeyArg& key) const
400  {
401  return mTreeMap.ContainsKey(key);
402  }
403 
405  {
406  return ConstIteratorProxy(mTreeMap.GetLowerBound(key));
407  }
408 
410  {
411  return IteratorProxy(mTreeMap.GetLowerBound(key));
412  }
413 
414  template<typename KeyArg>
416  const_iterator> lower_bound(const KeyArg& key) const
417  {
418  return ConstIteratorProxy(mTreeMap.GetLowerBound(key));
419  }
420 
421  template<typename KeyArg>
423  iterator> lower_bound(const KeyArg& key)
424  {
425  return IteratorProxy(mTreeMap.GetLowerBound(key));
426  }
427 
429  {
430  return ConstIteratorProxy(mTreeMap.GetUpperBound(key));
431  }
432 
434  {
435  return IteratorProxy(mTreeMap.GetUpperBound(key));
436  }
437 
438  template<typename KeyArg>
440  const_iterator> upper_bound(const KeyArg& key) const
441  {
442  return ConstIteratorProxy(mTreeMap.GetUpperBound(key));
443  }
444 
445  template<typename KeyArg>
447  iterator> upper_bound(const KeyArg& key)
448  {
449  return IteratorProxy(mTreeMap.GetUpperBound(key));
450  }
451 
452  std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const
453  {
454  const_iterator iter = lower_bound(key);
456  return { iter, upper_bound(key) };
457  if (iter == end() || mTreeMap.GetTreeTraits().IsLess(key, iter->first))
458  return { iter, iter };
459  return { iter, std::next(iter) };
460  }
461 
462  std::pair<iterator, iterator> equal_range(const key_type& key)
463  {
464  iterator iter = lower_bound(key);
466  return { iter, upper_bound(key) };
467  if (iter == end() || mTreeMap.GetTreeTraits().IsLess(key, iter->first))
468  return { iter, iter };
469  return { iter, std::next(iter) };
470  }
471 
472  template<typename KeyArg>
474  std::pair<const_iterator, const_iterator>> equal_range(const KeyArg& key) const
475  {
476  return { lower_bound(key), upper_bound(key) };
477  }
478 
479  template<typename KeyArg>
481  std::pair<iterator, iterator>> equal_range(const KeyArg& key)
482  {
483  return { lower_bound(key), upper_bound(key) };
484  }
485 
486  template<typename ValueArg = std::pair<key_type, mapped_type>>
488  std::pair<iterator, bool>> insert(ValueArg&& valueArg)
489  {
490  return emplace(std::forward<ValueArg>(valueArg));
491  }
492 
493  template<typename ValueArg = std::pair<key_type, mapped_type>>
495  iterator> insert(const_iterator hint, ValueArg&& valueArg)
496  {
497  return emplace_hint(hint, std::forward<ValueArg>(valueArg));
498  }
499 
501  {
502  if (node.empty())
503  return { end(), false, node_type() };
504  typename TreeMap::InsertResult res = mTreeMap.Insert(
505  std::move(NodeTypeProxy::GetExtractedPair(node)));
506  return { IteratorProxy(res.position), res.inserted,
507  res.inserted ? node_type() : std::move(node) };
508  }
509 
511  {
512  if (node.empty())
513  return end();
514  std::pair<iterator, bool> res = pvFind(hint, node.key());
515  if (!res.second)
516  return res.first;
517  return IteratorProxy(mTreeMap.Add(IteratorProxy::GetBaseIterator(res.first),
518  std::move(NodeTypeProxy::GetExtractedPair(node))));
519  }
520 
521  template<typename Iterator>
522  void insert(Iterator first, Iterator last)
523  {
524  pvInsertRange(first, last);
525  }
526 
527  void insert(std::initializer_list<value_type> values)
528  {
529  mTreeMap.Insert(values.begin(), values.end());
530  }
531 
532 #ifdef MOMO_HAS_CONTAINERS_RANGES
533  template<std::ranges::input_range Range>
534  requires std::convertible_to<std::ranges::range_reference_t<Range>, value_type>
535  void insert_range(Range&& values)
536  {
537  pvInsertRange(std::ranges::begin(values), std::ranges::end(values));
538  }
539 #endif // MOMO_HAS_CONTAINERS_RANGES
540 
541  std::pair<iterator, bool> emplace()
542  {
543  return ptEmplace(nullptr, std::tuple<>(), std::tuple<>());
544  }
545 
547  {
548  return ptEmplace(hint, std::tuple<>(), std::tuple<>()).first;
549  }
550 
551  template<typename ValueArg>
552  std::pair<iterator, bool> emplace(ValueArg&& valueArg)
553  {
554  return ptEmplace(nullptr,
555  std::forward_as_tuple(std::get<0>(std::forward<ValueArg>(valueArg))),
556  std::forward_as_tuple(std::get<1>(std::forward<ValueArg>(valueArg))));
557  }
558 
559  template<typename ValueArg>
560  iterator emplace_hint(const_iterator hint, ValueArg&& valueArg)
561  {
562  return ptEmplace(hint,
563  std::forward_as_tuple(std::get<0>(std::forward<ValueArg>(valueArg))),
564  std::forward_as_tuple(std::get<1>(std::forward<ValueArg>(valueArg)))).first;
565  }
566 
567  template<typename KeyArg, typename MappedArg>
568  std::pair<iterator, bool> emplace(KeyArg&& keyArg, MappedArg&& mappedArg)
569  {
570  return ptEmplace(nullptr, std::forward_as_tuple(std::forward<KeyArg>(keyArg)),
571  std::forward_as_tuple(std::forward<MappedArg>(mappedArg)));
572  }
573 
574  template<typename KeyArg, typename MappedArg>
575  iterator emplace_hint(const_iterator hint, KeyArg&& keyArg, MappedArg&& mappedArg)
576  {
577  return ptEmplace(hint, std::forward_as_tuple(std::forward<KeyArg>(keyArg)),
578  std::forward_as_tuple(std::forward<MappedArg>(mappedArg))).first;
579  }
580 
581  template<typename... KeyArgs, typename... MappedArgs>
582  std::pair<iterator, bool> emplace(std::piecewise_construct_t,
583  std::tuple<KeyArgs...> keyArgs, std::tuple<MappedArgs...> mappedArgs)
584  {
585  return ptEmplace(nullptr, std::move(keyArgs), std::move(mappedArgs));
586  }
587 
588  template<typename... KeyArgs, typename... MappedArgs>
589  iterator emplace_hint(const_iterator hint, std::piecewise_construct_t,
590  std::tuple<KeyArgs...> keyArgs, std::tuple<MappedArgs...> mappedArgs)
591  {
592  return ptEmplace(hint, std::move(keyArgs), std::move(mappedArgs)).first;
593  }
594 
596  {
597  return IteratorProxy(mTreeMap.Remove(ConstIteratorProxy::GetBaseIterator(where)));
598  }
599 
601  {
602  return erase(static_cast<const_iterator>(where));
603  }
604 
606  {
607  return IteratorProxy(mTreeMap.Remove(ConstIteratorProxy::GetBaseIterator(first),
608  ConstIteratorProxy::GetBaseIterator(last)));
609  }
610 
612  {
613  return mTreeMap.Remove(key);
614  }
615 
617  {
618  return node_type(*this, where); // need RVO for exception safety
619  }
620 
622  {
623  const_iterator iter = find(key);
624  return (iter != end()) ? extract(iter) : node_type();
625  }
626 
627  template<typename Map>
628  void merge(Map&& map)
629  {
630  mTreeMap.MergeFrom(map.get_nested_container());
631  }
632 
633  friend bool operator==(const map_base& left, const map_base& right)
634  {
635  return left.size() == right.size()
636  && std::equal(left.begin(), left.end(), right.begin());
637  }
638 
639 #ifdef MOMO_HAS_THREE_WAY_COMPARISON
640  friend auto operator<=>(const map_base& left, const map_base& right)
641  requires requires (const_reference ref) { ref <=> ref; }
642  {
643  return std::lexicographical_compare_three_way(left.begin(), left.end(),
644  right.begin(), right.end());
645  }
646 #else
647  friend bool operator<(const map_base& left, const map_base& right)
648  {
649  return std::lexicographical_compare(left.begin(), left.end(),
650  right.begin(), right.end());
651  }
652 #endif
653 
655 
656  protected: //?
657  void ptAssign(std::initializer_list<value_type> values)
658  {
659  mTreeMap = TreeMap(values, mTreeMap.GetTreeTraits(), MemManager(get_allocator()));
660  }
661 
662  template<typename Hint, typename... KeyArgs, typename... MappedArgs>
663  std::pair<iterator, bool> ptEmplace(Hint hint, std::tuple<KeyArgs...>&& keyArgs,
664  std::tuple<MappedArgs...>&& mappedArgs)
665  {
666  typedef typename TreeMap::KeyValueTraits
667  ::template ValueCreator<MappedArgs...> MappedCreator;
668  return pvInsert(hint, std::move(keyArgs),
669  MappedCreator(mTreeMap.GetMemManager(), std::move(mappedArgs)));
670  }
671 
672  private:
673  bool pvIsOrdered(const key_type& key1, const key_type& key2) const
674  {
675  const TreeTraits& treeTraits = mTreeMap.GetTreeTraits();
676  return TreeTraits::multiKey ? !treeTraits.IsLess(key2, key1)
677  : treeTraits.IsLess(key1, key2);
678  }
679 
680  std::pair<iterator, bool> pvFind(std::nullptr_t /*hint*/, const key_type& key)
681  {
682  iterator iter = upper_bound(key);
683  if (!TreeTraits::multiKey && iter != begin())
684  {
685  iterator prevIter = std::prev(iter);
686  if (!mTreeMap.GetTreeTraits().IsLess(prevIter->first, key))
687  return { prevIter, false };
688  }
689  return { iter, true };
690  }
691 
692  std::pair<iterator, bool> pvFind(const_iterator hint, const key_type& key)
693  {
694  if (hint != begin() && !pvIsOrdered(std::prev(hint)->first, key))
695  return pvFind(nullptr, key);
696  if (hint != end() && !pvIsOrdered(key, hint->first))
697  {
699  return { lower_bound(key), true };
700  else
701  return pvFind(nullptr, key);
702  }
703  return { IteratorProxy(mTreeMap.MakeMutableIterator(
704  ConstIteratorProxy::GetBaseIterator(hint))), true };
705  }
706 
707  template<typename Hint, typename... KeyArgs, typename MappedCreator>
708  std::pair<iterator, bool> pvInsert(Hint hint, std::tuple<KeyArgs...>&& keyArgs,
709  MappedCreator&& mappedCreator)
710  {
711  MemManager& memManager = mTreeMap.GetMemManager();
713  TreeMap::KeyValueTraits::keyAlignment> KeyBuffer;
715  typedef typename KeyManager::template Creator<KeyArgs...> KeyCreator;
716  KeyBuffer keyBuffer;
717  KeyCreator(memManager, std::move(keyArgs))(keyBuffer.GetPtr());
718  key_type* keyPtr = keyBuffer.template GetPtr<true>();
719  try
720  {
721  std::pair<iterator, bool> res = pvFind(hint, *keyPtr);
722  if (!res.second)
723  {
724  KeyManager::Destroy(memManager, *keyPtr);
725  keyPtr = nullptr;
726  return res;
727  }
728  auto valueCreator = [&memManager, &keyPtr, &mappedCreator]
729  (key_type* newKey, mapped_type* newMapped)
730  {
731  KeyManager::Relocate(memManager, *keyPtr, newKey);
732  keyPtr = nullptr;
733  try
734  {
735  std::forward<MappedCreator>(mappedCreator)(newMapped);
736  }
737  catch (...)
738  {
739  KeyManager::Destroy(memManager, *newKey);
740  throw;
741  }
742  };
743  TreeMapIterator resIter = mTreeMap.AddCrt(
744  IteratorProxy::GetBaseIterator(res.first), valueCreator);
745  return { IteratorProxy(resIter), true };
746  }
747  catch (...)
748  {
749  if (keyPtr != nullptr)
750  KeyManager::Destroy(memManager, *keyPtr);
751  throw;
752  }
753  }
754 
755  template<typename Hint, typename RKey, typename MappedCreator,
756  typename Key = typename std::decay<RKey>::type>
758  std::pair<iterator, bool>> pvInsert(Hint hint, std::tuple<RKey>&& key,
759  MappedCreator&& mappedCreator)
760  {
761  std::pair<iterator, bool> res = pvFind(hint,
762  static_cast<const key_type&>(std::get<0>(key)));
763  if (!res.second)
764  return res;
765  TreeMapIterator resIter = mTreeMap.AddCrt(IteratorProxy::GetBaseIterator(res.first),
766  std::forward<RKey>(std::get<0>(key)), std::forward<MappedCreator>(mappedCreator));
767  return { IteratorProxy(resIter), true };
768  }
769 
770  template<typename Iterator, typename Sentinel>
772  void> pvInsertRange(Iterator begin, Sentinel end)
773  {
774  mTreeMap.Insert(std::move(begin), std::move(end));
775  }
776 
777  template<typename Iterator, typename Sentinel>
779  void> pvInsertRange(Iterator begin, Sentinel end)
780  {
781  for (Iterator iter = std::move(begin); iter != end; ++iter)
782  insert(*iter);
783  }
784 
785  private:
786  TreeMap mTreeMap;
787  };
788 }
789 
818 template<typename TKey, typename TMapped,
819  typename TLessComparer = std::less<TKey>,
820  typename TAllocator = std::allocator<std::pair<const TKey, TMapped>>,
821  typename TTreeMap = TreeMap<TKey, TMapped, TreeTraitsStd<TKey, TLessComparer>,
822  MemManagerStd<TAllocator>>>
823 class map : public internal::map_base<TKey, TMapped, TLessComparer, TAllocator, TTreeMap>
824 {
825 private:
827  typedef TTreeMap TreeMap;
828 
829 public:
830  using typename MapBase::key_type;
831  using typename MapBase::mapped_type;
832  using typename MapBase::size_type;
833  using typename MapBase::value_type;
834  using typename MapBase::const_reference;
835  using typename MapBase::const_iterator;
836  using typename MapBase::iterator;
837 
838 public:
839  using MapBase::MapBase;
840 
841  map& operator=(std::initializer_list<value_type> values)
842  {
843  MapBase::ptAssign(values);
844  return *this;
845  }
846 
847  friend void swap(map& left, map& right) noexcept
848  {
849  left.swap(right);
850  }
851 
853  {
854  return MapBase::get_nested_container()[std::move(key)];
855  }
856 
858  {
859  return MapBase::get_nested_container()[key];
860  }
861 
862  const mapped_type& at(const key_type& key) const
863  {
864  const_iterator iter = MapBase::find(key);
865  if (iter == MapBase::end())
866  throw std::out_of_range("invalid map key");
867  return iter->second;
868  }
869 
870  mapped_type& at(const key_type& key)
871  {
872  iterator iter = MapBase::find(key);
873  if (iter == MapBase::end())
874  throw std::out_of_range("invalid map key");
875  return iter->second;
876  }
877 
878  template<typename... MappedArgs>
879  std::pair<iterator, bool> try_emplace(key_type&& key, MappedArgs&&... mappedArgs)
880  {
881  return MapBase::ptEmplace(nullptr, std::forward_as_tuple(std::move(key)),
882  std::forward_as_tuple(std::forward<MappedArgs>(mappedArgs)...));
883  }
884 
885  template<typename... MappedArgs>
886  iterator try_emplace(const_iterator hint, key_type&& key, MappedArgs&&... mappedArgs)
887  {
888  return MapBase::ptEmplace(hint, std::forward_as_tuple(std::move(key)),
889  std::forward_as_tuple(std::forward<MappedArgs>(mappedArgs)...)).first;
890  }
891 
892  template<typename... MappedArgs>
893  std::pair<iterator, bool> try_emplace(const key_type& key, MappedArgs&&... mappedArgs)
894  {
895  return MapBase::ptEmplace(nullptr, std::forward_as_tuple(key),
896  std::forward_as_tuple(std::forward<MappedArgs>(mappedArgs)...));
897  }
898 
899  template<typename... MappedArgs>
900  iterator try_emplace(const_iterator hint, const key_type& key, MappedArgs&&... mappedArgs)
901  {
902  return MapBase::ptEmplace(hint, std::forward_as_tuple(key),
903  std::forward_as_tuple(std::forward<MappedArgs>(mappedArgs)...)).first;
904  }
905 
906  template<typename MappedArg>
907  std::pair<iterator, bool> insert_or_assign(key_type&& key, MappedArg&& mappedArg)
908  {
909  return pvInsertOrAssign(nullptr, std::move(key), std::forward<MappedArg>(mappedArg));
910  }
911 
912  template<typename MappedArg>
913  iterator insert_or_assign(const_iterator hint, key_type&& key, MappedArg&& mappedArg)
914  {
915  return pvInsertOrAssign(hint, std::move(key), std::forward<MappedArg>(mappedArg)).first;
916  }
917 
918  template<typename MappedArg>
919  std::pair<iterator, bool> insert_or_assign(const key_type& key, MappedArg&& mappedArg)
920  {
921  return pvInsertOrAssign(nullptr, key, std::forward<MappedArg>(mappedArg));
922  }
923 
924  template<typename MappedArg>
925  iterator insert_or_assign(const_iterator hint, const key_type& key, MappedArg&& mappedArg)
926  {
927  return pvInsertOrAssign(hint, key, std::forward<MappedArg>(mappedArg)).first;
928  }
929 
930  template<typename ValueFilter>
931  friend size_type erase_if(map& cont, const ValueFilter& valueFilter)
932  {
933  auto pairFilter = [&valueFilter] (const key_type& key, const mapped_type& mapped)
934  { return valueFilter(const_reference(key, mapped)); };
935  return cont.get_nested_container().Remove(pairFilter);
936  }
937 
938 private:
939  template<typename Hint, typename RKey, typename MappedArg>
940  std::pair<iterator, bool> pvInsertOrAssign(Hint hint, RKey&& key, MappedArg&& mappedArg)
941  {
942  std::pair<iterator, bool> res = MapBase::ptEmplace(hint,
943  std::forward_as_tuple(std::forward<RKey>(key)),
944  std::forward_as_tuple(std::forward<MappedArg>(mappedArg)));
945  if (!res.second)
946  res.first->second = std::forward<MappedArg>(mappedArg);
947  return res;
948  }
949 };
950 
959 template<typename TKey, typename TMapped,
960  typename TLessComparer = std::less<TKey>,
961  typename TAllocator = std::allocator<std::pair<const TKey, TMapped>>,
962  typename TTreeMap = TreeMap<TKey, TMapped, TreeTraitsStd<TKey, TLessComparer, true>,
963  MemManagerStd<TAllocator>>>
964 class multimap : public internal::map_base<TKey, TMapped, TLessComparer, TAllocator, TTreeMap>
965 {
966 private:
968 
969 public:
970  using typename MapBase::key_type;
971  using typename MapBase::mapped_type;
972  using typename MapBase::size_type;
973  using typename MapBase::value_type;
974  using typename MapBase::iterator;
975  using typename MapBase::const_reference;
976  using typename MapBase::const_iterator;
977  using typename MapBase::node_type;
978 
980 
981 public:
982  using MapBase::MapBase;
983 
984  multimap& operator=(std::initializer_list<value_type> values)
985  {
986  MapBase::ptAssign(values);
987  return *this;
988  }
989 
990  friend void swap(multimap& left, multimap& right) noexcept
991  {
992  left.swap(right);
993  }
994 
995  //using MapBase::insert; // gcc 5 & 6
996 
997  template<typename ValueArg = std::pair<key_type, mapped_type>>
999  iterator> insert(ValueArg&& valueArg)
1000  {
1001  return MapBase::insert(std::forward<ValueArg>(valueArg)).first;
1002  }
1003 
1004  template<typename ValueArg = std::pair<key_type, mapped_type>>
1006  iterator> insert(const_iterator hint, ValueArg&& valueArg)
1007  {
1008  return MapBase::insert(hint, std::forward<ValueArg>(valueArg));
1009  }
1010 
1012  {
1013  return MapBase::insert(std::move(node)).position;
1014  }
1015 
1017  {
1018  return MapBase::insert(hint, std::move(node));
1019  }
1020 
1021  template<typename Iterator>
1022  void insert(Iterator first, Iterator last)
1023  {
1024  MapBase::insert(first, last);
1025  }
1026 
1027  void insert(std::initializer_list<value_type> values)
1028  {
1029  MapBase::insert(values);
1030  }
1031 
1032  template<typename... ValueArgs>
1033  iterator emplace(ValueArgs&&... valueArgs)
1034  {
1035  return MapBase::emplace(std::forward<ValueArgs>(valueArgs)...).first;
1036  }
1037 
1038  template<typename ValueFilter>
1039  friend size_type erase_if(multimap& cont, const ValueFilter& valueFilter)
1040  {
1041  auto pairFilter = [&valueFilter] (const key_type& key, const mapped_type& mapped)
1042  { return valueFilter(const_reference(key, mapped)); };
1043  return cont.get_nested_container().Remove(pairFilter);
1044  }
1045 };
1046 
1047 #ifdef MOMO_HAS_DEDUCTION_GUIDES
1048 
1049 #define MOMO_DECLARE_DEDUCTION_GUIDES(map) \
1050 template<typename Iterator, \
1051  typename Value = typename std::iterator_traits<Iterator>::value_type, \
1052  typename Key = std::decay_t<typename Value::first_type>, \
1053  typename Mapped = std::decay_t<typename Value::second_type>, \
1054  typename Allocator = std::allocator<std::pair<const Key, Mapped>>, \
1055  typename = internal::ordered_checker<Key, Allocator>> \
1056 map(Iterator, Iterator, Allocator = Allocator()) \
1057  -> map<Key, Mapped, std::less<Key>, Allocator>; \
1058 template<typename Iterator, typename LessComparer, \
1059  typename Value = typename std::iterator_traits<Iterator>::value_type, \
1060  typename Key = std::decay_t<typename Value::first_type>, \
1061  typename Mapped = std::decay_t<typename Value::second_type>, \
1062  typename Allocator = std::allocator<std::pair<const Key, Mapped>>, \
1063  typename = internal::ordered_checker<Key, Allocator, LessComparer>> \
1064 map(Iterator, Iterator, LessComparer, Allocator = Allocator()) \
1065  -> map<Key, Mapped, LessComparer, Allocator>; \
1066 template<typename QKey, typename Mapped, \
1067  typename Key = std::remove_const_t<QKey>, \
1068  typename Allocator = std::allocator<std::pair<const Key, Mapped>>, \
1069  typename = internal::ordered_checker<Key, Allocator>> \
1070 map(std::initializer_list<std::pair<QKey, Mapped>>, Allocator = Allocator()) \
1071  -> map<Key, Mapped, std::less<Key>, Allocator>; \
1072 template<typename QKey, typename Mapped, typename LessComparer, \
1073  typename Key = std::remove_const_t<QKey>, \
1074  typename Allocator = std::allocator<std::pair<const Key, Mapped>>, \
1075  typename = internal::ordered_checker<Key, Allocator, LessComparer>> \
1076 map(std::initializer_list<std::pair<QKey, Mapped>>, LessComparer, Allocator = Allocator()) \
1077  -> map<Key, Mapped, LessComparer, Allocator>;
1078 
1079 MOMO_DECLARE_DEDUCTION_GUIDES(map)
1080 MOMO_DECLARE_DEDUCTION_GUIDES(multimap)
1081 
1082 #undef MOMO_DECLARE_DEDUCTION_GUIDES
1083 
1084 #ifdef MOMO_HAS_CONTAINERS_RANGES
1085 
1086 #define MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(map) \
1087 template<std::ranges::input_range Range, \
1088  typename Value = std::ranges::range_value_t<Range>, \
1089  typename Key = std::decay_t<typename Value::first_type>, \
1090  typename Mapped = std::decay_t<typename Value::second_type>, \
1091  typename Allocator = std::allocator<std::pair<const Key, Mapped>>, \
1092  typename = internal::ordered_checker<Key, Allocator>> \
1093 map(std::from_range_t, Range&&, Allocator = Allocator()) \
1094  -> map<Key, Mapped, std::less<Key>, Allocator>; \
1095 template<std::ranges::input_range Range, typename LessComparer, \
1096  typename Value = std::ranges::range_value_t<Range>, \
1097  typename Key = std::decay_t<typename Value::first_type>, \
1098  typename Mapped = std::decay_t<typename Value::second_type>, \
1099  typename Allocator = std::allocator<std::pair<const Key, Mapped>>, \
1100  typename = internal::ordered_checker<Key, Allocator, LessComparer>> \
1101 map(std::from_range_t, Range&&, LessComparer, Allocator = Allocator()) \
1102  -> map<Key, Mapped, LessComparer, Allocator>;
1103 
1104 MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(map)
1105 MOMO_DECLARE_DEDUCTION_GUIDES_RANGES(multimap)
1106 
1107 #undef MOMO_DECLARE_DEDUCTION_GUIDES_RANGES
1108 
1109 #endif // MOMO_HAS_CONTAINERS_RANGES
1110 
1111 #endif // MOMO_HAS_DEDUCTION_GUIDES
1112 
1113 } // namespace stdish
1114 
1115 } // namespace momo
1116 
1117 #endif // MOMO_INCLUDE_GUARD_STDISH_MAP
momo::stdish::internal::map_base::rbegin
reverse_iterator rbegin() noexcept
Definition: map.h:279
momo::internal::ObjectManager
Definition: ObjectManager.h:240
momo::stdish::map::at
mapped_type & at(const key_type &key)
Definition: map.h:870
momo::stdish::map::mapped_type
TMapped mapped_type
Definition: map.h:79
momo::stdish::multimap::insert_return_type
iterator insert_return_type
Definition: map.h:979
momo::TreeMap::ValueReferenceCKey
ValueReferencer::template ValueReference< const Key & > ValueReferenceCKey
Definition: TreeMap.h:272
momo::internal::InsertResult::position
Position position
Definition: IteratorUtility.h:168
momo::stdish::internal::map_base::insert
iterator insert(const_iterator hint, node_type &&node)
Definition: map.h:510
momo::stdish::internal::map_base::erase
iterator erase(iterator where)
Definition: map.h:600
momo::stdish::map::try_emplace
std::pair< iterator, bool > try_emplace(key_type &&key, MappedArgs &&... mappedArgs)
Definition: map.h:879
momo::stdish::internal::map_base::value_comp
value_compare value_comp() const
Definition: map.h:319
momo::stdish::internal::map_base::lower_bound
const_iterator lower_bound(const key_type &key) const
Definition: map.h:404
momo::stdish::internal::map_base::difference_type
ptrdiff_t difference_type
Definition: map.h:86
momo::stdish::internal::map_base::map_base
map_base(map_base &&right, const momo::internal::Identity< allocator_type > &alloc)
Definition: map.h:202
momo::stdish::internal::map_base::extract
node_type extract(const key_type &key)
Definition: map.h:621
momo::stdish::internal::map_base::emplace
std::pair< iterator, bool > emplace(std::piecewise_construct_t, std::tuple< KeyArgs... > keyArgs, std::tuple< MappedArgs... > mappedArgs)
Definition: map.h:582
momo::stdish::map
momo::stdish::map is similar to std::map, but much more efficient in memory usage....
Definition: map.h:824
momo::stdish::internal::map_base::cend
const_iterator cend() const noexcept
Definition: map.h:299
momo::stdish::map::erase_if
friend size_type erase_if(map &cont, const ValueFilter &valueFilter)
Definition: map.h:931
momo::stdish::internal::map_base::merge
void merge(Map &&map)
Definition: map.h:628
momo::TreeTraits::IsLess
bool IsLess(const KeyArg1 &key1, const KeyArg2 &key2) const
Definition: TreeTraits.h:107
momo::stdish::internal::map_base::allocator_type
TAllocator allocator_type
Definition: map.h:81
momo::stdish::map::size_type
size_t size_type
Definition: map.h:85
momo::stdish::map::key_type
TKey key_type
Definition: map.h:78
momo::stdish::map::operator=
map & operator=(std::initializer_list< value_type > values)
Definition: map.h:841
momo::stdish::internal::map_base::size
size_type size() const noexcept
Definition: map.h:341
momo::stdish::internal::map_base::operator=
map_base & operator=(const map_base &right)
Definition: map.h:234
momo::stdish::internal::map_base::map_base
map_base(const key_compare &lessComp, const allocator_type &alloc=allocator_type())
Definition: map.h:146
momo::stdish::internal::map_base::begin
const_iterator begin() const noexcept
Definition: map.h:254
momo::stdish::internal::map_base::rend
const_reverse_iterator rend() const noexcept
Definition: map.h:284
momo::stdish::internal::map_base::key_comp
key_compare key_comp() const
Definition: map.h:314
momo::stdish::internal::map_base::lower_bound
iterator lower_bound(const key_type &key)
Definition: map.h:409
momo::stdish::internal::map_base::get_allocator
allocator_type get_allocator() const noexcept
Definition: map.h:331
set_map_utility.h
momo::stdish::internal::map_base::ptEmplace
std::pair< iterator, bool > ptEmplace(Hint hint, std::tuple< KeyArgs... > &&keyArgs, std::tuple< MappedArgs... > &&mappedArgs)
Definition: map.h:663
momo::stdish::internal::map_base::const_reverse_iterator
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: map.h:105
momo::stdish::internal::map_base::find
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, iterator > find(const KeyArg &key)
Definition: map.h:375
momo::stdish::internal::map_base::get_nested_container
const nested_container_type & get_nested_container() const noexcept
Definition: map.h:244
momo::stdish::internal::insert_return_type
Definition: set_map_utility.h:202
momo::stdish::multimap::const_reference
const_iterator::Reference const_reference
Definition: map.h:97
momo::stdish::internal::map_base::insert_return_type
internal::insert_return_type< iterator, node_type > insert_return_type
Definition: map.h:108
momo::stdish::internal::map_base::count
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, size_type > count(const KeyArg &key) const
Definition: map.h:387
momo::stdish::multimap::insert
void insert(Iterator first, Iterator last)
Definition: map.h:1022
momo::stdish::internal::map_base::crbegin
const_reverse_iterator crbegin() const noexcept
Definition: map.h:304
momo::TreeMap::MemManager
TMemManager MemManager
Definition: TreeMap.h:243
momo::stdish::map::operator[]
TreeMap::ValueReferenceRKey operator[](key_type &&key)
Definition: map.h:852
momo::stdish::internal::map_base::empty
MOMO_NODISCARD bool empty() const noexcept
Definition: map.h:346
momo::internal::TreeMapIterator
Definition: TreeMap.h:33
momo::TreeTraits
Definition: TreeTraits.h:82
momo::stdish::internal::map_base::rend
reverse_iterator rend() noexcept
Definition: map.h:289
momo::stdish::internal::map_base::insert
momo::internal::EnableIf< std::is_constructible< value_type, ValueArg && >::value, iterator > insert(const_iterator hint, ValueArg &&valueArg)
Definition: map.h:495
momo::stdish::internal::map_base::insert
void insert(std::initializer_list< value_type > values)
Definition: map.h:527
momo::stdish::internal::map_base::emplace
std::pair< iterator, bool > emplace(KeyArg &&keyArg, MappedArg &&mappedArg)
Definition: map.h:568
momo::internal::ContainerAssignerStd::Move
static Container & Move(Container &&srcCont, Container &dstCont) noexcept(IsNothrowMoveAssignable< Container >::value)
Definition: Utility.h:496
momo::internal::InsertResult
Definition: IteratorUtility.h:136
momo::stdish::internal::map_base::equal_range
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, std::pair< const_iterator, const_iterator > > equal_range(const KeyArg &key) const
Definition: map.h:474
momo::stdish::internal::map_base::extract
node_type extract(const_iterator where)
Definition: map.h:616
momo::stdish::internal::map_base::operator<
friend bool operator<(const map_base &left, const map_base &right)
Definition: map.h:647
momo::stdish::multimap::key_type
TKey key_type
Definition: map.h:78
momo::stdish::internal::map_base::equal_range
std::pair< iterator, iterator > equal_range(const key_type &key)
Definition: map.h:462
momo::stdish::internal::map_base::contains
bool contains(const key_type &key) const
Definition: map.h:392
momo::stdish::map::const_reference
const_iterator::Reference const_reference
Definition: map.h:97
momo::TreeMap::ValueReferenceRKey
ValueReferencer::template ValueReference< Key && > ValueReferenceRKey
Definition: TreeMap.h:271
momo::stdish::internal::map_node_handle
Definition: set_map_utility.h:112
momo::stdish::internal::map_base::equal_range
std::pair< const_iterator, const_iterator > equal_range(const key_type &key) const
Definition: map.h:452
momo::stdish::multimap
momo::stdish::multimap is similar to std::multimap, but much more efficient in memory usage....
Definition: map.h:965
momo::stdish::internal::map_base::emplace_hint
iterator emplace_hint(const_iterator hint)
Definition: map.h:546
momo::stdish::multimap::mapped_type
TMapped mapped_type
Definition: map.h:79
momo::stdish::internal::map_base::emplace
std::pair< iterator, bool > emplace()
Definition: map.h:541
momo::stdish::internal::map_base::equal_range
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, std::pair< iterator, iterator > > equal_range(const KeyArg &key)
Definition: map.h:481
momo::internal::EnableIf
typename std::enable_if< value, Type >::type EnableIf
Definition: Utility.h:209
momo::stdish::internal::map_base::map_base
map_base(const map_base &right)
Definition: map.h:216
momo::stdish::internal::map_base::find
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, const_iterator > find(const KeyArg &key) const
Definition: map.h:368
momo::stdish::multimap::insert
iterator insert(node_type &&node)
Definition: map.h:1011
momo::stdish::internal::map_value_compare::map_value_compare
map_value_compare(const LessComparer &lessComp)
Definition: map.h:57
momo::stdish::map::insert_or_assign
std::pair< iterator, bool > insert_or_assign(const key_type &key, MappedArg &&mappedArg)
Definition: map.h:919
momo
Definition: Array.h:26
momo::stdish::internal::map_base::erase
iterator erase(const_iterator first, const_iterator last)
Definition: map.h:605
momo::stdish::internal::map_value_compare::Key
TKey Key
Definition: map.h:44
momo::internal::ContainerAssignerStd::IsNothrowMoveAssignable
BoolConstant< std::is_empty< Allocator >::value||std::allocator_traits< Allocator >::propagate_on_container_move_assignment::value > IsNothrowMoveAssignable
Definition: Utility.h:492
momo::stdish::map::try_emplace
std::pair< iterator, bool > try_emplace(const key_type &key, MappedArgs &&... mappedArgs)
Definition: map.h:893
MOMO_MORE_COMPARISON_OPERATORS
#define MOMO_MORE_COMPARISON_OPERATORS(RObject)
Definition: Utility.h:88
momo::stdish::multimap::insert
momo::internal::EnableIf< std::is_constructible< value_type, ValueArg && >::value, iterator > insert(ValueArg &&valueArg)
Definition: map.h:999
momo::internal::IteratorPointer
Definition: IteratorUtility.h:264
momo::stdish::internal::map_base::upper_bound
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, const_iterator > upper_bound(const KeyArg &key) const
Definition: map.h:440
momo::stdish::internal::map_base::crend
const_reverse_iterator crend() const noexcept
Definition: map.h:309
momo::stdish::internal::map_base::end
iterator end() noexcept
Definition: map.h:269
momo::stdish::internal::map_base::reference
iterator::Reference reference
Definition: map.h:96
momo::internal::InsertResult::inserted
bool inserted
Definition: IteratorUtility.h:171
momo::internal::Identity
EnableIf< true, Type > Identity
Definition: Utility.h:212
momo::stdish::internal::map_base
Definition: map.h:69
momo::stdish::internal::map_base::key_compare
TLessComparer key_compare
Definition: map.h:80
momo::stdish::map::at
const mapped_type & at(const key_type &key) const
Definition: map.h:862
momo::stdish::internal::map_base::map_base
map_base(std::initializer_list< momo::internal::Identity< value_type >> values, const allocator_type &alloc=allocator_type())
Definition: map.h:166
momo::stdish::internal::map_base::erase
iterator erase(const_iterator where)
Definition: map.h:595
momo::stdish::internal::map_base::map_base
map_base(const map_base &right, const momo::internal::Identity< allocator_type > &alloc)
Definition: map.h:221
momo::stdish::internal::map_base::count
size_type count(const key_type &key) const
Definition: map.h:380
momo::stdish::internal::map_base::ptAssign
void ptAssign(std::initializer_list< value_type > values)
Definition: map.h:657
momo::stdish::internal::map_base::swap
void swap(map_base &right) noexcept
Definition: map.h:239
momo::stdish::map::operator[]
TreeMap::ValueReferenceCKey operator[](const key_type &key)
Definition: map.h:857
momo::stdish::internal::map_base::value_compare
map_value_compare< key_type, key_compare > value_compare
Definition: map.h:90
momo::stdish::internal::map_base::iterator
momo::internal::TreeDerivedIterator< TreeMapIterator, momo::internal::MapReferenceStd > iterator
Definition: map.h:93
MOMO_DECLARE_PROXY_CONSTRUCTOR
#define MOMO_DECLARE_PROXY_CONSTRUCTOR(Object)
Definition: Utility.h:118
momo::stdish::internal::map_base::operator==
friend bool operator==(const map_base &left, const map_base &right)
Definition: map.h:633
momo::stdish::internal::map_base::reverse_iterator
std::reverse_iterator< iterator > reverse_iterator
Definition: map.h:104
momo::stdish::multimap::insert
momo::internal::EnableIf< std::is_constructible< value_type, ValueArg && >::value, iterator > insert(const_iterator hint, ValueArg &&valueArg)
Definition: map.h:1006
momo::stdish::multimap::insert
void insert(std::initializer_list< value_type > values)
Definition: map.h:1027
momo::stdish::multimap::operator=
multimap & operator=(std::initializer_list< value_type > values)
Definition: map.h:984
momo::stdish::multimap::erase_if
friend size_type erase_if(multimap &cont, const ValueFilter &valueFilter)
Definition: map.h:1039
momo::stdish::internal::map_base::get_nested_container
nested_container_type & get_nested_container() noexcept
Definition: map.h:249
momo::stdish::internal::map_base::value_type
std::pair< const key_type, mapped_type > value_type
Definition: map.h:88
momo::stdish::internal::map_base::map_base
map_base(Iterator first, Iterator last, const key_compare &lessComp, const allocator_type &alloc=allocator_type())
Definition: map.h:159
momo::stdish::internal::map_base::find
iterator find(const key_type &key)
Definition: map.h:361
momo::stdish::internal::map_base::upper_bound
iterator upper_bound(const key_type &key)
Definition: map.h:433
MOMO_DECLARE_PROXY_FUNCTION
#define MOMO_DECLARE_PROXY_FUNCTION(Object, Func)
Definition: Utility.h:126
momo::stdish::internal::map_base::const_iterator
iterator::ConstIterator const_iterator
Definition: map.h:94
momo::internal::TreeDerivedIterator
Definition: IteratorUtility.h:445
momo::stdish::internal::map_base::cbegin
const_iterator cbegin() const noexcept
Definition: map.h:294
momo::stdish::internal::map_base::clear
void clear() noexcept
Definition: map.h:351
momo::internal::ObjectBuffer
Definition: ObjectManager.h:189
momo::stdish::internal::map_base::emplace
std::pair< iterator, bool > emplace(ValueArg &&valueArg)
Definition: map.h:552
std
Definition: Array.h:1173
momo::stdish::internal::map_base::const_reference
const_iterator::Reference const_reference
Definition: map.h:97
momo::stdish::map::try_emplace
iterator try_emplace(const_iterator hint, key_type &&key, MappedArgs &&... mappedArgs)
Definition: map.h:886
momo::stdish::internal::map_base::emplace_hint
iterator emplace_hint(const_iterator hint, std::piecewise_construct_t, std::tuple< KeyArgs... > keyArgs, std::tuple< MappedArgs... > mappedArgs)
Definition: map.h:589
momo::stdish::internal::map_base::emplace_hint
iterator emplace_hint(const_iterator hint, ValueArg &&valueArg)
Definition: map.h:560
momo::stdish::internal::map_base::map_base
map_base(const allocator_type &alloc)
Definition: map.h:141
momo::stdish::internal::map_base::max_size
size_type max_size() const noexcept
Definition: map.h:336
momo::stdish::internal::map_base::map_base
map_base()
Definition: map.h:137
momo::stdish::internal::map_base::key_type
TKey key_type
Definition: map.h:78
momo::stdish::internal::map_base::end
const_iterator end() const noexcept
Definition: map.h:264
momo::stdish::internal::map_base::insert
insert_return_type insert(node_type &&node)
Definition: map.h:500
momo::stdish::internal::map_value_compare::comp
LessComparer comp
Definition: map.h:63
MOMO_STATIC_ASSERT
#define MOMO_STATIC_ASSERT(...)
Definition: Utility.h:107
momo::stdish::internal::map_base::map_base
map_base(map_base &&right)
Definition: map.h:197
momo::stdish::internal::map_base::contains
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, bool > contains(const KeyArg &key) const
Definition: map.h:399
momo::stdish::map::swap
friend void swap(map &left, map &right) noexcept
Definition: map.h:847
momo::stdish::multimap::insert
iterator insert(const_iterator hint, node_type &&node)
Definition: map.h:1016
momo::stdish::internal::map_base::map_base
map_base(Iterator first, Iterator last, const allocator_type &alloc=allocator_type())
Definition: map.h:152
momo::stdish::internal::map_base::rbegin
const_reverse_iterator rbegin() const noexcept
Definition: map.h:274
momo::stdish::map::insert_or_assign
iterator insert_or_assign(const_iterator hint, key_type &&key, MappedArg &&mappedArg)
Definition: map.h:913
momo::internal::TreeDerivedIterator::Reference
TReference< typename BaseIterator::Reference > Reference
Definition: IteratorUtility.h:450
momo::stdish::internal::map_base::nested_container_type
TreeMap nested_container_type
Definition: map.h:83
momo::stdish::internal::map_base::operator=
map_base & operator=(map_base &&right) noexcept(momo::internal::ContainerAssignerStd::IsNothrowMoveAssignable< map_base >::value)
Definition: map.h:228
momo::stdish::internal::map_base::begin
iterator begin() noexcept
Definition: map.h:259
momo::stdish::internal::map_value_compare::operator()
bool operator()(const Value &value1, const Value &value2) const
Definition: map.h:49
momo::stdish::internal::map_base::size_type
size_t size_type
Definition: map.h:85
momo::stdish::internal::map_value_compare
Definition: map.h:42
momo::stdish::internal::map_base::emplace_hint
iterator emplace_hint(const_iterator hint, KeyArg &&keyArg, MappedArg &&mappedArg)
Definition: map.h:575
momo::stdish::multimap::swap
friend void swap(multimap &left, multimap &right) noexcept
Definition: map.h:990
momo::stdish::internal::map_value_compare::LessComparer
TLessComparer LessComparer
Definition: map.h:45
momo::stdish::map::insert_or_assign
std::pair< iterator, bool > insert_or_assign(key_type &&key, MappedArg &&mappedArg)
Definition: map.h:907
momo::stdish::internal::map_base::lower_bound
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, iterator > lower_bound(const KeyArg &key)
Definition: map.h:423
momo::internal::ContainerAssignerStd::Copy
static Container & Copy(const Container &srcCont, Container &dstCont)
Definition: Utility.h:512
momo::stdish::internal::map_base::const_pointer
const_iterator::Pointer const_pointer
Definition: map.h:100
momo::stdish::internal::map_base::upper_bound
const_iterator upper_bound(const key_type &key) const
Definition: map.h:428
momo::stdish::multimap::size_type
size_t size_type
Definition: map.h:85
momo::TreeMap::TreeTraits
TTreeTraits TreeTraits
Definition: TreeMap.h:242
momo::stdish::internal::map_base::mapped_type
TMapped mapped_type
Definition: map.h:79
Utility.h
momo::TreeTraits::multiKey
static const bool multiKey
Definition: TreeTraits.h:87
momo::stdish::internal::map_base::upper_bound
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, iterator > upper_bound(const KeyArg &key)
Definition: map.h:447
momo::stdish::map::insert_or_assign
iterator insert_or_assign(const_iterator hint, const key_type &key, MappedArg &&mappedArg)
Definition: map.h:925
momo::internal::ContainerAssignerStd::Swap
static void Swap(Container &cont1, Container &cont2) noexcept
Definition: Utility.h:527
momo::stdish::internal::map_base::~map_base
~map_base()=default
momo::stdish::internal::map_base::erase
size_type erase(const key_type &key)
Definition: map.h:611
momo::stdish::internal::map_base::insert
void insert(Iterator first, Iterator last)
Definition: map.h:522
momo::stdish::internal::map_base::map_base
map_base(std::initializer_list< momo::internal::Identity< value_type >> values, const key_compare &lessComp, const allocator_type &alloc=allocator_type())
Definition: map.h:172
momo::stdish::map::try_emplace
iterator try_emplace(const_iterator hint, const key_type &key, MappedArgs &&... mappedArgs)
Definition: map.h:900
momo::stdish::multimap::emplace
iterator emplace(ValueArgs &&... valueArgs)
Definition: map.h:1033
MOMO_NODISCARD
#define MOMO_NODISCARD
Definition: UserSettings.h:217
momo::stdish::internal::map_base::pointer
iterator::Pointer pointer
Definition: map.h:99
momo::stdish::internal::map_base::find
const_iterator find(const key_type &key) const
Definition: map.h:356
momo::stdish::internal::map_base::insert
momo::internal::EnableIf< std::is_constructible< value_type, ValueArg && >::value, std::pair< iterator, bool > > insert(ValueArg &&valueArg)
Definition: map.h:488
momo::stdish::internal::map_base::node_type
internal::map_node_handle< typename TreeMap::ExtractedPair > node_type
Definition: map.h:107
momo::internal::MapReferenceStd
Definition: MapUtility.h:68
momo::stdish::internal::map_base::lower_bound
momo::internal::EnableIf< IsValidKeyArg< KeyArg >::value, const_iterator > lower_bound(const KeyArg &key) const
Definition: map.h:416