using System;
using System.Buffers;
using System.Collections.Generic;
namespace LLama.Native;
///
/// Disposes all contained disposables when this class is disposed
///
internal sealed class GroupDisposable
: IDisposable
{
private bool _disposed;
private readonly List _handles = new();
private readonly List _disposables = new();
///
~GroupDisposable()
{
Dispose();
}
public MemoryHandle Add(MemoryHandle handle)
{
if (_disposed)
throw new ObjectDisposedException("Cannot add new handle, already disposed");
_handles.Add(handle);
return handle;
}
public T Add(T disposable)
where T : class, IDisposable
{
if (_disposed)
throw new ObjectDisposedException("Cannot add new IDisposable, already disposed");
_disposables.Add(disposable);
return disposable;
}
///
public void Dispose()
{
if (_disposed)
return;
foreach (var memoryHandle in _handles)
memoryHandle.Dispose();
foreach (var disposable in _disposables)
disposable.Dispose();
_disposed = true;
GC.SuppressFinalize(this);
}
}