public BTree2InternalNode(H5BinaryReader reader, Superblock superblock, BTree2Header <T> header, ushort recordCount, int nodeLevel, Func <T> decodeKey) : base(reader, header, recordCount, BTree2InternalNode <T> .Signature, decodeKey) { this.NodePointers = new BTree2NodePointer[recordCount + 1]; // H5B2cache.c (H5B2__cache_int_deserialize) for (int i = 0; i < recordCount + 1; i++) { // address this.NodePointers[i].Address = superblock.ReadOffset(reader); // record count var childRecordCount = H5Utils.ReadUlong(reader, header.MaxRecordCountSize); this.NodePointers[i].RecordCount = (ushort)childRecordCount; // total record count if (nodeLevel > 1) { var totalChildRecordCount = H5Utils.ReadUlong(reader, header.NodeInfos[nodeLevel - 1].CumulatedTotalRecordCountSize); this.NodePointers[i].TotalRecordCount = totalChildRecordCount; } else { this.NodePointers[i].TotalRecordCount = childRecordCount; } } // checksum this.Checksum = reader.ReadUInt32(); }
public BTree2Node(H5BinaryReader reader, BTree2Header <T> header, ushort recordCount, byte[] signature, Func <T> decodeKey) : base(reader) { // signature var actualSignature = reader.ReadBytes(4); H5Utils.ValidateSignature(actualSignature, signature); // version this.Version = reader.ReadByte(); // type this.Type = (BTree2Type)reader.ReadByte(); if (this.Type != header.Type) { throw new FormatException($"The BTree2 internal node type ('{this.Type}') does not match the type defined in the header ('{header.Type}')."); } // records this.Records = new T[recordCount]; for (ulong i = 0; i < recordCount; i++) { this.Records[i] = decodeKey(); } }
protected override ChunkInfo GetChunkInfo(ulong[] chunkIndices) { if (this.Dataset.InternalFilterPipeline is null) { if (_btree2_no_filter is null) { this.Dataset.Context.Reader.Seek((long)this.Dataset.InternalDataLayout.Address, SeekOrigin.Begin); Func <BTree2Record10> decodeKey = () => this.DecodeRecord10(this.ChunkRank); _btree2_no_filter = new BTree2Header <BTree2Record10>(this.Dataset.Context.Reader, this.Dataset.Context.Superblock, decodeKey); } // get record var success = _btree2_no_filter.TryFindRecord(out var record, record => { // H5Dbtree2.c (H5D__bt2_compare) return(H5Utils.VectorCompare(this.ChunkRank, chunkIndices, record.ScaledOffsets)); }); return(success ? new ChunkInfo(record.Address, this.ChunkByteSize, 0) : ChunkInfo.None); } else { if (_btree2_filter is null) { this.Dataset.Context.Reader.Seek((long)this.Dataset.InternalDataLayout.Address, SeekOrigin.Begin); var chunkSizeLength = H5Utils.ComputeChunkSizeLength(this.ChunkByteSize); Func <BTree2Record11> decodeKey = () => this.DecodeRecord11(this.ChunkRank, chunkSizeLength); _btree2_filter = new BTree2Header <BTree2Record11>(this.Dataset.Context.Reader, this.Dataset.Context.Superblock, decodeKey); } // get record var success = _btree2_filter.TryFindRecord(out var record, record => { // H5Dbtree2.c (H5D__bt2_compare) return(H5Utils.VectorCompare(this.ChunkRank, chunkIndices, record.ScaledOffsets)); }); return(success ? new ChunkInfo(record.Address, record.ChunkSize, record.FilterMask) : ChunkInfo.None); } }
public override T Read <T>(Func <H5BinaryReader, T> func, [AllowNull] ref List <BTree2Record01> record01Cache) { // huge objects b-tree v2 if (record01Cache is null) { _reader.Seek((long)_heapHeader.HugeObjectsBTree2Address, SeekOrigin.Begin); var hugeBtree2 = new BTree2Header <BTree2Record01>(_reader, _superblock, this.DecodeRecord01); record01Cache = hugeBtree2.EnumerateRecords().ToList(); } var hugeRecord = record01Cache.FirstOrDefault(record => record.HugeObjectId == this.BTree2Key); _reader.Seek((long)hugeRecord.HugeObjectAddress, SeekOrigin.Begin); return(func(_reader)); }
private void ReadChunkedBTree2(Span <byte> buffer, byte rank, ulong chunkSize) { var offset = 0UL; if (this.FilterPipeline == null) { // btree2 Func <BTree2Record10> decodeKey = () => this.DecodeRecord10(rank); var btree2 = new BTree2Header <BTree2Record10>(this.Context.Reader, this.Context.Superblock, decodeKey); var records = btree2 .EnumerateRecords() .ToList(); // read data foreach (var record in records) { this.SeekSliceAndReadChunk(offset, chunkSize, chunkSize, record.Address, buffer); offset += chunkSize; } } else { // btree2 var chunkSizeLength = this.ComputeChunkSizeLength(chunkSize); Func <BTree2Record11> decodeKey = () => this.DecodeRecord11(rank, chunkSizeLength); var btree2 = new BTree2Header <BTree2Record11>(this.Context.Reader, this.Context.Superblock, decodeKey); var records = btree2 .EnumerateRecords() .ToList(); // read data foreach (var record in records) { this.SeekSliceAndReadChunk(offset, record.ChunkSize, record.ChunkSize, record.Address, buffer); offset += chunkSize; } } }
public BTree2LeafNode(H5BinaryReader reader, BTree2Header <T> header, ushort recordCount, Func <T> decodeKey) : base(reader, header, recordCount, BTree2LeafNode <T> .Signature, decodeKey) { // checksum this.Checksum = reader.ReadUInt32(); }