4#ifndef _Stroika_Foundation_Containers_Bijection_h_
5#define _Stroika_Foundation_Containers_Bijection_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
11#include "Stroika/Foundation/Common/Common.h"
13#include "Stroika/Foundation/Common/Concepts.h"
14#include "Stroika/Foundation/Common/KeyValuePair.h"
15#include "Stroika/Foundation/Containers/Common.h"
16#include "Stroika/Foundation/DataExchange/ValidationStrategy.h"
17#include "Stroika/Foundation/Execution/Exceptions.h"
40 using Common::IEqualsComparer;
41 using Common::KeyValuePair;
42 using Traversal::IInputIterator;
43 using Traversal::IIterableOfTo;
44 using Traversal::Iterable;
45 using Traversal::Iterator;
47 class Bijection_Base {
49 class InjectivityViolation :
public Execution::RuntimeErrorException<> {
51 using inherited = Execution::RuntimeErrorException<>;
54 InjectivityViolation ();
102 template <
typename DOMAIN_TYPE,
typename RANGE_TYPE>
164 template <IEqualsComparer<DOMAIN_TYPE> DOMAIN_EQUALS_COMPARER, IEqualsComparer<RANGE_TYPE> RANGE_EQUALS_COMPARER>
166 template <IEqualsComparer<DOMAIN_TYPE> DOMAIN_EQUALS_COMPARER, IEqualsComparer<RANGE_TYPE> RANGE_EQUALS_COMPARER>
178#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
182 _AssertRepValidType ();
186 template <IEqualsComparer<DOMAIN_TYPE> DOMAIN_EQUALS_COMPARER, IEqualsComparer<RANGE_TYPE> RANGE_EQUALS_COMPARER, IIterableOfTo<KeyValuePair<DOMAIN_TYPE, RANGE_TYPE>> ITERABLE_OF_ADDABLE>
188 template <IInputIterator<KeyValuePair<DOMAIN_TYPE, RANGE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
191 template <IEqualsComparer<DOMAIN_TYPE> DOMAIN_EQUALS_COMPARER, IEqualsComparer<RANGE_TYPE> RANGE_EQUALS_COMPARER,
192 IInputIterator<KeyValuePair<DOMAIN_TYPE, RANGE_TYPE>> ITERATOR_OF_ADDABLE, sentinel_for<remove_cvref_t<ITERATOR_OF_ADDABLE>> ITERATOR_OF_ADDABLE2>
198 explicit Bijection (
const shared_ptr<_IRep>&
src)
noexcept;
266 nonvirtual Iterable<RangeType>
Image ()
const;
391 nonvirtual
void Add (ArgByValueType<DomainType>
key, ArgByValueType<RangeType> newElt);
492 nonvirtual
void clear ();
546 nonvirtual
void _AssertRepValidType ()
const;
566 template <
typename DOMAIN_TYPE,
typename RANGE_TYPE>
575 virtual ~_IRep () =
default;
578 virtual shared_ptr<_IRep> CloneEmpty ()
const = 0;
580 virtual bool Equals (
const _IRep&
rhs)
const = 0;
600 nonvirtual
bool _Equals_Reference_Implementation (
const _IRep&
rhs)
const;
610#include "Bijection.inl"
Implementation detail for Bijection<T> implementors.
Bijection allows for the bijective (1-1) association of two elements.
nonvirtual void RemoveDomainElement(ArgByValueType< DomainType > d)
Common::ComparisonRelationDeclaration< Common::ComparisonRelationType::eEquals, function< bool(ArgByValueType< DomainType >, ArgByValueType< DomainType >)> > DomainEqualsCompareFunctionType
nonvirtual void RemoveAll()
RemoveAll removes all, or all matching (predicate, iterator range, equals comparer or whatever) items...
nonvirtual Iterable< DomainType > MapToDomain(const Iterable< RangeType > &values) const
nonvirtual Iterator< value_type > erase(const Iterator< value_type > &i)
STL-ish alias for Remove ().
nonvirtual void RemoveRangeElement(ArgByValueType< RangeType > r)
nonvirtual Bijection WhereDomainIntersects(const Iterable< DomainType > &domainValues) const
nonvirtual void Remove(const Iterator< value_type > &i, Iterator< value_type > *nextI=nullptr)
Common::ComparisonRelationDeclaration< Common::ComparisonRelationType::eEquals, function< bool(RangeType, RangeType)> > RangeEqualsCompareFunctionType
nonvirtual Bijection WhereRangeIntersects(const Iterable< RangeType > &rangeValues) const
nonvirtual CONTAINER_PAIR_RANGE_DOMAIN As() const
nonvirtual Iterable< DomainType > Preimage() const
nonvirtual void Add(ArgByValueType< DomainType > key, ArgByValueType< RangeType > newElt)
nonvirtual RESULT_CONTAINER Where(INCLUDE_PREDICATE &&includeIfTrue) const
Like Iterable<T>::Where, but returning a bijection - subset of this bijection where includeIfTrue is ...
nonvirtual optional< DomainType > InverseLookup(ArgByValueType< RangeType > key) const
nonvirtual RESULT_CONTAINER Map(ELEMENT_MAPPER &&elementMapper) const
'override' Iterable<>::Map () function so RESULT_CONTAINER defaults to Bijection, and improve that ca...
typename inherited::value_type value_type
nonvirtual Iterable< RangeType > MapToRange(const Iterable< DomainType > &values) const
nonvirtual DomainType InverseLookupValue(ArgByValueType< RangeType > key, ArgByValueType< DomainType > defaultValue=DomainType()) const
nonvirtual optional< RangeType > Lookup(ArgByValueType< DomainType > key) const
nonvirtual bool ContainsRangeElement(ArgByValueType< RangeType > v) const
nonvirtual Iterable< RangeType > Image() const
nonvirtual RangeType LookupValue(ArgByValueType< DomainType > key, ArgByValueType< RangeType > defaultValue=RangeType()) const
nonvirtual bool ContainsDomainElement(ArgByValueType< DomainType > key) const
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 void AddAll(const CONTAINER_OF_KEYVALUE &items)
Implementation detail for iterator implementors.
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
T value_type
value_type is an alias for the type iterated over - like vector<T>::value_type
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....
conditional_t<(sizeof(CHECK_T)<=2 *sizeof(void *)) and is_trivially_copyable_v< CHECK_T >, CHECK_T, const CHECK_T & > ArgByValueType
This is an alias for 'T' - but how we want to pass it on stack as formal parameter.