コード例 #1
0
        private int DeserializeItems(DiskBTreeNode node, Span <byte> buffer)
        {
            var itemLength = _serializer.MaxSerializedItemLength;

            for (var i = 0; i < node.N; i++)
            {
                node.Items[i] = _serializer.DeserializeItem(buffer.Slice(i * itemLength, itemLength));
            }
            return(node.N * itemLength);
        }
コード例 #2
0
 private int SerializeChildren(DiskBTreeNode node, Span <byte> buffer)
 {
     if (node.IsLeaf)
     {
         return(0);
     }
     for (var i = 0; i < node.N + 1; i++)
     {
         var childNode = (DiskBTreeNode)node.Children[i];
         BitConverter.TryWriteBytes(buffer.Slice(i * 8, 8), childNode?.Id ?? -1);
     }
     return((node.N + 1) * 8);
 }
コード例 #3
0
 private int DeserializeHeader(DiskBTreeNode node, Span <byte> buffer)
 {
     node.IsLeaf = (NodeType)buffer[0] switch
     {
         NodeType.NonLeaf => false,
         NodeType.Leaf => true,
         _ => ThrowCorruptedNode <bool>(node.Id)
     };
     node.N = BitConverter.ToInt32(buffer.Slice(1, 4));
     if (node.N < 0 || node.N > MaxItemsCount)
     {
         ThrowCorruptedNode <bool>(node.Id);
     }
     return(5);
 }
コード例 #4
0
 private int DeserializeChildren(DiskBTreeNode node, Span <byte> buffer)
 {
     if (node.IsLeaf)
     {
         return(0);
     }
     for (var i = 0; i < node.N + 1; i++)
     {
         var id = BitConverter.ToInt64(buffer.Slice(i * 8, 8));
         if (id >= 0)
         {
             var childNode = (DiskBTreeNode)AllocateNode();
             node.Children[i] = childNode;
             childNode.Id     = id;
         }
     }
     return((node.N + 1) * 8);
 }
コード例 #5
0
 private int SerializeHeader(DiskBTreeNode node, Span <byte> buffer)
 {
     buffer[0] = (byte)(node.IsLeaf ? NodeType.Leaf : NodeType.NonLeaf);
     BitConverter.TryWriteBytes(buffer.Slice(1, 4), node.N);
     return(5);
 }