| 241 | |
| 242 | template <class TData, class TPacker> |
| 243 | char ReadNode( |
| 244 | char* nodeStart, |
| 245 | char*& leftSibling, |
| 246 | char*& rightSibling, |
| 247 | char*& directChild, |
| 248 | NCompactTrie::TSuffixLink*& suffixLink, |
| 249 | TPacker packer = TPacker() |
| 250 | ) { |
| 251 | char* dataPos = nodeStart; |
| 252 | char flags = *(dataPos++); |
| 253 | |
| 254 | Y_ASSERT(!NCompactTrie::IsEpsilonLink(flags)); // Epsilon links are not allowed |
| 255 | |
| 256 | char label = *(dataPos++); |
| 257 | |
| 258 | suffixLink = (NCompactTrie::TSuffixLink*)dataPos; |
| 259 | dataPos += sizeof(NCompactTrie::TSuffixLink); |
| 260 | |
| 261 | { // Left branch |
| 262 | size_t offsetLength = NCompactTrie::LeftOffsetLen(flags); |
| 263 | size_t leftOffset = NCompactTrie::UnpackOffset(dataPos, offsetLength); |
| 264 | leftSibling = leftOffset ? (nodeStart + leftOffset) : nullptr; |
| 265 | |
| 266 | dataPos += offsetLength; |
| 267 | } |
| 268 | |
| 269 | |
| 270 | { // Right branch |
| 271 | size_t offsetLength = NCompactTrie::RightOffsetLen(flags); |
| 272 | size_t rightOffset = NCompactTrie::UnpackOffset(dataPos, offsetLength); |
| 273 | rightSibling = rightOffset ? (nodeStart + rightOffset) : nullptr; |
| 274 | |
| 275 | dataPos += offsetLength; |
| 276 | } |
| 277 | |
| 278 | directChild = nullptr; |
| 279 | if (flags & NCompactTrie::MT_NEXT) { |
| 280 | directChild = dataPos; |
| 281 | if (flags & NCompactTrie::MT_FINAL) { |
| 282 | directChild += packer.SkipLeaf(directChild); |
| 283 | } |
| 284 | } |
| 285 | |
| 286 | return label; |
| 287 | } |
| 288 | |
| 289 | template <class TData, class TPacker> |
| 290 | char ReadNodeConst( |
nothing calls this directly
no test coverage detected