예제 #1
0
        unsafe public Node <T> From_Bytes(byte[] buffer, int order)
        {
            var byteCount = Size_In_Bytes(order);
            var keySize   = Serializer.Serialized_Size_For_Single_Key_In_Bytes();

            int key_Num;

            fixed(byte *p_buff = &buffer[0])
            {
                byte *shifted = p_buff;

                Unsafe_Utilities.Memcpy((byte *)&key_Num, shifted, 4);
            }

            bool isLeaf = buffer[4] == 1;
            var  node   = Create_New(isLeaf);

            node.Key_Num = key_Num;

            node.Keys = Serializer.Get_Instances(buffer, 5, order);

            int offset = 5 + keySize * order;

            fixed(long *p_Pointers = &node.Pointers[0])
            fixed(byte *p_buff = &buffer[0])
            {
                byte *shifted = p_buff + offset;

                Unsafe_Utilities.Memcpy((byte *)p_Pointers, shifted, 8 * (key_Num + 1));
            }

            if (IsClustered && node.IsLeaf)
            {
                offset += 8 * (node.Pointers.Length);

                fixed(byte *p_Data = &node.Data[0, 0])
                fixed(byte *p_buff = &buffer[0])
                {
                    byte *shifted = p_buff + offset;

                    Unsafe_Utilities.Memcpy(p_Data, shifted, Clustered_Data_Size * (key_Num + 1));
                }
                //for (int i = 1; i < key_Num + 1; i++)
                //     node.Data[i] = Clustered_Data<T>.From_Bytes(buffer, offset + i * Clustered_Data_Size, Clustered_Data_Size);
            }

            return(node);
        }
예제 #2
0
        unsafe public void To_Bytes_In_Buffer(Node <T> node, byte[] buffer, int startIndex)
        {
            int key_Num = node.Key_Num;
            int keySize = Serializer.Serialized_Size_For_Single_Key_In_Bytes();

            fixed(byte *p_buff = &buffer[0])
            {
                byte *shifted = p_buff + startIndex;

                Unsafe_Utilities.Memcpy(shifted, (byte *)&key_Num, 4);
            }

            buffer[startIndex + 4] = node.IsLeaf ? (byte)1 : (byte)0;

            int offset = startIndex + 5;

            Serializer.To_Buffer(node.Keys, key_Num, buffer, offset);

            offset += keySize * node.Keys.Length;
            fixed(long *p_Pointers = &node.Pointers[0])
            fixed(byte *p_buff = &buffer[0])
            {
                byte *shifted = p_buff + offset;

                Unsafe_Utilities.Memcpy(shifted, (byte *)p_Pointers, 8 * (key_Num + 1));
            }

            if (IsClustered && node.IsLeaf)
            {
                offset += 8 * (node.Pointers.Length);

                fixed(byte *p_Data = &node.Data[0, 0])
                fixed(byte *p_buff = &buffer[0])
                {
                    byte *shifted = p_buff + offset;

                    Unsafe_Utilities.Memcpy(shifted, p_Data, Clustered_Data_Size * (key_Num + 1));
                }

                //for (int i = 1; i < key_Num + 1; i++)
                //    node.Data[i].Write_To_Buffer(buffer, offset + i * Clustered_Data_Size);
            }
        }