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)}
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)}
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 ());
149 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
152 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
154 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
155 template <
typename THROW_IF_MISSING>
158 if (optional<MAPPED_VALUE_TYPE> r{Lookup (key)}) [[likely]] {
163 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
166 optional<MAPPED_VALUE_TYPE> r{Lookup (key)};
167 return r.has_value () ? *r : defaultValue;
169 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
172 return *Lookup (key);
174 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
177 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
179 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
180 template <
typename VALUE_EQUALS_COMPARER>
183 return this->Find ([&valueEqualsComparer, &v] (
const auto& t) {
return valueEqualsComparer (t.fValue, v); }) !=
nullptr;
185 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
188 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (key, newElt, addReplaceMode);
190 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
193 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (p.fKey, p.fValue, addReplaceMode);
195 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
196 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
199 unsigned int cntAdded{};
200 for (
auto i = forward<ITERATOR_OF_ADDABLE> (start); i != forward<ITERATOR_OF_ADDABLE2> (end); ++i) {
201 if (Add (*i, addReplaceMode)) {
207 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
208 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
211 if constexpr (std::is_convertible_v<remove_cvref_t<ITERABLE_OF_ADDABLE>*, Iterable<value_type>*>) {
213 if (
static_cast<const Iterable<value_type>*
> (
this) ==
static_cast<const Iterable<value_type>*
> (&items)) [[unlikely]] {
214 vector<value_type> copy{std::begin (items), Iterator<value_type>{std::end (items)}};
215 return AddAll (std::begin (copy), std::end (copy), addReplaceMode);
218 return AddAll (std::begin (items), std::end (items), addReplaceMode);
220 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
223 Verify (_SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key));
225 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
228 Require (not i.
AtEnd ());
229 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
230 writerRep->Remove (patchedIterator, nextI);
232 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
235 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key);
237 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
240 _SafeReadRepAccessor<_IRep> accessor{
this};
241 if (not accessor._ConstGetRep ().empty ()) {
242 this->_fRep = accessor._ConstGetRep ().CloneEmpty ();
245 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
246 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
248 requires (IIterableOfTo<ITERABLE_OF_KEY_OR_ADDABLE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> or
249 IIterableOfTo<ITERABLE_OF_KEY_OR_ADDABLE, pair<KEY_TYPE, MAPPED_VALUE_TYPE>> or IIterableOfTo<ITERABLE_OF_KEY_OR_ADDABLE, KEY_TYPE>)
251 using ITEM_T = ranges::range_value_t<ITERABLE_OF_KEY_OR_ADDABLE>;
252 static_assert (is_convertible_v<ITEM_T, key_type> or is_convertible_v<ITEM_T, pair<key_type, mapped_type>> or
253 is_convertible_v<ITEM_T, KeyValuePair<key_type, mapped_type>>);
254 if constexpr (convertible_to<const Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>*,
const ITERABLE_OF_KEY_OR_ADDABLE*>) {
255 if (
this == &items) {
256 size_t result = this->size ();
261 return this->RemoveAll (begin (items), end (items));
263 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
264 template <
typename ITERATOR_OF_KEY_OR_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_KEY_OR_ADDABLE>> ITERATOR_OF_KEY_OR_ADDABLE2>
267 using ITEM_T = iter_value_t<ITERATOR_OF_KEY_OR_ADDABLE>;
268 static_assert (is_convertible_v<ITEM_T, key_type> or is_convertible_v<ITEM_T, pair<key_type, mapped_type>> or
269 is_convertible_v<ITEM_T, KeyValuePair<key_type, mapped_type>>);
271 for (
auto i = start; i != end; ++i) {
272 if constexpr (is_convertible_v<ITEM_T, key_type>) {
277 else if constexpr (is_convertible_v<ITEM_T, pair<key_type, mapped_type>>) {
278 if (RemoveIf (i->first)) {
282 else if constexpr (is_convertible_v<ITEM_T, KeyValuePair<key_type, mapped_type>>) {
283 if (RemoveIf (i->fKey)) {
293 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
294 template <predicate<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> PREDICATE>
298 for (Iterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> i = this->begin (); i != this->end ();) {
309 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
313 Require (not i.
AtEnd ());
314 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
315 writerRep->Update (patchedIterator, newValue, nextI);
317 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
318 template <IIterableOfTo<KEY_TYPE> ITERABLE_OF_KEY_TYPE>
334 size_t thisSize = this->size ();
337 bool fewerLookupsThanAdds = items.size () <= 2;
338 if (fewerLookupsThanAdds) {
340 auto keyEqualsComparer = this->GetKeyEqualsComparer ();
341 using ITEMS_ITER_TYPE =
decltype (items.begin ());
343 if (find_if<ITEMS_ITER_TYPE> (items.begin (), items.end (),
344 [&] (
const KEY_TYPE& k) { return keyEqualsComparer (i->fKey, k); }) == items.end ()) {
345#if qStroika_Foundation_Debug_AssertionsChecked
346 [[maybe_unused]]
size_t sz = this->size ();
349#if qStroika_Foundation_Debug_AssertionsChecked
350 Assert (this->size () == sz - 1u);
361 Mapping result = Mapping{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()};
363 for (
auto key2Keep : items) {
364 if (
auto l = this->Lookup (key2Keep)) {
365 result.Add (key2Keep, *l);
370 if (thisSize != nAdds) {
374 if constexpr (equality_comparable<MAPPED_VALUE_TYPE>) {
375 Assert (*
this == result);
383 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
384 template <
typename RESULT_CONTAINER, invocable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ELEMENT_MAPPER>
386 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>,
typename RESULT_CONTAINER::value_type> or
387 convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, optional<typename RESULT_CONTAINER::value_type>>)
389 if constexpr (same_as<RESULT_CONTAINER, Mapping>) {
391 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
392 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
395 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper));
398 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
399 template <derived_from<Iterable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>> RESULT_CONTAINER,
typename INCLUDE_PREDICATE>
401 requires (predicate<INCLUDE_PREDICATE, KEY_TYPE> or predicate<INCLUDE_PREDICATE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>)
403 if constexpr (predicate<INCLUDE_PREDICATE, KEY_TYPE>) {
405 return Where<RESULT_CONTAINER> (
409 if constexpr (same_as<RESULT_CONTAINER, Mapping>) {
411 return inherited::template Where<RESULT_CONTAINER> (
412 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
415 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue));
419 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
420 template <
typename CONTAINER_OF_KEYS>
423 return Where ([=] (
const key_type& key) ->
bool {
return includeKeys.Contains (key); });
425 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
429 return inherited::Where ([=] (
const ArgByValueType<value_type>& kvp) {
return ik.Contains (kvp.fKey); },
ArchetypeContainerType{});
431 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
432 template <
typename CONTAINER_OF_Key_T>
435 return As_<CONTAINER_OF_Key_T> ();
437 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
438 template <
typename CONTAINER_OF_Key_T>
441 CONTAINER_OF_Key_T result;
442 for (
const auto& i : *this) {
444 if constexpr (is_convertible_v<typename CONTAINER_OF_Key_T::value_type, pair<KEY_TYPE, MAPPED_VALUE_TYPE>>) {
445 result.
insert (result.end (), pair<KEY_TYPE, MAPPED_VALUE_TYPE>{i.fKey, i.fValue});
453 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
455 const function<
mapped_type (ArgByValueType<mapped_type>, ArgByValueType<mapped_type>)>& f,
458 Add (key, f (LookupValue (key, initialValue), newValue));
460 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
463 Add (kvp.fKey, kvp.fValue);
465 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
470 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
477 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
482 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
483 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
490 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
491 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
492 inline Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>& Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::operator+= (
const ITERABLE_OF_ADDABLE& items)
497 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
498 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
499 inline Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>& Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::operator-= (
const ITERABLE_OF_KEY_OR_ADDABLE& items)
504 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
506 -> tuple<_IRep*, Iterator<value_type>>
508 Require (not i.
AtEnd ());
509 using element_type =
typename inherited::_SharedByValueRepType::element_type;
511 element_type* writableRep = this->_fRep.rwget ([&] (
const element_type& prevRepPtr) ->
typename inherited::_SharedByValueRepType::shared_ptr_type {
512 return Debug::UncheckedDynamicCast<const _IRep&> (prevRepPtr).CloneAndPatchIterator (&patchedIterator);
515 return make_tuple (Debug::UncheckedDynamicCast<_IRep*> (writableRep), move (patchedIterator));
517 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
521 [[maybe_unused]] _SafeReadRepAccessor<_IRep> ignored{
this};
524 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
526 requires (equality_comparable<MAPPED_VALUE_TYPE>)
536 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
537 template <
typename VALUE_EQUALS_COMPARER>
539 : fValueEqualsComparer{valueEqualsComparer}
542 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
543 template <
typename VALUE_EQUALS_COMPARER>
544 bool Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::EqualsComparer<VALUE_EQUALS_COMPARER>::operator() (
const Mapping& lhs,
const Mapping& rhs)
const
549 _SafeReadRepAccessor<_IRep> lhsR{&lhs};
550 _SafeReadRepAccessor<_IRep> rhsR{&rhs};
551 if (&lhsR._ConstGetRep () == &rhsR._ConstGetRep ()) [[unlikely]] {
556 if (lhsR._ConstGetRep ().size () != rhsR._ConstGetRep ().size ()) [[likely]] {
564 auto li = lhsR._ConstGetRep ().MakeIterator ();
565 auto ri = rhs.MakeIterator ();
566 auto keyEqualsComparer = lhs.GetKeyEqualsComparer ();
567 while (not li.AtEnd ()) {
568 Assert (not ri.AtEnd ());
569 bool keysEqual = keyEqualsComparer (li->fKey, ri->fKey);
570 Require (keysEqual == rhs.GetKeyEqualsComparer () (li->fKey, ri->fKey));
573 if (not fValueEqualsComparer (li->fValue, ri->fValue)) {
579 auto o = rhs.Lookup (li->fKey);
580 if (not o.has_value () or not fValueEqualsComparer (*o, li->fValue)) {
584 if (not lhsR._ConstGetRep ().Lookup (ri->fKey, &o) or not fValueEqualsComparer (*o, ri->fValue)) {
592 Assert (ri.AtEnd ());
#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()
A Mapping uniquely associates two elements: a key and a value (use Assocation to allow multiple value...
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).
typename inherited::value_type value_type
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 AtEnd() const
AtEnd () 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)
like the builtin C++ 'throw', but stamps in the current Activity context and does helpful,...
Compare Mappings<>s for equality. Note this can be costly, as the Mappings are not necessarily in the...