| 55 | } |
| 56 | |
| 57 | size_t TWriteableNode::Pack(char* buffer) const { |
| 58 | const size_t length = Measure(); |
| 59 | |
| 60 | char flags = 0; |
| 61 | if (LeafPos) { |
| 62 | flags |= MT_FINAL; |
| 63 | } |
| 64 | if (ForwardOffset != NPOS) { |
| 65 | flags |= MT_NEXT; |
| 66 | } |
| 67 | |
| 68 | const size_t leftOffset = LeftOffset != NPOS ? LeftOffset + length : 0; |
| 69 | const size_t rightOffset = RightOffset != NPOS ? RightOffset + length : 0; |
| 70 | const size_t leftOffsetSize = MeasureOffset(leftOffset); |
| 71 | const size_t rightOffsetSize = MeasureOffset(rightOffset); |
| 72 | flags |= (leftOffsetSize << MT_LEFTSHIFT); |
| 73 | flags |= (rightOffsetSize << MT_RIGHTSHIFT); |
| 74 | |
| 75 | buffer[0] = flags; |
| 76 | buffer[1] = Label; |
| 77 | size_t usedLen = 2; |
| 78 | usedLen += PackOffset(buffer + usedLen, leftOffset); |
| 79 | usedLen += PackOffset(buffer + usedLen, rightOffset); |
| 80 | |
| 81 | if (LeafPos && LeafLength) { |
| 82 | memcpy(buffer + usedLen, LeafPos, LeafLength); |
| 83 | usedLen += LeafLength; |
| 84 | } |
| 85 | |
| 86 | if (ForwardOffset != NPOS && ForwardOffset != 0) { |
| 87 | const size_t fwdOffset = ForwardOffset + length - usedLen; |
| 88 | size_t fwdOffsetSize = MeasureOffset(fwdOffset); |
| 89 | buffer[usedLen++] = (char)(fwdOffsetSize & MT_SIZEMASK); |
| 90 | usedLen += PackOffset(buffer + usedLen, fwdOffset); |
| 91 | } |
| 92 | Y_ASSERT(usedLen == length); |
| 93 | return usedLen; |
| 94 | } |
| 95 | |
| 96 | } |
no test coverage detected