Platform.Data.Doublets C++
Loading...
Searching...
No Matches
LinksRecursionlessSizeBalancedTreeMethodsBase.h
Go to the documentation of this file.
2{
3
4 template <typename Self, typename TLinksOptions>
6 : public Platform::Collections::Methods::Trees::RecursionlessSizeBalancedTreeMethods<
7 Self, typename TLinksOptions::LinkAddressType>
8 {
9 using LinksOptionsType = TLinksOptions;
10 using LinkAddressType = typename LinksOptionsType::LinkAddressType;
11 using LinkType = typename LinksOptionsType::LinkType;
12 using ReadHandlerType = typename LinksOptionsType::ReadHandlerType;
13 static constexpr LinksConstants<LinkAddressType> Constants = LinksOptionsType::Constants;
14
15 public:
16 using methods =
17 Platform::Collections::Methods::Trees::RecursionlessSizeBalancedTreeMethods<Self, LinkAddressType>;
18
19 public:
20 std::byte* const Links;
21
22 public:
23 std::byte* const Header;
24
25 public:
26 LinksRecursionlessSizeBalancedTreeMethodsBase(std::byte* storage, std::byte* header)
27 : Links(storage), Header(header)
28 {
29 }
30
31 public:
33 {
34 return this->object().GetTreeRoot();
35 }
36
37 public:
39 {
40 return this->object().GetBasePartValue(linkAddress);
41 }
42
43 public:
45 LinkAddressType rootTarget)
46 {
47 return this->object().FirstIsToTheRightOfSecond(source, target, rootSource, rootTarget);
48 }
49
50 public:
52 LinkAddressType rootTarget)
53 {
54 return this->object().FirstIsToTheLeftOfSecond(source, target, rootSource, rootTarget);
55 }
56
57 public:
59 {
60 return *reinterpret_cast<LinksHeader<LinkAddressType>*>(Header);
61 }
62
63 public:
65 {
66 return reinterpret_cast<RawLink<LinkAddressType>*>(Links)[linkAddress];
67 }
68
69 public:
71 {
72 auto& link = GetLinkReference(linkIndex);
73 return LinkType{linkIndex, link.Source, link.Target};
74 }
75
76 public:
78 {
79 auto& firstLink = this->GetLinkReference(first);
80 auto& secondLink = this->GetLinkReference(second);
81 return this->FirstIsToTheLeftOfSecond(firstLink.Source, firstLink.Target, secondLink.Source,
82 secondLink.Target);
83 }
84
85 public:
87 {
88 auto& firstLink = this->GetLinkReference(first);
89 auto& secondLink = this->GetLinkReference(second);
90 return this->FirstIsToTheRightOfSecond(firstLink.Source, firstLink.Target, secondLink.Source,
91 secondLink.Target);
92 }
93
94 auto operator[](std::size_t index)
95 {
96 auto root = GetTreeRoot();
97 if (index >= this->object.GetSize(root))
98 {
99 return 0;
100 }
101 while (root != 0)
102 {
103 auto left = GetLeftOrDefault(root);
104 auto leftSize = GetSizeOrZero(left);
105 if (index < leftSize)
106 {
107 root = left;
108 continue;
109 }
110 if (index == leftSize)
111 {
112 return root;
113 }
114 root = GetRightOrDefault(root);
115 index = index - (leftSize + 1);
116 }
117 return 0;
118 }
119
120 public:
122 {
123 auto root = this->GetTreeRoot();
124 while (root != 0)
125 {
126 auto& rootLink = this->GetLinkReference(root);
127 auto rootSource = rootLink.Source;
128 auto rootTarget = rootLink.Target;
129 if (this->FirstIsToTheLeftOfSecond(source, target, rootSource, rootTarget))
130 {
131 root = this->GetLeftOrDefault(root);
132 }
133 else if (this->FirstIsToTheRightOfSecond(source, target, rootSource, rootTarget))
134 {
135 root = this->GetRightOrDefault(root);
136 }
137 else
138 {
139 return root;
140 }
141 }
142 return 0;
143 }
144
145 public:
147 {
148 auto root = this->GetTreeRoot();
149 auto total = this->object().GetSize(root);
150 auto totalRightIgnore = 0;
151 while (root != 0)
152 {
153 auto base = this->GetBasePartValue(root);
154 if (base <= linkAddress)
155 {
156 root = this->GetRightOrDefault(root);
157 }
158 else
159 {
160 totalRightIgnore = totalRightIgnore + (this->GetRightSize(root) + 1);
161 root = this->GetLeftOrDefault(root);
162 }
163 }
164 root = this->GetTreeRoot();
165 auto totalLeftIgnore = 0;
166 while (root != 0)
167 {
168 auto base = this->GetBasePartValue(root);
169 if (base >= linkAddress)
170 {
171 root = this->GetLeftOrDefault(root);
172 }
173 else
174 {
175 totalLeftIgnore = totalLeftIgnore + (this->GetLeftSize(root) + 1);
176 root = this->GetRightOrDefault(root);
177 }
178 }
179 return total - totalRightIgnore - totalLeftIgnore;
180 }
181
182 public:
184 {
185 return this->EachUsageCore(base, this->GetTreeRoot(), handler);
186 }
187
188 private:
189 LinkAddressType EachUsageCore(LinkAddressType base, LinkAddressType linkAddress, const ReadHandlerType& handler)
190 {
191 auto $continue = Constants.Continue;
192 auto $break = Constants.Break;
193
194 if (linkAddress == 0)
195 {
196 return $continue;
197 }
198 auto linkBasePart = this->GetBasePartValue(linkAddress);
199 if (linkBasePart > (base))
200 {
201 if ((this->EachUsageCore(base, this->GetLeftOrDefault(linkAddress), handler) == $break))
202 {
203 return $break;
204 }
205 }
206 else if (linkBasePart < base)
207 {
208 if ((this->EachUsageCore(base, this->GetRightOrDefault(linkAddress), handler) == $break))
209 {
210 return $break;
211 }
212 }
213 else
214 {
215 auto link = this->GetLinkValues(linkAddress);
216 if (handler(link) == ($break))
217 {
218 return $break;
219 }
220 if ((this->EachUsageCore(base, this->GetLeftOrDefault(linkAddress), handler) == $break))
221 {
222 return $break;
223 }
224 if ((this->EachUsageCore(base, this->GetRightOrDefault(linkAddress), handler) == $break))
225 {
226 return $break;
227 }
228 }
229 return $continue;
230 }
231 };
232} // namespace Platform::Data::Doublets::Memory::United::Generic
Definition LinksAvlBalancedTreeMethodsBase.h:2
LinkAddressType GetBasePartValue(LinkAddressType linkAddress)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:38
LinksRecursionlessSizeBalancedTreeMethodsBase(std::byte *storage, std::byte *header)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:26
bool FirstIsToTheLeftOfSecond(LinkAddressType source, LinkAddressType target, LinkAddressType rootSource, LinkAddressType rootTarget)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:51
auto operator[](std::size_t index)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:94
bool FirstIsToTheLeftOfSecond(LinkAddressType first, LinkAddressType second)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:77
static constexpr LinksConstants< LinkAddressType > Constants
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:13
bool FirstIsToTheRightOfSecond(LinkAddressType source, LinkAddressType target, LinkAddressType rootSource, LinkAddressType rootTarget)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:44
LinkAddressType Search(LinkAddressType source, LinkAddressType target)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:121
typename LinksOptionsType::ReadHandlerType ReadHandlerType
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:12
std::byte *const Header
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:23
auto & GetHeaderReference()
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:58
TLinksOptions LinksOptionsType
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:9
typename LinksOptionsType::LinkType LinkType
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:11
Platform::Collections::Methods::Trees::RecursionlessSizeBalancedTreeMethods< Self, LinkAddressType > methods
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:17
LinkAddressType GetTreeRoot()
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:32
auto & GetLinkReference(LinkAddressType linkAddress)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:64
LinkAddressType EachUsage(LinkAddressType base, const ReadHandlerType &handler)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:183
bool FirstIsToTheRightOfSecond(LinkAddressType first, LinkAddressType second)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:86
LinkAddressType CountUsages(LinkAddressType linkAddress)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:146
std::byte *const Links
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:20
LinkType GetLinkValues(LinkAddressType linkIndex)
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:70
typename LinksOptionsType::LinkAddressType LinkAddressType
Definition LinksRecursionlessSizeBalancedTreeMethodsBase.h:10