102 lines
2.2 KiB
C#

using System;
using System.Linq;
// ReSharper disable once CheckNamespace
namespace GameDevWare.Serialization
{
public struct JsonMember : IEquatable<JsonMember>, IEquatable<string>
{
internal string NameString;
internal char[] NameChars;
internal bool IsEscapedAndQuoted;
public int Length
{
get { return this.NameString != null ? this.NameString.Length : this.NameChars.Length; }
}
public JsonMember(string name)
: this(name, false)
{
}
public JsonMember(string name, bool escapedAndQuoted)
{
if (name == null)
throw new ArgumentNullException("name");
this.NameString = name;
this.IsEscapedAndQuoted = escapedAndQuoted;
this.NameChars = null;
}
public JsonMember(char[] name)
: this(name, false)
{
}
public JsonMember(char[] name, bool escapedAndQuoted)
{
if (name == null)
throw new ArgumentNullException("name");
this.NameChars = name;
this.IsEscapedAndQuoted = escapedAndQuoted;
this.NameString = null;
}
public override int GetHashCode()
{
return this.NameString != null ? this.NameString.GetHashCode() : this.NameChars.Aggregate(0, (a, c) => a ^ (int) c);
}
public override bool Equals(object obj)
{
if (obj is JsonMember)
return this.Equals((JsonMember) obj);
else if (obj is string)
return this.Equals((string) obj);
else
return false;
}
public bool Equals(JsonMember other)
{
return this.ToString().Equals(other.ToString(), StringComparison.Ordinal);
}
public bool Equals(string other)
{
return this.ToString().Equals(other, StringComparison.Ordinal);
}
public static explicit operator string(JsonMember member)
{
return member.ToString();
}
public static explicit operator JsonMember(string memberName)
{
return new JsonMember(memberName);
}
public override string ToString()
{
var name = NameString;
if (this.NameChars != null)
name = new string(NameChars, 0, NameChars.Length);
// this is used in tests, so perf is not primary
if (this.IsEscapedAndQuoted)
{
if (name.EndsWith(":"))
name = name.Substring(0, name.Length - 1);
name = JsonUtils.UnescapeAndUnquote(name);
}
return name;
}
}
}