//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. // //----------------------------------------------------------------------- namespace Microsoft.Isam.Esent.Interop { using System; /// /// A cache for boxed values. /// /// The type of object to cache. internal static class BoxedValueCache where T : struct, IEquatable { /// /// Number of boxed values to cache. /// private const int NumCachedBoxedValues = 257; /// /// Cached boxed values. /// private static readonly object[] BoxedValues = new object[NumCachedBoxedValues]; /// /// Gets a boxed version of the value. A cached copy is used if possible. /// /// The value to box. /// A boxed version of the value. public static object GetBoxedValue(T? value) { if (!value.HasValue) { return null; } T valueToBox = value.Value; int index = (valueToBox.GetHashCode() & 0x7fffffff) % NumCachedBoxedValues; object boxedValue = BoxedValues[index]; if (null == boxedValue || !((T)boxedValue).Equals(valueToBox)) { boxedValue = valueToBox; BoxedValues[index] = boxedValue; } return boxedValue; } } }