3 template <
typename TSelf,
typename TLinksOptions,
typename TMemory,
typename TInternalSourcesTreeMethods,
4 typename TInternalLinksSourcesLinkedListMethods,
typename TInternalTargetsTreeMethods,
5 typename TExternalSourcesTreeMethods,
typename TExternalTargetsTreeMethods,
6 typename TUnusedLinksListMethods,
typename... TBase>
12 using LinkType =
typename LinksOptionsType::LinkType;
15 static constexpr LinksConstants<LinkAddressType>
Constants = LinksOptionsType::Constants;
97 void Init(TMemory& dataMemory, TMemory& indexMemory)
106 if (minimumDataReservedCapacity < dataMemory.UsedCapacity())
108 minimumDataReservedCapacity = dataMemory.UsedCapacity();
115 if (minimumIndexReservedCapacity < indexMemory.UsedCapacity())
117 minimumIndexReservedCapacity = indexMemory.UsedCapacity();
136 if (dataMemory.ReservedCapacity() < minimumDataReservedCapacity)
138 dataMemory.ReservedCapacity(minimumDataReservedCapacity);
140 if (indexMemory.ReservedCapacity() < minimumIndexReservedCapacity)
142 indexMemory.ReservedCapacity(minimumIndexReservedCapacity);
160 if (std::ranges::size(restriction) == 0)
162 return this->
Total();
164 auto index = GetIndex(*
this, restriction);
166 if (std::ranges::size(restriction) == 1)
170 return this->
Total();
174 if (std::ranges::size(restriction) == 2)
177 auto value = restriction[1];
182 return this->
Total();
184 auto externalReferencesRange =
Constants.ExternalReferencesRange;
185 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(value))
215 if ((storedLinkValue.Source == value) || (storedLinkValue.Target == value))
222 if (std::ranges::size(restriction) == 3)
226 auto externalReferencesRange =
Constants.ExternalReferencesRange;
227 auto source = GetSource(*
this, restriction);
228 auto target = GetTarget(*
this, restriction);
231 if ((source == any) && (target == any))
233 return this->
Total();
235 else if (source == any)
237 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(target))
246 else if (target == any)
248 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(source))
268 if (
Constants.IsExternalReferencesRangeEnabled)
270 if (externalReferencesRange.Contains(source) && externalReferencesRange.Contains(target))
274 else if (externalReferencesRange.Contains(source))
278 else if (externalReferencesRange.Contains(target))
323 if ((source == any) && (target == any))
328 if ((source != any) && (target != any))
330 if ((storedLinkValue.Source == source) && (storedLinkValue.Target == target))
345 if ((storedLinkValue.Source == value) || (storedLinkValue.Target == value))
352 throw Platform::Exceptions::NotSupportedException();
381 using namespace Platform::Exceptions;
382 auto length = std::ranges::size(restriction);
389 auto any = constants.Any;
390 auto index = GetIndex(*
this, restriction);
401 auto value = restriction[1];
409 if (value == constants.Null)
411 Each(restriction, [&](
const auto&) {
413 return constants.Continue;
419 Each(
LinkType{index, any, value}, [&](
const auto& link) {
420 if (link[constants.SourcePart] != value)
422 return constants.Continue;
437 if ((storedLinkValue.Source == value) || (storedLinkValue.Target == value))
446 auto externalReferencesRange = constants.ExternalReferencesRange;
447 auto source = GetSource(*
this, restriction);
448 auto target = GetTarget(*
this, restriction);
451 if ((source == any) && (target == any))
455 else if (source == any)
457 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(target))
466 else if (target == any)
468 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(source))
488 if (
Constants.IsExternalReferencesRangeEnabled)
490 if (externalReferencesRange.Contains(source) && externalReferencesRange.Contains(target))
494 else if (externalReferencesRange.Contains(source))
498 else if (externalReferencesRange.Contains(target))
543 if ((source == any) && (target == any))
548 if ((source != any) && (target != any))
550 if ((storedLinkValue.Source == source) && (storedLinkValue.Target == target))
565 if ((storedLinkValue.Source == value) || (storedLinkValue.Target == value))
572 throw Platform::Exceptions::NotSupportedException();
579 using namespace Platform::Exceptions;
581 auto $break = constants.Break;
582 auto length = std::ranges::size(restriction);
594 return constants.Continue;
596 auto $continue = constants.Continue;
597 auto any = constants.Any;
598 auto index = GetIndex(*
this, restriction);
614 auto value = restriction[1];
621 if (value == constants.Null)
625 return link[constants.SourcePart] == value || link[constants.TargetPart] == value
630 if (
Each(
LinkType{index, value, any}, handler) == $break)
634 return Each(
LinkType{index, any, value}, [&](
const auto& link) {
635 return link[constants.SourcePart] == value ? $continue : handler(link);
649 if ((storedLinkValue.Source == value) || (storedLinkValue.Target == value))
660 auto externalReferencesRange = constants.ExternalReferencesRange;
661 auto source = GetSource(*
this, restriction);
662 auto target = GetTarget(*
this, restriction);
665 if ((source == any) && (target == any))
669 else if (source == any)
671 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(target))
680 else if (target == any)
682 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(source))
701 if (
Constants.IsExternalReferencesRangeEnabled)
703 if (externalReferencesRange.Contains(source) && externalReferencesRange.Contains(target))
707 else if (externalReferencesRange.Contains(source))
711 else if (externalReferencesRange.Contains(target))
747 return (linkAddress == constants.Null) ? $continue : handler(
GetLinkStruct(linkAddress));
756 if ((source == any) && (target == any))
761 if ((source != any) && (target != any))
763 if ((storedLinkValue.Source == source) && (storedLinkValue.Target == target))
778 if ((storedLinkValue.Source == value) || (storedLinkValue.Target == value))
785 throw Platform::Exceptions::NotSupportedException();
792 auto $null = constants.Null;
793 auto externalReferencesRange = constants.ExternalReferencesRange;
794 auto linkIndex = GetIndex(*
this, restriction);
797 auto source = link.Source;
798 auto target = link.Target;
805 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(source))
824 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(target))
833 source = link.Source = GetSource(*
this, substitution);
834 target = link.Target = GetTarget(*
this, substitution);
837 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(source))
856 if (
Constants.IsExternalReferencesRangeEnabled && externalReferencesRange.Contains(target))
865 return handler ? handler(before,
LinkType{linkIndex, source, target}) :
Constants.Continue;
870 using namespace Platform::Exceptions;
878 auto maximumPossibleInnerReference =
Constants.InternalReferencesRange.Maximum;
881 throw Platform::Exceptions::LinksLimitReachedException();
901 auto linkAddress = GetIndex(*
this, restriction);
947 return (linkAddress >=
Constants.InternalReferencesRange.Minimum) &&
955 return LinkType{linkIndex, link.Source, link.Target};
Definition RawLinkDataPart.h:38