22 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
24 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE>)
27 _AssertRepValidType ();
29 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
30 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
31 inline Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::Mapping (KEY_EQUALS_COMPARER&& keyEqualsComparer)
32 : inherited{Factory::Mapping_Factory<KEY_TYPE, MAPPED_VALUE_TYPE, remove_cvref_t<KEY_EQUALS_COMPARER>>::Default () (
33 forward<KEY_EQUALS_COMPARER> (keyEqualsComparer))}
35 _AssertRepValidType ();
37 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
39 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE>)
43 _AssertRepValidType ();
45 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
46 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
48 const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
49 : Mapping{forward<KEY_EQUALS_COMPARER> (keyEqualsComparer)}
52 _AssertRepValidType ();
54#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
55 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
56 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
58 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE> and
59 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>>)
62 AddAll (forward<ITERABLE_OF_ADDABLE> (src));
63 _AssertRepValidType ();
66 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
67 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
69 : Mapping{forward<KEY_EQUALS_COMPARER> (keyEqualsComparer)}
71 AddAll (forward<ITERABLE_OF_ADDABLE> (src));
72 _AssertRepValidType ();
74 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
75 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
77 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE>)
80 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (end));
81 _AssertRepValidType ();
83 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
84 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE,
85 sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
87 : Mapping{forward<KEY_EQUALS_COMPARER> (keyEqualsComparer)}
89 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (
end));
90 _AssertRepValidType ();
92 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
97 _AssertRepValidType ();
99 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
103 _AssertRepValidType ();
105 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
106 inline auto Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::GetKeyEqualsComparer () const -> KeyEqualsCompareFunctionType
108 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().GetKeyEqualsComparer ();
110 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
115 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
118 return this->
template Map<Iterable<MAPPED_VALUE_TYPE>> (
121 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
124 if (item ==
nullptr) {
125 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
128 optional<mapped_type> tmp;
129 if (_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, &tmp)) {
136 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
139 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, item);
141 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
144 optional<MAPPED_VALUE_TYPE> r;
145 [[maybe_unused]]
bool result = _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, &r);
146 Ensure (result == r.has_value ());
147 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
149 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
151 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
154 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
156 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
157 template <
typename THROW_IF_MISSING>
160 if (optional<MAPPED_VALUE_TYPE> r{Lookup (key)}) [[likely]] {
165 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
168 optional<MAPPED_VALUE_TYPE> r{Lookup (key)};
169 return r.has_value () ? *r : defaultValue;
171 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
174 return *Lookup (key);
176 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
179 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
181 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
182 template <
typename VALUE_EQUALS_COMPARER>
185 return this->Find ([&valueEqualsComparer, &v] (
const auto& t) {
return valueEqualsComparer (t.fValue, v); }) !=
nullptr;
187 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
190 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (key, newElt, addReplaceMode);
192 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
195 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (p.fKey, p.fValue, addReplaceMode);
197 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
198 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
201 unsigned int cntAdded{};
202 for (
auto i = forward<ITERATOR_OF_ADDABLE> (start); i != forward<ITERATOR_OF_ADDABLE2> (end); ++i) {
203 if (Add (*i, addReplaceMode)) {
209 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
210 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
213 if constexpr (std::is_convertible_v<remove_cvref_t<ITERABLE_OF_ADDABLE>*, Iterable<value_type>*>) {
215 if (
static_cast<const Iterable<value_type>*
> (
this) ==
static_cast<const Iterable<value_type>*
> (&items)) [[unlikely]] {
216 vector<value_type> copy{std::begin (items), Iterator<value_type>{std::end (items)}};
217 return AddAll (std::begin (copy), std::end (copy), addReplaceMode);
220 return AddAll (std::begin (items), std::end (items), addReplaceMode);
222 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
225 Verify (_SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key));
227 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
230 Require (not i.
Done ());
231 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
232 writerRep->Remove (patchedIterator, nextI);
234 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
237 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key);
239 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
242 _SafeReadRepAccessor<_IRep> accessor{
this};
243 if (not accessor._ConstGetRep ().empty ()) {
244 this->_fRep = accessor._ConstGetRep ().CloneEmpty ();
247 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
248 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
250 requires (IIterableOfTo<ITERABLE_OF_KEY_OR_ADDABLE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> or
251 IIterableOfTo<ITERABLE_OF_KEY_OR_ADDABLE, pair<KEY_TYPE, MAPPED_VALUE_TYPE>> or IIterableOfTo<ITERABLE_OF_KEY_OR_ADDABLE, KEY_TYPE>)
253 using ITEM_T = ranges::range_value_t<ITERABLE_OF_KEY_OR_ADDABLE>;
254 static_assert (is_convertible_v<ITEM_T, key_type> or is_convertible_v<ITEM_T, pair<key_type, mapped_type>> or
255 is_convertible_v<ITEM_T, KeyValuePair<key_type, mapped_type>>);
256 if constexpr (convertible_to<const Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>*,
const ITERABLE_OF_KEY_OR_ADDABLE*>) {
257 if (
this == &items) {
258 size_t result = this->size ();
263 return this->RemoveAll (begin (items), end (items));
265 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
266 template <
typename ITERATOR_OF_KEY_OR_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_KEY_OR_ADDABLE>> ITERATOR_OF_KEY_OR_ADDABLE2>
269 using ITEM_T = iter_value_t<ITERATOR_OF_KEY_OR_ADDABLE>;
270 static_assert (is_convertible_v<ITEM_T, key_type> or is_convertible_v<ITEM_T, pair<key_type, mapped_type>> or
271 is_convertible_v<ITEM_T, KeyValuePair<key_type, mapped_type>>);
273 for (
auto i = start; i != end; ++i) {
274 if constexpr (is_convertible_v<ITEM_T, key_type>) {
279 else if constexpr (is_convertible_v<ITEM_T, pair<key_type, mapped_type>>) {
280 if (RemoveIf (i->first)) {
284 else if constexpr (is_convertible_v<ITEM_T, KeyValuePair<key_type, mapped_type>>) {
285 if (RemoveIf (i->fKey)) {
295 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
296 template <predicate<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> PREDICATE>
311 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
315 Require (not i.
Done ());
316 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
317 writerRep->Update (patchedIterator, newValue, nextI);
319 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
320 template <IIterableOfTo<KEY_TYPE> ITERABLE_OF_KEY_TYPE>
336 size_t thisSize = this->size ();
339 bool fewerLookupsThanAdds = items.size () <= 2;
340 if (fewerLookupsThanAdds) {
342 auto keyEqualsComparer = this->GetKeyEqualsComparer ();
343 using ITEMS_ITER_TYPE =
decltype (items.begin ());
345 if (find_if<ITEMS_ITER_TYPE> (items.begin (), items.end (),
346 [&] (
const KEY_TYPE& k) { return keyEqualsComparer (i->fKey, k); }) == items.end ()) {
347#if qStroika_Foundation_Debug_AssertionsChecked
348 [[maybe_unused]]
size_t sz = this->size ();
351#if qStroika_Foundation_Debug_AssertionsChecked
352 Assert (this->size () == sz - 1u);
363 Mapping result =
Mapping{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()};
365 for (
auto key2Keep : items) {
366 if (
auto l = this->Lookup (key2Keep)) {
367 result.
Add (key2Keep, *l);
372 if (thisSize != nAdds) {
376 if constexpr (equality_comparable<MAPPED_VALUE_TYPE>) {
377 Assert (*
this == result);
385 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
386 template <
typename RESULT_CONTAINER, invocable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ELEMENT_MAPPER>
388 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>,
typename RESULT_CONTAINER::value_type> or
389 convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, optional<typename RESULT_CONTAINER::value_type>>)
391 if constexpr (same_as<RESULT_CONTAINER, Mapping>) {
393 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
394 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
397 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper));
400 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
401 template <derived_from<Iterable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>> RESULT_CONTAINER,
typename INCLUDE_PREDICATE>
403 requires (predicate<INCLUDE_PREDICATE, KEY_TYPE> or predicate<INCLUDE_PREDICATE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>)
405 if constexpr (predicate<INCLUDE_PREDICATE, KEY_TYPE>) {
407 return Where<RESULT_CONTAINER> (
408 [=] (
const ArgByValueType<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& kvp) {
return includeIfTrue (kvp.fKey); });
411 if constexpr (same_as<RESULT_CONTAINER, Mapping>) {
413 return inherited::template Where<RESULT_CONTAINER> (
414 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
417 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue));
421 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
422 template <
typename CONTAINER_OF_KEYS>
425 return Where ([=] (
const key_type& key) ->
bool {
return includeKeys.Contains (key); });
427 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
431 return inherited::Where ([=] (
const ArgByValueType<value_type>& kvp) {
return ik.Contains (kvp.fKey); }, ArchetypeContainerType{});
433 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
434 template <
typename CONTAINER_OF_Key_T>
437 return As_<CONTAINER_OF_Key_T> ();
439 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
440 template <
typename CONTAINER_OF_Key_T>
441 CONTAINER_OF_Key_T Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::As_ ()
const
443 CONTAINER_OF_Key_T result;
444 for (
const auto& i : *this) {
446 if constexpr (is_convertible_v<typename CONTAINER_OF_Key_T::value_type, pair<KEY_TYPE, MAPPED_VALUE_TYPE>>) {
447 result.
insert (result.end (), pair<KEY_TYPE, MAPPED_VALUE_TYPE>{i.fKey, i.fValue});
450 result.insert (result.end (), value_type{i.fKey, i.fValue});
455 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
457 const function<
mapped_type (ArgByValueType<mapped_type>, ArgByValueType<mapped_type>)>& f,
460 Add (key, f (LookupValue (key, initialValue), newValue));
462 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
465 Add (kvp.fKey, kvp.fValue);
467 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
472 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
479 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
484 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
485 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
492 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
493 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
494 inline Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>& Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::operator+= (
const ITERABLE_OF_ADDABLE& items)
499 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
500 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
501 inline Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>& Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::operator-= (
const ITERABLE_OF_KEY_OR_ADDABLE& items)
506 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
508 -> tuple<_IRep*, Iterator<value_type>>
510 Require (not i.
Done ());
511 using element_type =
typename inherited::_SharedByValueRepType::element_type;
513 element_type* writableRep = this->_fRep.rwget ([&] (
const element_type& prevRepPtr) ->
typename inherited::_SharedByValueRepType::shared_ptr_type {
514 return Debug::UncheckedDynamicCast<const _IRep&> (prevRepPtr).CloneAndPatchIterator (&patchedIterator);
517 return make_tuple (Debug::UncheckedDynamicCast<_IRep*> (writableRep), move (patchedIterator));
519 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
523 [[maybe_unused]] _SafeReadRepAccessor<_IRep> ignored{
this};
526 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
528 requires (equality_comparable<MAPPED_VALUE_TYPE>)
538 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
539 template <
typename VALUE_EQUALS_COMPARER>
541 : fValueEqualsComparer{valueEqualsComparer}
544 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
545 template <
typename VALUE_EQUALS_COMPARER>
546 bool Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::EqualsComparer<VALUE_EQUALS_COMPARER>::operator() (
const Mapping& lhs,
const Mapping& rhs)
const
551 _SafeReadRepAccessor<_IRep> lhsR{&lhs};
552 _SafeReadRepAccessor<_IRep> rhsR{&rhs};
553 if (&lhsR._ConstGetRep () == &rhsR._ConstGetRep ()) [[unlikely]] {
558 if (lhsR._ConstGetRep ().size () != rhsR._ConstGetRep ().size ()) [[likely]] {
566 auto li = lhsR._ConstGetRep ().MakeIterator ();
567 auto ri = rhs.MakeIterator ();
568 auto keyEqualsComparer = lhs.GetKeyEqualsComparer ();
569 while (not li.Done ()) {
570 Assert (not ri.Done ());
571 bool keysEqual = keyEqualsComparer (li->fKey, ri->fKey);
572 Require (keysEqual == rhs.GetKeyEqualsComparer () (li->fKey, ri->fKey));
575 if (not fValueEqualsComparer (li->fValue, ri->fValue)) {
581 auto o = rhs.Lookup (li->fKey);
582 if (not o.has_value () or not fValueEqualsComparer (*o, li->fValue)) {
586 if (not lhsR._ConstGetRep ().Lookup (ri->fKey, &o) or not fValueEqualsComparer (*o, ri->fValue)) {
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
#define RequireExpression(c)
#define AssertNotReached()
nonvirtual CONTAINER_OF_Key_T As() const
nonvirtual bool Add(ArgByValueType< key_type > key, ArgByValueType< mapped_type > newElt, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
nonvirtual tuple< _IRep *, Iterator< value_type > > _GetWritableRepAndPatchAssociatedIterator(const Iterator< value_type > &i)
Utility to get WRITABLE underlying shared_ptr (replacement for what we normally do - _SafeReadWriteRe...
nonvirtual Iterable< mapped_type > MappedValues() const
nonvirtual void erase(ArgByValueType< key_type > key)
nonvirtual bool ContainsKey(ArgByValueType< key_type > key) const
nonvirtual optional< mapped_type > Lookup(ArgByValueType< key_type > key) const
nonvirtual mapped_type LookupChecked(ArgByValueType< key_type > key, const THROW_IF_MISSING &throwIfMissing) const
nonvirtual RESULT_CONTAINER Where(INCLUDE_PREDICATE &&includeIfTrue) const
nonvirtual add_const_t< mapped_type > operator[](ArgByValueType< key_type > key) const
nonvirtual unsigned int AddAll(ITERABLE_OF_ADDABLE &&items, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
nonvirtual bool operator==(const Mapping &rhs) const
compares if the two mappings have the same keys, and corresponding values (doesn't check ordering sam...
MAPPED_VALUE_TYPE mapped_type
nonvirtual void insert(ArgByValueType< value_type > kvp)
nonvirtual bool ContainsMappedValue(ArgByValueType< mapped_type > v, VALUE_EQUALS_COMPARER &&valueEqualsComparer={}) const
nonvirtual void Update(const Iterator< value_type > &i, ArgByValueType< mapped_type > newValue, Iterator< value_type > *nextI=nullptr)
nonvirtual ArchetypeContainerType WithKeys(const CONTAINER_OF_KEYS &includeKeys) const
nonvirtual bool RemoveIf(ArgByValueType< key_type > key)
Remove the given item, if it exists. Return true if found and removed.
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so container template defaults to Mapping, and improve that ca...
nonvirtual void RemoveAll()
RemoveAll removes all, or all matching (predicate, iterator range, equals comparer or whatever) items...
nonvirtual void Accumulate(ArgByValueType< key_type > key, ArgByValueType< mapped_type > newValue, const function< mapped_type(ArgByValueType< mapped_type >, ArgByValueType< mapped_type >)> &f=[](ArgByValueType< mapped_type > l, ArgByValueType< mapped_type > r) -> mapped_type { return l+r;}, mapped_type initialValue={})
like Add (key, newValue) - BUT newValue is COMBINED with the 'f' argument.
nonvirtual void Remove(ArgByValueType< key_type > key)
Remove the given item (which must exist).
nonvirtual mapped_type LookupValue(ArgByValueType< key_type > key, ArgByValueType< mapped_type > defaultValue=mapped_type{}) const
nonvirtual Iterable< key_type > Keys() const
nonvirtual void RetainAll(const ITERABLE_OF_KEY_TYPE &items)
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.
An Iterator<T> is a copyable object which allows traversing the contents of some container....
nonvirtual bool Done() const
Done () means there is nothing left in this iterator (a synonym for (it == container....
AddReplaceMode
Mode flag to say if Adding to a container replaces, or if the first addition wins.
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...
Compare Mappings<>s for equality. Note this can be costly, as the Mappings are not necessarily in the...