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 Association<KEY_TYPE, MAPPED_VALUE_TYPE>::Association (KEY_EQUALS_COMPARER&& keyEqualsComparer)
34 : inherited{Factory::Association_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 : Association{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>, Association<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 : Association{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 : Association{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 Association<KEY_TYPE, MAPPED_VALUE_TYPE>::GetKeyEqualsComparer () const -> KeyEqualsCompareFunctionType
110 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().GetKeyEqualsComparer ();
112 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
115 return this->
template Map<Iterable<KEY_TYPE>> ([] (
const auto& kvp) {
return kvp.fKey; });
117 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
120 return this->
template Map<Iterable<MAPPED_VALUE_TYPE>> ([] (
const auto& kvp) {
return kvp.fValue; });
122 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
125 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key);
127 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
130 auto tmp = Lookup (key);
131 if (
auto i = tmp.begin ()) [[likely]] {
136 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
137 template <
typename THROW_IF_MISSING>
139 const THROW_IF_MISSING& throwIfMissing)
const
141 auto tmp = Lookup (key);
142 if (
auto i = tmp.begin ()) [[likely]] {
147 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
149 ArgByValueType<mapped_type> defaultValue)
const
151 auto tmp = Lookup (key);
152 if (
auto i = tmp.begin ()) [[likely]] {
157 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
162 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
165 return not _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key).empty ();
167 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
170 return _SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().Lookup (key).size ();
172 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
173 template <Common::IEqualsComparer<MAPPED_VALUE_TYPE> VALUE_EQUALS_COMPARER>
175 const VALUE_EQUALS_COMPARER& valueEqualsComparer)
const
177 return this->Find ([&valueEqualsComparer, &v] (
const auto& t) {
return valueEqualsComparer (t.fValue, v); }) !=
nullptr;
179 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
182 _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (key, newElt);
184 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
187 _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().Add (p.fKey, p.fValue);
189 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
190 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
193 for (
auto i = forward<ITERATOR_OF_ADDABLE> (start); i != forward<ITERATOR_OF_ADDABLE2> (end); ++i) {
197 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
198 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
201 if constexpr (std::is_convertible_v<remove_cvref_t<ITERABLE_OF_ADDABLE>*, Iterable<value_type>*>) {
203 if (
static_cast<const Iterable<value_type>*
> (
this) ==
static_cast<const Iterable<value_type>*
> (&items)) [[unlikely]] {
204 vector<value_type> copy{std::begin (items), Iterator<value_type>{std::end (items)}};
205 AddAll (std::begin (copy), std::end (copy));
209 AddAll (std::begin (items), std::end (items));
211 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
214 Verify (_SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key));
216 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
219 Require (not i.
Done ());
220 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
221 writerRep->Remove (patchedIterator, nextI);
223 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
226 return _SafeReadWriteRepAccessor<_IRep>{
this}._GetWriteableRep ().RemoveIf (key);
228 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
231 _SafeReadRepAccessor<_IRep> tmp{
this};
232 if (not tmp._ConstGetRep ().empty ()) {
233 this->_fRep = tmp._ConstGetRep ().CloneEmpty ();
236 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
237 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
240 using ITEM_T = ranges::range_value_t<ITERABLE_OF_KEY_OR_ADDABLE>;
241 static_assert (is_convertible_v<ITEM_T, key_type> or is_convertible_v<ITEM_T, pair<key_type, mapped_type>> or
242 is_convertible_v<ITEM_T, Common::KeyValuePair<key_type, mapped_type>>);
243 if (
this == &items) {
244 size_t result = this->size ();
249 return RemoveAll (begin (items), end (items));
252 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
253 template <
typename ITERATOR_OF_KEY_OR_ADDABLE>
256 using ITEM_T = ranges::range_value_t<ITERATOR_OF_KEY_OR_ADDABLE>;
257 static_assert (is_convertible_v<ITEM_T, key_type> or is_convertible_v<ITEM_T, pair<key_type, mapped_type>> or
258 is_convertible_v<ITEM_T, Common::KeyValuePair<key_type, mapped_type>>);
260 for (
auto i = start; i != end; ++i) {
261 if constexpr (is_convertible_v<ITEM_T, key_type>) {
266 else if constexpr (is_convertible_v<ITEM_T, pair<key_type, mapped_type>>) {
267 if (RemoveIf (i->first)) {
271 else if constexpr (is_convertible_v<ITEM_T, Common::KeyValuePair<key_type, mapped_type>>) {
272 if (RemoveIf (i->fKey)) {
282 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
283 template <predicate<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> PREDICATE>
287 for (Iterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> i = this->begin (); i != this->end ();) {
298 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
302 Require (not i.
Done ());
303 auto [writerRep, patchedIterator] = _GetWritableRepAndPatchAssociatedIterator (i);
304 writerRep->Update (patchedIterator, newValue, nextI);
306 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
307 template <IIterableOfTo<KEY_TYPE> ITERABLE_OF_KEY_TYPE>
310 static_assert (is_convertible_v<ranges::range_value_t<ITERABLE_OF_KEY_TYPE>, key_type>);
314 for (
auto key2Keep : items) {
315 if (
auto l = this->Lookup (key2Keep)) {
316 result.
Add (key2Keep, *l);
322 using SET_ITER_T =
decltype (items.begin ());
323 set<KEY_TYPE> tmp{items.
begin (), SET_ITER_T{items.end ()}};
324 for (Iterator<value_type> i = this->begin (); i != this->end ();) {
325 if (tmp.find (i->fKey) == tmp.end ()) {
326 [[maybe_unused]]
size_t sz = this->size ();
328 Assert (this->size () == sz - 1u);
336 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
337 template <
typename RESULT_CONTAINER, invocable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ELEMENT_MAPPER>
339 requires (convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>,
typename RESULT_CONTAINER::value_type> or
340 convertible_to<invoke_result_t<ELEMENT_MAPPER, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>, optional<typename RESULT_CONTAINER::value_type>>)
342 if constexpr (same_as<RESULT_CONTAINER, Association>) {
344 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper),
345 RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
348 return inherited::template Map<RESULT_CONTAINER> (forward<ELEMENT_MAPPER> (elementMapper));
351 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
352 template <derived_from<Iterable<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>> RESULT_CONTAINER,
typename INCLUDE_PREDICATE>
354 requires (predicate<INCLUDE_PREDICATE, KEY_TYPE> or predicate<INCLUDE_PREDICATE, KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>)
356 if constexpr (predicate<INCLUDE_PREDICATE, KEY_TYPE>) {
358 return Where<RESULT_CONTAINER> (
362 if constexpr (same_as<RESULT_CONTAINER, Association>) {
364 return inherited::template Where<RESULT_CONTAINER> (
365 forward<INCLUDE_PREDICATE> (includeIfTrue), RESULT_CONTAINER{_SafeReadRepAccessor<_IRep>{
this}._ConstGetRep ().CloneEmpty ()});
368 return inherited::template Where<RESULT_CONTAINER> (forward<INCLUDE_PREDICATE> (includeIfTrue));
372 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
373 template <
typename CONTAINER_OF_KEYS>
376 return Where ([=] (
const key_type& key) ->
bool {
return includeKeys.Contains (key); });
378 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
381 Iterable<key_type> ik{includeKeys};
382 return inherited::Where ([=] (
const ArgByValueType<value_type>& kvp) {
return ik.Contains (kvp.fKey); }, ArchetypeContainerType{});
384 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
385 template <
typename CONTAINER_OF_Key_T>
388 CONTAINER_OF_Key_T result;
389 for (
const auto& i : *this) {
390 if constexpr (is_convertible_v<typename CONTAINER_OF_Key_T::value_type, pair<KEY_TYPE, MAPPED_VALUE_TYPE>>) {
392 result.insert (result.end (), pair<KEY_TYPE, MAPPED_VALUE_TYPE>{i.fKey, i.fValue});
395 result.insert (result.end (), value_type{i.fKey, i.fValue});
400 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
403 const function<
mapped_type (ArgByValueType<mapped_type>, ArgByValueType<mapped_type>)>& f,
406 Add (key, f (LookupValue (key, initialValue), newValue));
408 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
413 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
420 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
425 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
426 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
433 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
434 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
435 inline Association<KEY_TYPE, MAPPED_VALUE_TYPE>& Association<KEY_TYPE, MAPPED_VALUE_TYPE>::operator+= (
const ITERABLE_OF_ADDABLE& items)
440 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
441 template <
typename ITERABLE_OF_KEY_OR_ADDABLE>
442 inline Association<KEY_TYPE, MAPPED_VALUE_TYPE>& Association<KEY_TYPE, MAPPED_VALUE_TYPE>::operator-= (
const ITERABLE_OF_KEY_OR_ADDABLE& items)
447 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
449 -> tuple<_IRep*, Iterator<value_type>>
451 Require (not i.
Done ());
452 using element_type =
typename inherited::_SharedByValueRepType::element_type;
454 element_type* writableRep = this->_fRep.rwget ([&] (
const element_type& prevRepPtr) ->
typename inherited::_SharedByValueRepType::shared_ptr_type {
455 return Debug::UncheckedDynamicCast<const _IRep&> (prevRepPtr).CloneAndPatchIterator (&patchedIterator);
458 return make_tuple (Debug::UncheckedDynamicCast<_IRep*> (writableRep), move (patchedIterator));
460 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
464 [[maybe_unused]] _SafeReadRepAccessor<_IRep> ignored{
this};
467 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
469 requires (equality_comparable<MAPPED_VALUE_TYPE>)
479 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
480 template <qCompilerAndStdLib_Constra
intDiffersInTemplateRedeclaration_BWA (Common::IEqualsComparer<MAPPED_VALUE_TYPE>) VALUE_EQUALS_COMPARER>
482 : fValueEqualsComparer{valueEqualsComparer}
485 template <
typename KEY_TYPE,
typename MAPPED_VALUE_TYPE>
486 template <qCompilerAndStdLib_Constra
intDiffersInTemplateRedeclaration_BWA (Common::IEqualsComparer<MAPPED_VALUE_TYPE>) VALUE_EQUALS_COMPARER>
487 bool Association<KEY_TYPE, MAPPED_VALUE_TYPE>::EqualsComparer<VALUE_EQUALS_COMPARER>::operator() (
const Association& lhs,
const Association& rhs)
const
492 _SafeReadRepAccessor<_IRep> lhsR{&lhs};
493 _SafeReadRepAccessor<_IRep> rhsR{&rhs};
494 if (&lhsR._ConstGetRep () == &rhsR._ConstGetRep ()) {
499 if (lhsR._ConstGetRep ().size () != rhsR._ConstGetRep ().size ()) {
507 auto quickEqualsTest = [&] () ->
bool {
508 auto li = lhsR._ConstGetRep ().MakeIterator ();
509 auto ri = rhs.MakeIterator ();
510 auto keyEqualsComparer = lhs.GetKeyEqualsComparer ();
511 while (not li.Done ()) {
512 Assert (not ri.Done ());
513 bool keysEqual = keyEqualsComparer (li->fKey, ri->fKey);
514 Require (keysEqual == rhs.GetKeyEqualsComparer () (li->fKey, ri->fKey));
515 if (not keysEqual or not fValueEqualsComparer (li->fValue, ri->fValue)) {
525 if (quickEqualsTest ()) {
530 auto keyEqualsComparer = lhs.GetKeyEqualsComparer ();
532 return keyEqualsComparer (lhs.fKey, rhs.fKey) and fValueEqualsComparer (lhs.fKey, rhs.fKey);
#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()
An Association pairs key values with (possibly multiple or none) mapped_type values....
nonvirtual CONTAINER_OF_Key_T As() const
nonvirtual optional< mapped_type > LookupOne(ArgByValueType< key_type > key) const
Lookup and return the first (maybe arbitrarily chosen which is first) value with this key,...
nonvirtual bool RemoveIf(ArgByValueType< key_type > key)
Remove the given item, if it exists. Return true if found and removed.
nonvirtual void Remove(ArgByValueType< key_type > key)
Remove the given item (which must exist).
nonvirtual void clear()
STL-ish alias for RemoveAll ().
nonvirtual void Update(const Iterator< value_type > &i, ArgByValueType< mapped_type > newValue, Iterator< value_type > *nextI=nullptr)
MAPPED_VALUE_TYPE mapped_type
nonvirtual size_t OccurrencesOf(ArgByValueType< key_type > item) const
nonvirtual bool ContainsKey(ArgByValueType< key_type > key) const
nonvirtual void RetainAll(const ITERABLE_OF_KEY_TYPE &items)
nonvirtual void Add(ArgByValueType< key_type > key, ArgByValueType< mapped_type > newElt)
nonvirtual void erase(ArgByValueType< key_type > key)
STL-ish alias for Remove ().
nonvirtual RESULT_CONTAINER Where(INCLUDE_PREDICATE &&includeIfTrue) const
nonvirtual void AddAll(ITERABLE_OF_ADDABLE &&items)
nonvirtual Traversal::Iterable< mapped_type > Lookup(ArgByValueType< key_type > key) const
Return an Iterable<mapped_type> of all the associated items (can be empty if none)....
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< key_type > Keys() const
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 mapped_type LookupOneChecked(ArgByValueType< key_type > key, const THROW_IF_MISSING &throwIfMissing) const
Lookup and return the first (maybe arbitrarily chosen which is first) value with this key,...
nonvirtual bool operator==(const Association &rhs) const
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to Association,...
nonvirtual mapped_type LookupOneValue(ArgByValueType< key_type > key, ArgByValueType< mapped_type > defaultValue=mapped_type{}) const
Lookup and return the first (maybe arbitrarily chosen which is first) value with this key,...
nonvirtual const Iterable< mapped_type > operator[](ArgByValueType< key_type > key) const
Shortcut for Lookup.
nonvirtual ArchetypeContainerType WithKeys(const CONTAINER_OF_KEYS &includeKeys) const
nonvirtual bool ContainsMappedValue(ArgByValueType< mapped_type > v, const VALUE_EQUALS_COMPARER &valueEqualsComparer={}) const
nonvirtual Iterable< mapped_type > MappedValues() const
nonvirtual void RemoveAll()
RemoveAll removes all, or all matching (predicate, iterator range, equals comparer or whatever) 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....
constexpr Common::ComparisonRelationDeclaration< ComparisonRelationType::eEquals, remove_cvref_t< FUNCTOR > > DeclareEqualsComparer(FUNCTOR &&f)
DeclareEqualsComparer () marks a FUNCTOR (lambda or not) as being a FUNCTOR which compares for equali...
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...
Compare Associations<>s for equality.