using System;
namespace NLua
{
///
/// Base class to provide consistent disposal flow across lua objects. Uses code provided by Yves Duhoux and suggestions by Hans Schmeidenbacher and Qingrui Li
///
public abstract class LuaBase : IDisposable
{
private bool _disposed;
protected readonly int _Reference;
protected WeakReference _Interpreter;
protected LuaBase(int reference)
{
_Reference = reference;
}
~LuaBase()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
void DisposeLuaReference()
{
if (_Interpreter == null)
return;
Lua lua;
if (!_Interpreter.TryGetTarget(out lua))
return;
lua.DisposeInternal(_Reference);
}
public virtual void Dispose(bool disposeManagedResources)
{
if (_disposed)
return;
// TODO: Remove the disposeManagedResources check
if (_Reference != 0 && disposeManagedResources)
{
DisposeLuaReference();
}
_Interpreter = null;
_disposed = true;
}
public override bool Equals(object o)
{
var reference = o as LuaBase;
if (reference == null)
return false;
Lua lua;
if (!_Interpreter.TryGetTarget(out lua))
return false;
return lua.CompareRef(reference._Reference, _Reference);
}
public override int GetHashCode()
{
return _Reference;
}
}
}