private TreeNodeHeader *AllocateNewNode(int index, int nodeSize) { TreePageHeader *header = Header; int upper; if (Upper == ushort.MaxValue && PageSize == Constants.Compression.MaxPageSize) { upper = Constants.Compression.MaxPageSize; } else { upper = header->Upper; } var newNodeOffset = (ushort)(upper - nodeSize); Debug.Assert(newNodeOffset >= header->Lower + Constants.Tree.NodeOffsetSize); var node = (TreeNodeHeader *)(Base + newNodeOffset); KeysOffsets[index] = newNodeOffset; header->Upper = newNodeOffset; header->Lower += Constants.Tree.NodeOffsetSize; node->Flags = 0; return(node); }
private TreeNodeHeader *AllocateNewNode(int index, int nodeSize, ushort previousNodeVersion) { int newSize = previousNodeVersion + 1; if (newSize > ushort.MaxValue) { previousNodeVersion = 0; } TreePageHeader *header = Header; var newNodeOffset = (ushort)(header->Upper - nodeSize); Debug.Assert(newNodeOffset >= header->Lower + Constants.NodeOffsetSize); var node = (TreeNodeHeader *)(Base + newNodeOffset); KeysOffsets[index] = newNodeOffset; header->Upper = newNodeOffset; header->Lower += Constants.NodeOffsetSize; node->Flags = 0; node->Version = ++previousNodeVersion; return(node); }