Calendar
Mo | Tu | We | Th | Fr | Sa | Su |
---|
30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Archive
- 2002
- 2003
- 2004
- 2005
- 2006
- 2007
- 2008
- 2009
- 2010
- 2011
- 2012
- 2013
- 2014
- 2015
- 2016
- 2019
- 2020
|
Website may be up and down over next few months. I'm currently doing a complete overhaul of everything.
Going back to simple individual .htm pages, new overall site theme, sanitizing and cleaning up html of all
pages and blog posts, attempting to implement a new tooling and publishing system etc etc.
When writing editor scripts involving EditorWindow’s it is often important to initialize and cleanup your code when the window is shown and hidden. Specifically it is important to differentiate between the OnDisable and OnDestroy methods if you need to perform some kind of cleanup before the window is closed or disposed of. OnDestroy is called when the user closes the window, where as OnDisable is called after unity recompiles scripts. Think of the OnDestroy method as a close event for the window but the window still resides in memory, where the OnDisable method signals that the window is about to be unloaded from memory such as during a script recompile. This differentiation is important when you need to save data to disk before the window is destroyed during a recompile. OnDestroy will not get called during recompile only OnDisable does. The OnEnable method is typically intended as a initialization method where you can load data related to the window. I only wish the Unity team had made these methods more descriptive ala .NET window forms naming scheme. OnDestroy & OnDisable are not the most descriptive for what they do as well as being somewhat similar in spelling. But I digress.
3f78e724-9868-4983-9b83-6bd811846233|0|.0
public static string GetMD5HashFromFile(string fileName)
{
byte[] retVal;
using (var file = new FileStream(fileName, FileMode.Open))
{
var md5 = new MD5CryptoServiceProvider();
retVal = md5.ComputeHash(file);
}
var sb = new StringBuilder();
for (var i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
013ba24f-c019-4a0a-b616-5aa7de928b52|0|.0
A simple performance test for comparing direct file property access or creating a FileInfo object. The results show that if you are accessing more then one file property FileInfo is the way to go otherwise File.GetCreationTime and related methods have the same performance hit. 100 iterations of c:\windows directValues –> 00:00:00.2900065 infoValues –> 00:00:00.1611554 void Main()
{
var folder = "c:\\windows";
var files = Directory.GetFiles(folder, "*.*", SearchOption.TopDirectoryOnly);
var stopwatch = new Stopwatch();
var directValues = 0l;
var infoValues = 0l;
for (int i = 0; i < 100; i++)
{
stopwatch.Restart();
stopwatch.Start();
foreach (var file in files)
{
var lastWriteTime = File.GetLastWriteTime(file);
var creationTime = File.GetCreationTime(file);
}
stopwatch.Stop();
directValues += stopwatch.ElapsedTicks;
stopwatch.Restart();
stopwatch.Start();
foreach (var file in files)
{
var info = new FileInfo(file);
var lastWriteTime = info.LastWriteTime;
var creationTime = info.CreationTime;
}
stopwatch.Stop();
infoValues += stopwatch.ElapsedTicks;
}
"100 iterations of c:\\windows".Dump();
TimeSpan.FromTicks(directValues).Dump("directValues");
TimeSpan.FromTicks(infoValues).Dump("infoValues");
}
f166ac5a-7acc-43a8-9cf9-3076c5e1dfb1|1|5.0
Full repo available at https://bitbucket.org/createdbyx/codefarts.utilities-extension-methods-only /// <summary>Determines whether a value in within a certain range.</summary>
/// <param name="value">The value.</param>
/// <param name="min">The minimum value.</param>
/// <param name="max">The maximum value.</param>
/// <returns>True if the value is in range.</returns>
public static bool IsInRange(this BaseType value, BaseType min, BaseType max)
{
return value >= min && value <= max;
}
/// <summary>Determines whether a value in within a certain range.</summary>
/// <param name="value">The value.</param>
/// <param name="min">The minimum value.</param>
/// <param name="max">The maximum value.</param>
/// <param name="throwException">if set to <c>true</c> will throw a <see cref="IndexOutOfRangeException"/> if the value is out of range.</param>
/// <returns>True if the value is in range.</returns>
/// <exception cref="System.IndexOutOfRangeException">Is thrown if the value is out of range.</exception>
public static bool IsInRange(this BaseType value, BaseType min, BaseType max, bool throwException)
{
if (!(value >= min && value <= max) && throwException)
{
throw new IndexOutOfRangeException();
}
return true;
}
/// <summary>Determines whether a value in within a certain range.</summary>
/// <param name="value">The value.</param>
/// <param name="min">The minimum value.</param>
/// <param name="max">The maximum value.</param>
/// <param name="throwException">if set to <c>true</c> will throw a <see cref="IndexOutOfRangeException"/> if the value is out of range.</param>
/// <param name="message">The message for the <see cref="IndexOutOfRangeException"/> if it is thrown.</param>
/// <returns>True if the value is in range.</returns>
/// <exception cref="System.IndexOutOfRangeException">Is thrown if the value is out of range.</exception>
public static bool IsInRange(this BaseType value, BaseType min, BaseType max, bool throwException, string message)
{
if (!(value >= min && value <= max) && throwException)
{
throw new IndexOutOfRangeException(message);
}
return true;
}
4f516f2a-bf73-42fd-b45b-ecb8ae75995d|0|.0
fa70e1dc-4092-4f26-8217-f8ee08cb28ac|0|.0
Full repo available at https://bitbucket.org/createdbyx/codefarts.utilities-extension-methods-only /// <summary>
/// Clamps the specified value.
/// </summary>
/// <param name="value">The value to be clamped.</param>
/// <param name="min">The minimum value.</param>
/// <param name="max">The maximum value.</param>
/// <returns>The clamped value.</returns>
public static BaseType Clamp(this BaseType value, BaseType min, BaseType max)
{
if (value < min)
{
return min;
}
if (value > max)
{
return max;
}
return value;
}
c9e15e0d-15b9-4029-8e20-43d032c50e38|0|.0
Full repo available at https://bitbucket.org/createdbyx/codefarts.utilities-extension-methods-only /// <summary>
/// Determines weather or not all the characters in a string are all the same.
/// </summary>
/// <param name="value">The value to check for.</param>
/// <returns>true is all characters are the same, otherwise false.</returns>
public static bool AllTheSame(this string value)
{
#if UNITY3D
if (!StringExtensionMethods.IsNullOrWhiteSpace(value))
#else
if (!string.IsNullOrWhiteSpace(value))
#endif
{
var clone = new string(value[0], value.Length);
return clone == value;
}
return false;
}
#if UNITY3D
public static bool IsNullOrWhiteSpace(this string value)
{
if (value == null)
{
return true;
}
for (var i = 0; i < value.Length; i++)
{
if (!char.IsWhiteSpace(value[i]))
{
return false;
}
}
return true;
}
#endif
}
921b6831-b717-421d-ba8f-8ad18fd0f56d|0|.0
Full repo available at https://bitbucket.org/createdbyx/codefarts.utilities-extension-methods-only namespace System.Collections
{
/// <summary>
/// Provides extension methods for the IList interface.
/// </summary>
public static class IListExtensionMethods
{
/// <summary>Swaps the specified items in a list.</summary>
/// <param name="list">The list.</param>
/// <param name="indexA">The index of item A.</param>
/// <param name="indexB">The index of item B.</param>
/// <param name="remove">If set to <c>true</c> items will be removed and re-inserted.</param>
public static void Swap(this IList list, int indexA, int indexB, bool remove)
{
if (indexA == indexB)
{
return;
}
indexA.IsInRange(0, list.Count - 1, true, "indexA is out of range.");
indexB.IsInRange(0, list.Count - 1, true, "indexB is out of range.");
if (remove)
{
var first = Math.Min(indexA, indexB);
var second = Math.Max(indexA, indexB);
var tempA = list[first];
var tempB = list[second];
list.RemoveAt(second);
list.RemoveAt(first);
list.Insert(first, tempB);
list.Insert(second, tempA);
}
else
{
var temp = list[indexA];
list[indexA] = list[indexB];
list[indexB] = temp;
}
}
/// <summary>Swaps the specified items in a list.</summary>
/// <param name="list">The list.</param>
/// <param name="indexA">The index of item A.</param>
/// <param name="indexB">The index of item B.</param>
/// <remarks>Items are swapped and not removed or inserted.</remarks>
public static void Swap(this IList list, int indexA, int indexB)
{
Swap(list, indexA, indexB, false);
}
/// <summary>Swaps the specified items in a list and return true if successful.</summary>
/// <param name="list">The list.</param>
/// <param name="indexA">The index of item A.</param>
/// <param name="indexB">The index of item B.</param>
/// <remarks>Items are swapped and not removed or inserted.</remarks>
/// <returns>true if successful.</returns>
public static bool TrySwap(this IList list, int indexA, int indexB)
{
try
{
Swap(list, indexA, indexB);
}
catch
{
return false;
}
return true;
}
/// <summary>Swaps the specified items in a list and return true if successful.</summary>
/// <param name="list">The list.</param>
/// <param name="indexA">The index of item A.</param>
/// <param name="indexB">The index of item B.</param>
/// <param name="remove">If set to <c>true</c> items will be removes and re-inserted.</param>
/// <returns>true if successful.</returns>
public static bool TrySwap(this IList list, int indexA, int indexB, bool remove)
{
try
{
Swap(list, indexA, indexB, remove);
}
catch
{
return false;
}
return true;
}
}
}
fba1eb61-9978-4f0f-b9cd-34b808c00e42|0|.0
Full repo available at https://bitbucket.org/createdbyx/codefarts.utilities-extension-methods-only /// <summary>
/// Removes a range of entries inside an array.
/// </summary>
/// <typeparam name="T">Specifies the generic type of the array.</typeparam>
/// <param name="array">The destination array.</param>
/// <param name="index">The start index where entries will be removed from.</param>
/// <param name="length">The number of entries to be removed.</param>
/// <returns>
/// Returns the resized and updated destination array.
/// </returns>
/// <exception cref="ArgumentOutOfRangeException">index</exception>
public static T[] RemoveRange<T>(this T[] array, int index, int length)
{
if (length < 1)
{
return array;
}
if (index < 0 || index > array.Length - 1)
{
throw new ArgumentOutOfRangeException("index");
}
if (index + length > array.Length - 1)
{
Array.Resize(ref array, index);
return array;
}
var endLength = Math.Max(0, Math.Min(array.Length - index, array.Length - (index + length)));
var tempArray = new T[endLength];
Array.Copy(array, index + length, tempArray, 0, endLength);
Array.Resize(ref array, array.Length - length);
tempArray.CopyTo(array, array.Length - endLength);
return array;
}
f468b7a3-87f8-4dd1-9ff8-ab01d10053ca|0|.0
Full repo available at https://bitbucket.org/createdbyx/codefarts.utilities-extension-methods-only /// <summary>
/// Moves the specified entries in the array by a set ammount.
/// </summary>
/// <typeparam name="T">Specifies the generic type of the array.</typeparam>
/// <param name="array">The destination array.</param>
/// <param name="index">The start index where entries will be moved from.</param>
/// <param name="length">The number of entries to be moved.</param>
/// <param name="shift">The ammount and direction to move the specified entries.</param>
/// <returns>
/// Returns the resized and updated destination array.
/// </returns>
/// <exception cref="ArgumentOutOfRangeException">length;'length' argument must be greater then 0.</exception>
/// <remarks><p>To move entries to the left (towards 0) specify a negative shift value and a positive shift value to move entries to the right.</p>
/// <example>
/// <code>
/// var items = new[] { 0, 1, 2, 3, 4 };
/// items = items.Move(3, 2, -1);
/// </code>
/// Result should be { 0, 1, 3, 4, 4 }
/// </example></remarks>
public static T[] Move<T>(this T[] array, int index, int length, int shift)
{
if (length <= 0)
{
throw new ArgumentOutOfRangeException("length", "'length' argument must be greater then 0.");
}
if (shift > 0 && index + length + shift > array.Length - 1)
{
Array.Resize(ref array, array.Length + (index + length + shift - array.Length));
}
if (index + shift < 0)
{
length += index + shift;
index = -(index + shift);
}
length = Math.Min(array.Length - index, length);
if (length > 0)
{
Array.Copy(array, index, array, index + shift, length);
}
return array;
}
e86270ef-5f08-434f-b3bd-39dc58677b56|0|.0
|
|