private ArrowBuffer ConcatenateOffsetBuffer() { var builder = new ArrowBuffer.Builder <int>(_totalLength + 1); int baseOffset = 0; builder.Append(0); foreach (ArrayData arrayData in _arrayDataList) { if (arrayData.Length == 0) { continue; } // The first offset is always 0. // It should be skipped because it duplicate to the last offset of builder. ReadOnlySpan <int> span = arrayData.Buffers[1].Span.CastTo <int>().Slice(1, arrayData.Length); foreach (int offset in span) { builder.Append(baseOffset + offset); } // The next offset must start from the current last offset. baseOffset += span[arrayData.Length - 1]; } return(builder.Build(_allocator)); }
private ArrowBuffer ConcatenateVariableBinaryValueBuffer() { var builder = new ArrowBuffer.Builder <byte>(); foreach (ArrayData arrayData in _arrayDataList) { int lastOffset = arrayData.Buffers[1].Span.CastTo <int>()[arrayData.Length]; builder.Append(arrayData.Buffers[2].Span.Slice(0, lastOffset)); } return(builder.Build(_allocator)); }
private ArrowBuffer ConcatenateFixedWidthTypeValueBuffer(FixedWidthType type) { int typeByteWidth = type.BitWidth / 8; var builder = new ArrowBuffer.Builder <byte>(_totalLength * typeByteWidth); foreach (ArrayData arrayData in _arrayDataList) { int length = arrayData.Length; int byteLength = length * typeByteWidth; builder.Append(arrayData.Buffers[1].Span.Slice(0, byteLength)); } return(builder.Build(_allocator)); }