using System.Collections.Generic; namespace UniJSON { public static class ListTreeNodeExtensions { #region IValue public static bool IsNull(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.ValueType == ValueNodeType.Null; } public static bool IsBoolean(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.ValueType == ValueNodeType.Boolean; } public static bool IsString(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.ValueType == ValueNodeType.String; } public static bool IsInteger(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.ValueType == ValueNodeType.Integer; } public static bool IsFloat(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.ValueType == ValueNodeType.Number || self.Value.ValueType == ValueNodeType.NaN || self.Value.ValueType == ValueNodeType.Infinity || self.Value.ValueType == ValueNodeType.MinusInfinity; } public static bool IsArray(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.ValueType == ValueNodeType.Array; } public static bool IsMap(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.ValueType == ValueNodeType.Object; } public static bool GetBoolean(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetBoolean(); } public static string GetString(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetString(); } public static Utf8String GetUtf8String(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetUtf8String(); } public static sbyte GetSByte(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetSByte(); } public static short GetInt16(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetInt16(); } public static int GetInt32(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetInt32(); } public static long GetInt64(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetInt64(); } public static byte GetByte(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetByte(); } public static ushort GetUInt16(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetUInt16(); } public static uint GetUInt32(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetUInt32(); } public static ulong GetUInt64(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetUInt64(); } public static float GetSingle(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetSingle(); } public static double GetDouble(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetDouble(); } /// /// for UnitTest. Use explicit GetT() or Deserialize(ref T) /// /// public static object GetValue(this ListTreeNode self) where T : IListTreeItem, IValue { return self.Value.GetValue(); } #endregion public static IEnumerable> Traverse(this ListTreeNode self) where T : IListTreeItem, IValue { yield return self; if (self.IsArray()) { foreach (var x in self.ArrayItems()) { foreach (var y in x.Traverse()) { yield return y; } } } else if (self.IsMap()) { foreach (var kv in self.ObjectItems()) { foreach (var y in kv.Value.Traverse()) { yield return y; } } } } } }