//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 loyalsoft. All rights reserved.
// Homepage: http://www.game7000.com/
// Feedback: http://www.game7000.com/
//------------------------------------------------------------
using System;
using System.Runtime.InteropServices;
namespace GameFramework.Resource
{
internal sealed partial class ResourceManager : GameFrameworkModule, IResourceManager
{
///
/// 资源名称。
///
[StructLayout(LayoutKind.Auto)]
private struct ResourceName : IComparable, IComparable, IEquatable
{
private readonly string m_Name;
private readonly string m_Variant;
private readonly string m_Extension;
private string m_CachedFullName;
///
/// 初始化资源名称的新实例。
///
/// 资源名称。
/// 变体名称。
/// 扩展名称。
public ResourceName(string name, string variant, string extension)
{
if (string.IsNullOrEmpty(name))
{
throw new GameFrameworkException("Resource name is invalid.");
}
if (string.IsNullOrEmpty(extension))
{
throw new GameFrameworkException("Resource extension is invalid.");
}
m_Name = name;
m_Variant = variant;
m_Extension = extension;
m_CachedFullName = null;
}
///
/// 获取资源名称。
///
public string Name
{
get
{
return m_Name;
}
}
///
/// 获取变体名称。
///
public string Variant
{
get
{
return m_Variant;
}
}
///
/// 获取扩展名称。
///
public string Extension
{
get
{
return m_Extension;
}
}
public string FullName
{
get
{
if (m_CachedFullName == null)
{
m_CachedFullName = m_Variant != null ? Utility.Text.Format("{0}.{1}.{2}", m_Name, m_Variant, m_Extension) : Utility.Text.Format("{0}.{1}", m_Name, m_Extension);
}
return m_CachedFullName;
}
}
public override string ToString()
{
return FullName;
}
public override int GetHashCode()
{
if (m_Variant == null)
{
return m_Name.GetHashCode() ^ m_Extension.GetHashCode();
}
return m_Name.GetHashCode() ^ m_Variant.GetHashCode() ^ m_Extension.GetHashCode();
}
public override bool Equals(object obj)
{
return (obj is ResourceName) && Equals((ResourceName)obj);
}
public bool Equals(ResourceName value)
{
return string.Equals(m_Name, value.m_Name, StringComparison.Ordinal) && string.Equals(m_Variant, value.m_Variant, StringComparison.Ordinal) && string.Equals(m_Extension, value.m_Extension, StringComparison.Ordinal);
}
public static bool operator ==(ResourceName a, ResourceName b)
{
return a.Equals(b);
}
public static bool operator !=(ResourceName a, ResourceName b)
{
return !(a == b);
}
public int CompareTo(object value)
{
if (value == null)
{
return 1;
}
if (!(value is ResourceName))
{
throw new GameFrameworkException("Type of value is invalid.");
}
return CompareTo((ResourceName)value);
}
public int CompareTo(ResourceName resourceName)
{
int result = string.CompareOrdinal(m_Name, resourceName.m_Name);
if (result != 0)
{
return result;
}
result = string.CompareOrdinal(m_Variant, resourceName.m_Variant);
if (result != 0)
{
return result;
}
return string.CompareOrdinal(m_Extension, resourceName.m_Extension);
}
}
}
}