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