Files
FlowScope/My project/Assets/FlowScope/Runtime/Resources/ResourceEntry.cs
2026-05-20 16:08:20 +08:00

75 lines
2.1 KiB
C#

using System;
namespace FlowScope.Resources
{
internal sealed class ResourceEntry
{
private readonly Action<string, Type, object> _release;
private int _referenceCount;
private bool _released;
public ResourceEntry(string key, object asset, Action<string, object> release)
: this(key, asset?.GetType(), asset, (_, _, releasedAsset) => release(key, releasedAsset))
{
}
public ResourceEntry(string key, Type assetType, object asset, Action<string, Type, object> release)
{
Key = string.IsNullOrWhiteSpace(key)
? throw new ArgumentException("Resource key is required.", nameof(key))
: key;
AssetType = assetType ?? throw new ArgumentNullException(nameof(assetType));
Asset = asset ?? throw new ArgumentNullException(nameof(asset));
_release = release ?? throw new ArgumentNullException(nameof(release));
}
public string Key { get; }
public Type AssetType { get; }
public object Asset { get; private set; }
public int ReferenceCount => _referenceCount;
public ResourceHandle<T> CreateHandle<T>() where T : class
{
if (_released)
{
throw new ObjectDisposedException(nameof(ResourceEntry));
}
_referenceCount++;
return new ResourceHandle<T>(this);
}
public void ReleaseHandle()
{
if (_released)
{
return;
}
_referenceCount--;
if (_referenceCount > 0)
{
return;
}
_released = true;
var asset = Asset;
Asset = null;
_release(Key, AssetType, asset);
}
public void ReleaseWithoutHandle()
{
if (_released)
{
return;
}
_released = true;
var asset = Asset;
Asset = null;
_release(Key, AssetType, asset);
}
}
}