24 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
26 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE>)
29 _AssertRepValidType ();
31 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
32 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
33 inline Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::Mapping (KEY_EQUALS_COMPARER&& keyEqualsComparer)
34 : inherited{Factory::Mapping_Factory<KEY_TYPE, MAPPED_VALUE_TYPE, remove_cvref_t<KEY_EQUALS_COMPARER>>::Default () (
35 forward<KEY_EQUALS_COMPARER> (keyEqualsComparer))}
37 _AssertRepValidType ();
39 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
41 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE>)
45 _AssertRepValidType ();
47 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
48 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
50 const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
51 : Mapping{forward<KEY_EQUALS_COMPARER> (keyEqualsComparer)}
54 _AssertRepValidType ();
56#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
57 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
58 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
60 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE> and
61 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>>)
64 AddAll (forward<ITERABLE_OF_ADDABLE> (src));
65 _AssertRepValidType ();
68 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
69 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
71 : Mapping{forward<KEY_EQUALS_COMPARER> (keyEqualsComparer)}
73 AddAll (forward<ITERABLE_OF_ADDABLE> (src));
74 _AssertRepValidType ();
76 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
77 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
79 requires (IEqualsComparer<equal_to<KEY_TYPE>, KEY_TYPE>)
82 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (end));
83 _AssertRepValidType ();
85 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
86 template <IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE,
87 sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
89 : Mapping{forward<KEY_EQUALS_COMPARER> (keyEqualsComparer)}
91 AddAll (forward<ITERATOR_OF_ADDABLE> (start), forward<ITERATOR_OF_ADDABLE2> (
end));
92 _AssertRepValidType ();
94 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
99 _AssertRepValidType ();
101 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
105 _AssertRepValidType ();
107 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
108 inline auto Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::GetKeyEqualsComparer () const -> KeyEqualsCompareFunctionType
110 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().GetKeyEqualsComparer ();
112 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
117 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
120 return this->
template Map<Iterable<MAPPED_VALUE_TYPE>> (
123 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
126 if (item ==
nullptr) {
127 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
130 optional<mapped_type> tmp;
131 if (_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, &tmp)) {
138 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
141 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, item);
143 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
146 optional<MAPPED_VALUE_TYPE> r;
147 [[maybe_unused]]
bool result = _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key, &r);
148 Ensure (result == r.has_value ());
149 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
151 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
153 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
156 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
158 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
159 template <
typename THROW_IF_MISSING>
162 if (optional<MAPPED_VALUE_TYPE> r{Lookup (key)}) [[likely]] {
167 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
170 optional<MAPPED_VALUE_TYPE> r{Lookup (key)};
171 return r.has_value () ? *r : defaultValue;
173 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
176 return *Lookup (key);
178 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
181 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key,
nullptr);
183 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
184 template <
typename VALUE_EQUALS_COMPARER>
187 return this->Find ([&valueEqualsComparer, &v] (
const auto& t) {
return valueEqualsComparer (t.fValue, v); }) !=
nullptr;
189 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
192 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (key, newElt, addReplaceMode);
194 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
197 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (p.fKey, p.fValue, addReplaceMode);
199 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
200 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
203 unsigned int cntAdded{};
204 for (
auto i = forward<ITERATOR_OF_ADDABLE> (start); i != forward<ITERATOR_OF_ADDABLE2> (end); ++i) {
205 if (Add (*i, addReplaceMode)) {
211 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
212 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
215 if constexpr (std::is_convertible_v<remove_cvref_t<ITERABLE_OF_ADDABLE>*, Iterable<value_type>*>) {
217 if (
static_cast<const Iterable<value_type>*
> (
this) ==
static_cast<const Iterable<value_type>*
> (&items)) [[unlikely]] {
218 vector<value_type> copy{std::begin (items), Iterator<value_type>{std::end (items)}};
219 return AddAll (std::begin (copy), std::end (copy), addReplaceMode);
222 return AddAll (std::begin (items), std::end (items), addReplaceMode);
224 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
227 Verify (_SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key));
229 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
232 Require (not i.
Done ());
233 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
234 writerRep->Remove (patchedIterator, nextI);
236 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
239 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key);
241 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
244 _SafeReadRepAccessor<_IRep> accessor{
this};
245 if (not accessor._ConstGetRep ().empty ()) {
246 this->_fRep = accessor._ConstGetRep ().CloneEmpty ();
249 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
250 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
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, Common::KeyValuePair<key_type, mapped_type>>);
256 if (
this == &items) {
257 size_t result = this->size ();
262 return RemoveAll (begin (items), end (items));
265 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
266 template <
typename ITERATOR_OF_KEY_OR_ADDABLE>
269 using ITEM_T = ranges::range_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, Common::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, Common::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>
326 for (
auto key2Keep : items) {
327 if (
auto l = this->Lookup (key2Keep)) {
328 result.
Add (key2Keep, *l);
334 using ITEMS_ITER_TYPE =
decltype (items.begin ());
335 set<KEY_TYPE> tmp{items.
begin (), ITEMS_ITER_TYPE{items.end ()}};
337 if (tmp.find (i->fKey) == tmp.end ()) {
338 [[maybe_unused]]
size_t sz = this->size ();
340 Assert (this->size () == sz - 1u);
348 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
349 template <
typename RESULT_CONTAINER, invocable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ELEMENT_MAPPER>
351 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>,
typename RESULT_CONTAINER::value_type> or
352 convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, optional<typename RESULT_CONTAINER::value_type>>)
354 if constexpr (same_as<RESULT_CONTAINER, Mapping>) {
356 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
357 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
360 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper));
363 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
364 template <derived_from<Iterable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>> RESULT_CONTAINER,
typename INCLUDE_PREDICATE>
366 requires (predicate<INCLUDE_PREDICATE, KEY_TYPE> or predicate<INCLUDE_PREDICATE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>)
368 if constexpr (predicate<INCLUDE_PREDICATE, KEY_TYPE>) {
370 return Where<RESULT_CONTAINER> (
371 [=] (
const ArgByValueType<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& kvp) {
return includeIfTrue (kvp.fKey); });
374 if constexpr (same_as<RESULT_CONTAINER, Mapping>) {
376 return inherited::template Where<RESULT_CONTAINER> (
377 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
380 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue));
384 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
385 template <
typename CONTAINER_OF_KEYS>
388 return Where ([=] (
const key_type& key) ->
bool {
return includeKeys.Contains (key); });
390 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
393 Iterable<key_type> ik{includeKeys};
394 return inherited::Where ([=] (
const ArgByValueType<value_type>& kvp) {
return ik.Contains (kvp.fKey); }, ArchetypeContainerType{});
396 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
397 template <
typename CONTAINER_OF_Key_T>
400 return As_<CONTAINER_OF_Key_T> ();
402 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
403 template <
typename CONTAINER_OF_Key_T>
406 CONTAINER_OF_Key_T result;
407 for (
const auto& i : *this) {
409 if constexpr (is_convertible_v<typename CONTAINER_OF_Key_T::value_type, pair<KEY_TYPE, MAPPED_VALUE_TYPE>>) {
410 result.
insert (result.end (), pair<KEY_TYPE, MAPPED_VALUE_TYPE>{i.fKey, i.fValue});
413 result.insert (result.end (), value_type{i.fKey, i.fValue});
418 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
420 const function<
mapped_type (ArgByValueType<mapped_type>, ArgByValueType<mapped_type>)>& f,
423 Add (key, f (LookupValue (key, initialValue), newValue));
425 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
428 Add (kvp.fKey, kvp.fValue);
430 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
435 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
442 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
447 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
448 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
455 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
456 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
457 inline Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>& Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::operator+= (
const ITERABLE_OF_ADDABLE& items)
462 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
463 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
469 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
471 -> tuple<_IRep*, Iterator<value_type>>
473 Require (not i.
Done ());
474 using element_type =
typename inherited::_SharedByValueRepType::element_type;
476 element_type* writableRep = this->_fRep.rwget ([&] (
const element_type& prevRepPtr) ->
typename inherited::_SharedByValueRepType::shared_ptr_type {
477 return Debug::UncheckedDynamicCast<const _IRep&> (prevRepPtr).CloneAndPatchIterator (&patchedIterator);
480 return make_tuple (Debug::UncheckedDynamicCast<_IRep*> (writableRep), move (patchedIterator));
482 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
486 [[maybe_unused]] _SafeReadRepAccessor<_IRep> ignored{
this};
489 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
491 requires (equality_comparable<MAPPED_VALUE_TYPE>)
501 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
502 template <
typename VALUE_EQUALS_COMPARER>
504 : fValueEqualsComparer{valueEqualsComparer}
507 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
508 template <
typename VALUE_EQUALS_COMPARER>
509 bool Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::EqualsComparer<VALUE_EQUALS_COMPARER>::operator() (
const Mapping& lhs,
const Mapping& rhs)
const
514 _SafeReadRepAccessor<_IRep> lhsR{&lhs};
515 _SafeReadRepAccessor<_IRep> rhsR{&rhs};
516 if (&lhsR._ConstGetRep () == &rhsR._ConstGetRep ()) [[unlikely]] {
521 if (lhsR._ConstGetRep ().size () != rhsR._ConstGetRep ().size ()) [[likely]] {
529 auto li = lhsR._ConstGetRep ().MakeIterator ();
530 auto ri = rhs.MakeIterator ();
531 auto keyEqualsComparer = lhs.GetKeyEqualsComparer ();
532 while (not li.Done ()) {
533 Assert (not ri.Done ());
534 bool keysEqual = keyEqualsComparer (li->fKey, ri->fKey);
535 Require (keysEqual == rhs.GetKeyEqualsComparer () (li->fKey, ri->fKey));
538 if (not fValueEqualsComparer (li->fValue, ri->fValue)) {
544 auto o = rhs.Lookup (li->fKey);
545 if (not o.has_value () or not fValueEqualsComparer (*o, li->fValue)) {
549 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.
nonvirtual Iterator< T > begin() const
Support for ranged for, and STL syntax in general.
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...