#region License
// Copyright 2006 James Newton-King
// http://www.newtonsoft.com
//
// This work is licensed under the Creative Commons Attribution 2.5 License
// http://creativecommons.org/licenses/by/2.5/
//
// You are free:
// * to copy, distribute, display, and perform the work
// * to make derivative works
// * to make commercial use of the work
//
// Under the following conditions:
// * You must attribute the work in the manner specified by the author or licensor:
// - If you find this component useful a link to http://www.newtonsoft.com would be appreciated.
// * For any reuse or distribution, you must make clear to others the license terms of this work.
// * Any of these conditions can be waived if you get permission from the copyright holder.
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace MySpace.Common.IO.JSON.Utilities
{
internal static class CollectionUtils
{
/// <summary>
/// Determines whether the collection is null or empty.
/// </summary>
/// <param name="collection">The collection.</param>
/// <returns>
/// <c>true</c> if the collection is null or empty; otherwise, <c>false</c>.
/// </returns>
public static bool IsNullOrEmpty(ICollection collection)
{
if (collection != null)
{
return (collection.Count == 0);
}
return true;
}
/// <summary>
/// Determines whether the collection is null or empty.
/// </summary>
/// <param name="collection">The collection.</param>
/// <returns>
/// <c>true</c> if the collection is null or empty; otherwise, <c>false</c>.
/// </returns>
public static bool IsNullOrEmpty<T>(ICollection<T> collection)
{
if (collection != null)
{
return (collection.Count == 0);
}
return true;
}
/// <summary>
/// Determines whether the collection is null, empty or its contents are uninitialized values.
/// </summary>
/// <param name="collection">The collection.</param>
/// <returns>
/// <c>true</c> if the collection is null or empty or its contents are uninitialized values; otherwise, <c>false</c>.
/// </returns>
public static bool IsNullOrEmptyOrDefault<T>(IList<T> list)
{
if (IsNullOrEmpty<T>(list))
return true;
return ItemsUnitializedValue<T>(list);
}
/// <summary>
/// Gets the type of the typed list's items.
/// </summary>
/// <param name="type">The type.</param>
/// <returns>The type of the typed list's items.</returns>
public static Type GetTypedListItemType(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
if (type.IsArray)
return type.GetElementType();
else if (type.IsGenericType && IsSubClass(type.GetGenericTypeDefinition(), typeof(List<>)))
return type.GetGenericArguments()[0];
else if (type.BaseType != null && type.BaseType.IsGenericType && IsSubClass(type.BaseType.GetGenericTypeDefinition(), typeof(List<>)))
return type.BaseType.GetGenericArguments()[0];
else if (type.BaseType != null && type.BaseType.BaseType != null && type.BaseType.BaseType.IsGenericType && IsSubClass(type.BaseType.BaseType.GetGenericTypeDefinition(), typeof(List<>)))
return type.BaseType.GetGenericArguments()[0];
else
throw new Exception("Bad type");
}
public static Type GetTypedDictionaryValueType(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
if (type.IsGenericType && IsSubClass(type.GetGenericTypeDefinition(), typeof(Dictionary<,>)))
return type.GetGenericArguments()[1];
else if (typeof(IDictionary).IsAssignableFrom(type))
return null;
else
throw new Exception("Bad type");
}
public static bool IsSubClass(Type type, Type check)
{
if (type == null || check == null)
return false;
if (type == check && type.IsGenericType)
return true;
if (check.IsInterface)
{
foreach (Type t in type.GetInterfaces())
{
if (IsSubClass(t, check)) return true;
}
}
if (type.IsGenericType && !type.IsGenericTypeDefinition)
{
if (IsSubClass(type.GetGenericTypeDefinition(), check))
return true;
}
return IsSubClass(type.BaseType, check);
}
public static object GetTypeUnitializedValue(Type type)
{
if (type.IsValueType)
return Activator.CreateInstance(type);
else if (type.IsClass)
return null;
else
throw new ArgumentException("Type is neither a ValueType or a Class", "type");
}
/// <summary>
/// Tests whether the list's items are their unitialized value.
/// </summary>
/// <param name="list">The list.</param>
/// <returns>Whether the list's items are their unitialized value</returns>
public static bool ItemsUnitializedValue<T>(IList<T> list)
{
if (list == null)
throw new ArgumentNullException("values");
Type elementType = GetTypedListItemType(list.GetType());
if (elementType.IsValueType)
{
object unitializedValue = GetTypeUnitializedValue(elementType);
for (int i = 0; i < list.Count; i++)
{
if (!list[i].Equals(unitializedValue))
return false;
}
}
else if (elementType.IsClass)
{
for (int i = 0; i < list.Count; i++)
{
if (list[i] != null)
return false;
}
}
else
{
throw new ArgumentException("Type is neither a ValueType or a Class", "valueType");
}
return true;
}
}
}
|