using System;

namespace Cryville.Common {
	public struct Identifier : IEquatable<Identifier> {
		public int Key { get; private set; }
		public object Name { get { return IdentifierManager.SharedInstance.Retrieve(Key); } }
		public Identifier(int key) {
			Key = key;
		}
		public Identifier(object name) {
			Key = IdentifierManager.SharedInstance.Request(name);
		}
		public override bool Equals(object obj) {
			if (obj == null || !(obj is Identifier)) return false;
			return Equals((Identifier)obj);
		}
		public bool Equals(Identifier other) {
			return Key == other.Key;
		}
		public override int GetHashCode() {
			return Key;
		}
		public override string ToString() {
			if (Key == 0) return "";
			return Name.ToString();
		}
		public static implicit operator Identifier(string identifier) {
			return new Identifier(identifier);
		}
		public static implicit operator string(Identifier identifier) {
			return identifier.ToString();
		}
	}
}
