#region License // Copyright (c) 2007 James Newton-King // // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. #endregion using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; using System.Text; using System.Globalization; using System.Text.RegularExpressions; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; namespace LC.Newtonsoft.Json.Utilities { internal delegate T Creator(); internal static class MiscellaneousUtils { [Conditional("DEBUG")] public static void Assert([DoesNotReturnIf(false)] bool condition, string? message = null) { Debug.Assert(condition, message); } public static bool ValueEquals(object? objA, object? objB) { if (objA == objB) { return true; } if (objA == null || objB == null) { return false; } // comparing an Int32 and Int64 both of the same value returns false // make types the same then compare if (objA.GetType() != objB.GetType()) { if (ConvertUtils.IsInteger(objA) && ConvertUtils.IsInteger(objB)) { return Convert.ToDecimal(objA, CultureInfo.CurrentCulture).Equals(Convert.ToDecimal(objB, CultureInfo.CurrentCulture)); } else if ((objA is double || objA is float || objA is decimal) && (objB is double || objB is float || objB is decimal)) { return MathUtils.ApproxEquals(Convert.ToDouble(objA, CultureInfo.CurrentCulture), Convert.ToDouble(objB, CultureInfo.CurrentCulture)); } else { return false; } } return objA.Equals(objB); } public static ArgumentOutOfRangeException CreateArgumentOutOfRangeException(string paramName, object actualValue, string message) { string newMessage = message + Environment.NewLine + @"Actual value was {0}.".FormatWith(CultureInfo.InvariantCulture, actualValue); return new ArgumentOutOfRangeException(paramName, newMessage); } public static string ToString(object? value) { if (value == null) { return "{null}"; } return (value is string s) ? @"""" + s + @"""" : value!.ToString(); } public static int ByteArrayCompare(byte[] a1, byte[] a2) { int lengthCompare = a1.Length.CompareTo(a2.Length); if (lengthCompare != 0) { return lengthCompare; } for (int i = 0; i < a1.Length; i++) { int valueCompare = a1[i].CompareTo(a2[i]); if (valueCompare != 0) { return valueCompare; } } return 0; } public static string? GetPrefix(string qualifiedName) { GetQualifiedNameParts(qualifiedName, out string? prefix, out _); return prefix; } public static string GetLocalName(string qualifiedName) { GetQualifiedNameParts(qualifiedName, out _, out string localName); return localName; } public static void GetQualifiedNameParts(string qualifiedName, out string? prefix, out string localName) { int colonPosition = qualifiedName.IndexOf(':'); if ((colonPosition == -1 || colonPosition == 0) || (qualifiedName.Length - 1) == colonPosition) { prefix = null; localName = qualifiedName; } else { prefix = qualifiedName.Substring(0, colonPosition); localName = qualifiedName.Substring(colonPosition + 1); } } internal static RegexOptions GetRegexOptions(string optionsText) { RegexOptions options = RegexOptions.None; for (int i = 0; i < optionsText.Length; i++) { switch (optionsText[i]) { case 'i': options |= RegexOptions.IgnoreCase; break; case 'm': options |= RegexOptions.Multiline; break; case 's': options |= RegexOptions.Singleline; break; case 'x': options |= RegexOptions.ExplicitCapture; break; } } return options; } } }