Skip to content

Commit

Permalink
Merge pull request #378 from nassipkali/main
Browse files Browse the repository at this point in the history
Tests added to Recursionless tree
  • Loading branch information
Konard committed Jun 7, 2023
2 parents 59616d9 + 592a844 commit 1e43096
Show file tree
Hide file tree
Showing 12 changed files with 1,098 additions and 665 deletions.
261 changes: 194 additions & 67 deletions cpp/Platform.Data.Doublets.Tests/Dynamic/GenericLinksTests.cpp

Large diffs are not rendered by default.

Large diffs are not rendered by default.

244 changes: 182 additions & 62 deletions cpp/Platform.Data.Doublets.Tests/Static/GenericLinksTests.cpp

Large diffs are not rendered by default.

262 changes: 132 additions & 130 deletions cpp/Platform.Data.Doublets.Tests/Static/SplitMemoryGenericLinksTests.cpp

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,76 +1,68 @@
namespace Platform::Data::Doublets::Memory::United::Generic
{
template<std::integral TLinkAddress, LinksConstants<TLinkAddress> VConstants>
class LinksRecursionlessSizeBalancedTreeMethodsBase : public RecursionlessSizeBalancedTreeMethods<TLinkAddress>, ILinksTreeMethods<TLinkAddress>

template<typename Self, typename TLinksOptions>
struct LinksRecursionlessSizeBalancedTreeMethodsBase : public Platform::Collections::Methods::Trees::RecursionlessSizeBalancedTreeMethods<Self, typename TLinksOptions::LinkAddressType>
{
public: static constexpr Constants = VConstants;
public: static constexpr TLinkAddress Break = Constants.Break;
public: static constexpr TLinkAddress Continue = Constants.Continue;
public: std::byte* Storage;
public: std::byte* Header;
using LinksOptionsType = TLinksOptions;
using LinkAddressType = typename LinksOptionsType::LinkAddressType;
using LinkType = typename LinksOptionsType::LinkType;
using ReadHandlerType = typename LinksOptionsType::ReadHandlerType;
static constexpr LinksConstants<LinkAddressType> Constants = LinksOptionsType::Constants;


public: using methods = Platform::Collections::Methods::Trees::RecursionlessSizeBalancedTreeMethods<Self, LinkAddressType>;

public: std::byte* const Links;
public: std::byte* const Header;

public: LinksRecursionlessSizeBalancedTreeMethodsBase(std::byte* storage, std::byte* header)
{
Storage = storage;
Header = header;
}
: Links(storage), Header(header) {}

public: TLinkAddress GetTreeRoot()
{
return thls->object()->GetTreeRoot();
};
public: LinkAddressType GetTreeRoot() { return this->object().GetTreeRoot(); }

public: TLinkAddress GetBasePartValue(TLinkAddress link)
{
return thls->object()->GetBasePartValue(link);
};
public: LinkAddressType GetBasePartValue(LinkAddressType linkAddress) { return this->object().GetBasePartValue(linkAddress); }

public: bool FirstIsToTheRightOfSecond(TLinkAddress source, TLinkAddress target, TLinkAddress rootSource, TLinkAddress rootTarget)
{
return thls->object()->FirstIsToTheRightOfSecond(source, target, rootSource, rootTarget);
};
public: bool FirstIsToTheRightOfSecond(LinkAddressType source, LinkAddressType target, LinkAddressType rootSource, LinkAddressType rootTarget) { return this->object().FirstIsToTheRightOfSecond(source, target, rootSource, rootTarget); }

public: bool FirstIsToTheLeftOfSecond(TLinkAddress source, TLinkAddress target, TLinkAddress rootSource, TLinkAddress rootTarget)
{
return thls->object()->FirstIsToTheLeftOfSecond(source, target, rootSource, rootTarget);
};
public: bool FirstIsToTheLeftOfSecond(LinkAddressType source, LinkAddressType target, LinkAddressType rootSource, LinkAddressType rootTarget) { return this->object().FirstIsToTheLeftOfSecond(source, target, rootSource, rootTarget); }

public: auto& GetHeaderReference() { return *reinterpret_cast<LinksHeader<LinkAddressType>*>(Header); }
public: auto& GetHeaderReference() { return *reinterpret_cast<LinksHeader<LinkAddressType>*>(Header); }

public: auto& GetLinkReference(LinkAddressType linkAddress) { return *(reinterpret_cast<RawLink<LinkAddressType>*>(Links) + linkAddress); }

public: Link<LinkAddressType> GetLinkValues(LinkAddressType linkIndex)
{
auto& link = GetLinkReference(linkIndex);
return Link{linkIndex, link.Source, link.Target};
}
public: LinkType GetLinkValues(LinkAddressType linkIndex)
{
auto& link = GetLinkReference(linkIndex);
return LinkType{linkIndex, link.Source, link.Target};
}

public: bool FirstIsToTheLeftOfSecond(TLinkAddress first, TLinkAddress second)
public: bool FirstIsToTheLeftOfSecond(LinkAddressType first, LinkAddressType second)
{
auto& firstLink = this->GetLinkReference(first);
auto& secondLink = this->GetLinkReference(second);
return this->FirstIsToTheLeftOfSecond(firstLink.Source, firstLink.Target, secondLink.Source, secondLink.Target);
}

public: bool FirstIsToTheRightOfSecond(TLinkAddress first, TLinkAddress second)
public: bool FirstIsToTheRightOfSecond(LinkAddressType first, LinkAddressType second)
{
auto& firstLink = this->GetLinkReference(first);
auto& secondLink = this->GetLinkReference(second);
return this->FirstIsToTheRightOfSecond(firstLink.Source, firstLink.Target, secondLink.Source, secondLink.Target);
}

public: TLinkAddress this[TLinkAddress index]
auto operator[](std::size_t index)
{
auto root = GetTreeRoot();
if (index >= GetSize(root))
if (index >= this->object.GetSize(root))
{
return 0;
}
while (root != 0)
{
auto left = GetLeftOrDefault(root);
auto leftSize = GetSizeOrZero(left);
if (index <= leftSize)
if (index < leftSize)
{
root = left;
continue;
Expand All @@ -85,7 +77,7 @@
return 0;
}

public: TLinkAddress Search(TLinkAddress source, TLinkAddress target)
public: LinkAddressType Search(LinkAddressType source, LinkAddressType target)
{
auto root = this->GetTreeRoot();
while (root != 0)
Expand All @@ -109,15 +101,15 @@
return 0;
}

public: TLinkAddress CountUsages(TLinkAddress link)
public: LinkAddressType CountUsages(LinkAddressType linkAddress)
{
auto root = this->GetTreeRoot();
auto total = this->GetSize(root);
auto total = this->object().GetSize(root);
auto totalRightIgnore = 0;
while (root != 0)
{
auto base = this->GetBasePartValue(root);
if (base <= link)
if (base <= linkAddress)
{
root = this->GetRightOrDefault(root);
}
Expand All @@ -132,7 +124,7 @@
while (root != 0)
{
auto base = this->GetBasePartValue(root);
if (base >= link)
if (base >= linkAddress)
{
root = this->GetLeftOrDefault(root);
}
Expand All @@ -142,50 +134,52 @@
root = this->GetRightOrDefault(root);
}
}
return (total - totalRightIgnore) - totalLeftIgnore;
return total - totalRightIgnore - totalLeftIgnore;
}

public: TLinkAddress EachUsage(TLinkAddress base, Func<IList<TLinkAddress>, TLinkAddress> handler) { return this->EachUsageCore(base, this->GetTreeRoot(), handler); }
public: LinkAddressType EachUsage(LinkAddressType base, const ReadHandlerType& handler) { return this->EachUsageCore(base, this->GetTreeRoot(), handler); }

private: TLinkAddress EachUsageCore(TLinkAddress base, TLinkAddress link, Func<IList<TLinkAddress>, TLinkAddress> handler)
private: LinkAddressType EachUsageCore(LinkAddressType base, LinkAddressType linkAddress, const ReadHandlerType& handler)
{
auto continue = Continue;
if (link == 0)
auto $continue = Constants.Continue;
auto $break = Constants.Break;

if (linkAddress == 0)
{
return continue;
return $continue;
}
auto linkBasePart = this->GetBasePartValue(link);
auto break = Break;
auto linkBasePart = this->GetBasePartValue(linkAddress);
if (linkBasePart > (base))
{
if ((this->EachUsageCore(base,this->GetLeftOrDefault(link), handler) == Break))
if ((this->EachUsageCore(base, this->GetLeftOrDefault(linkAddress), handler) == $break))
{
return break;
return $break;
}
}
else if (linkBasePart < base)
{
if ((this->EachUsageCore(base,this->GetRightOrDefault(link), handler) == Break))
if ((this->EachUsageCore(base, this->GetRightOrDefault(linkAddress), handler) == $break))
{
return break;
return $break;
}
}
else
{
if (handler(this->GetLinkValues(link)) == (break))
auto link = this->GetLinkValues(linkAddress);
if (handler(link) == ($break))
{
return break;
return $break;
}
if ((this->EachUsageCore(base,this->GetLeftOrDefault(link), handler) == Break))
if ((this->EachUsageCore(base, this->GetLeftOrDefault(linkAddress), handler) == $break))
{
return break;
return $break;
}
if ((this->EachUsageCore(base,this->GetRightOrDefault(link), handler) == Break))
if ((this->EachUsageCore(base, this->GetRightOrDefault(linkAddress), handler) == $break))
{
return break;
return $break;
}
}
return continue;
return $continue;
}
};
}
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,7 @@
{

template<typename Self, typename TLinksOptions>
struct LinksSizeBalancedTreeMethodsBase
:
//public Trees::SizeBalancedTreeMethods<Self, LinkAddressType>,
public Platform::Collections::Methods::Trees::RecursionlessSizeBalancedTreeMethods<Self, typename TLinksOptions::LinkAddressType>
/* public ILinksTreeMethods<TLinksOptions>, */
struct LinksSizeBalancedTreeMethodsBase : public Platform::Collections::Methods::Trees::SizeBalancedTreeMethods<Self, typename TLinksOptions::LinkAddressType>
{
using LinksOptionsType = TLinksOptions;
using LinkAddressType = typename LinksOptionsType::LinkAddressType;
Expand All @@ -15,22 +11,14 @@
static constexpr LinksConstants<LinkAddressType> Constants = LinksOptionsType::Constants;


public: using methods = Platform::Collections::Methods::Trees::RecursionlessSizeBalancedTreeMethods<Self, LinkAddressType>;
public: using methods = Platform::Collections::Methods::Trees::SizeBalancedTreeMethods<Self, LinkAddressType>;

public: std::byte* const Links;
public: std::byte* const Header;

public: LinksSizeBalancedTreeMethodsBase(std::byte* storage, std::byte* header)
: Links(storage), Header(header) {}

public: LinkAddressType GetTreeRoot() { return this->object().GetTreeRoot(); }

public: LinkAddressType GetBasePartValue(LinkAddressType linkAddress) { return this->object().GetBasePartValue(linkAddress); }

public: bool FirstIsToTheRightOfSecond(LinkAddressType source, LinkAddressType target, LinkAddressType rootSource, LinkAddressType rootTarget) { return this->object().FirstIsToTheRightOfSecond(source, target, rootSource, rootTarget); }

public: bool FirstIsToTheLeftOfSecond(LinkAddressType source, LinkAddressType target, LinkAddressType rootSource, LinkAddressType rootTarget) { return this->object().FirstIsToTheLeftOfSecond(source, target, rootSource, rootTarget); }

public: auto& GetHeaderReference() { return *reinterpret_cast<LinksHeader<LinkAddressType>*>(Header); }

public: auto& GetLinkReference(LinkAddressType linkAddress) { return *(reinterpret_cast<RawLink<LinkAddressType>*>(Links) + linkAddress); }
Expand All @@ -45,20 +33,20 @@
{
auto& firstLink = this->GetLinkReference(first);
auto& secondLink = this->GetLinkReference(second);
return this->FirstIsToTheLeftOfSecond(firstLink.Source, firstLink.Target, secondLink.Source, secondLink.Target);
return this->object().FirstIsToTheLeftOfSecond(firstLink.Source, firstLink.Target, secondLink.Source, secondLink.Target);
}

public: bool FirstIsToTheRightOfSecond(LinkAddressType first, LinkAddressType second)
{
auto& firstLink = this->GetLinkReference(first);
auto& secondLink = this->GetLinkReference(second);
return this->FirstIsToTheRightOfSecond(firstLink.Source, firstLink.Target, secondLink.Source, secondLink.Target);
return this->object().FirstIsToTheRightOfSecond(firstLink.Source, firstLink.Target, secondLink.Source, secondLink.Target);
}

auto operator[](std::size_t index)
{
auto root = GetTreeRoot();
if (index >= this->object.GetSize(root))
auto root = this->object().GetTreeRoot();
if (index >= this->object().GetSize(root))
{
return 0;
}
Expand All @@ -83,17 +71,17 @@

public: LinkAddressType Search(LinkAddressType source, LinkAddressType target)
{
auto root = this->GetTreeRoot();
auto root = this->object().GetTreeRoot();
while (root != 0)
{
auto& rootLink = this->GetLinkReference(root);
auto rootSource = rootLink.Source;
auto rootTarget = rootLink.Target;
if (this->FirstIsToTheLeftOfSecond(source, target, rootSource, rootTarget))
if (this->object().FirstIsToTheLeftOfSecond(source, target, rootSource, rootTarget))
{
root = this->GetLeftOrDefault(root);
}
else if (this->FirstIsToTheRightOfSecond(source, target, rootSource, rootTarget))
else if (this->object().FirstIsToTheRightOfSecond(source, target, rootSource, rootTarget))
{
root = this->GetRightOrDefault(root);
}
Expand All @@ -107,12 +95,12 @@

public: LinkAddressType CountUsages(LinkAddressType linkAddress)
{
auto root = this->GetTreeRoot();
auto root = this->object().GetTreeRoot();
auto total = this->object().GetSize(root);
auto totalRightIgnore = 0;
while (root != 0)
{
auto base = this->GetBasePartValue(root);
auto base = this->object().GetBasePartValue(root);
if (base <= linkAddress)
{
root = this->GetRightOrDefault(root);
Expand All @@ -123,11 +111,11 @@
root = this->GetLeftOrDefault(root);
}
}
root = this->GetTreeRoot();
root = this->object().GetTreeRoot();
auto totalLeftIgnore = 0;
while (root != 0)
{
auto base = this->GetBasePartValue(root);
auto base = this->object().GetBasePartValue(root);
if (base >= linkAddress)
{
root = this->GetLeftOrDefault(root);
Expand All @@ -141,7 +129,7 @@
return total - totalRightIgnore - totalLeftIgnore;
}

public: LinkAddressType EachUsage(LinkAddressType base, const ReadHandlerType& handler) { return this->EachUsageCore(base, this->GetTreeRoot(), handler); }
public: LinkAddressType EachUsage(LinkAddressType base, const ReadHandlerType& handler) { return this->EachUsageCore(base, this->object().GetTreeRoot(), handler); }

private: LinkAddressType EachUsageCore(LinkAddressType base, LinkAddressType linkAddress, const ReadHandlerType& handler)
{
Expand All @@ -150,7 +138,7 @@
{
return $continue;
}
auto linkBasePart = this->GetBasePartValue(linkAddress);
auto linkBasePart = this->object().GetBasePartValue(linkAddress);
auto $break = Constants.Break;
if (linkBasePart > (base))
{
Expand Down
Loading

0 comments on commit 1e43096

Please sign in to comment.