blob: fd67ed39fe1c2fb7511d9ced4672b485a374bcc1 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Apache.Ignite.Internal.Buffers
{
using System;
using Proto.MsgPack;
/// <summary>
/// Pooled byte buffer. Wraps a byte array rented from <see cref="ByteArrayPool"/>,
/// returns it to the pool on <see cref="Dispose"/>.
/// </summary>
internal sealed class PooledBuffer : IDisposable
{
/// <summary>
/// Default capacity for all buffers.
/// </summary>
public const int DefaultCapacity = 65_535;
private readonly byte[] _bytes;
private readonly int _length;
private bool _disposed;
/// <summary>
/// Initializes a new instance of the <see cref="PooledBuffer"/> class.
/// </summary>
/// <param name="bytes">Bytes.</param>
/// <param name="position">Data position within specified byte array.</param>
/// <param name="length">Data length within specified byte array.</param>
public PooledBuffer(byte[] bytes, int position, int length)
{
_bytes = bytes;
Position = position;
_length = length;
}
/// <summary>
/// Finalizes an instance of the <see cref="PooledBuffer"/> class.
/// </summary>
~PooledBuffer()
{
Dispose();
}
/// <summary>
/// Gets or sets the position.
/// </summary>
public int Position { get; set; }
/// <summary>
/// Gets or sets the optional metadata.
/// </summary>
public object? Metadata { get; set; }
/// <summary>
/// Gets a <see cref="MsgPackReader"/> for this buffer.
/// </summary>
/// <param name="offset">Offset.</param>
/// <returns><see cref="MsgPackReader"/> for this buffer.</returns>
public MsgPackReader GetReader(int offset = 0)
{
CheckDisposed();
return new MsgPackReader(_bytes.AsSpan(Position + offset, _length - offset - Position));
}
/// <summary>
/// Gets this buffer contents as memory.
/// </summary>
/// <param name="offset">Offset.</param>
/// <returns>Memory of byte.</returns>
public ReadOnlyMemory<byte> AsMemory(int offset = 0)
{
CheckDisposed();
return new ReadOnlyMemory<byte>(_bytes, Position + offset, _length - offset - Position);
}
/// <summary>
/// Releases the pooled buffer.
/// </summary>
public void Dispose()
{
if (_disposed)
{
return;
}
ByteArrayPool.Return(_bytes);
_disposed = true;
GC.SuppressFinalize(this);
}
private void CheckDisposed() => ObjectDisposedException.ThrowIf(_disposed, this);
}
}