Format() private method

Converts the value of a specified object to an equivalent string representation using specified format and culture-specific formatting information.
private Format ( StringBuilder sb, string format, object arg, IFormatProvider formatProvider, int &maxLength ) : bool
sb StringBuilder String builder to which formatted string should be appended.
format string Format string containing formatting specifications.
arg object An object to format.
formatProvider IFormatProvider An object that supplies format information about the current instance.
maxLength int /// Maximum number of characters allowed to the formatter. Formatting will fail (and return false) /// if this number of characters is breached. Multi-lined formatters will ignore this parameter. /// Negative value indicates that formatter has unlimited space available. On output contains remaining number of characters available. ///
return bool
		/// <summary>
		///     Converts the value of a specified object to an equivalent string representation using
		///     specified format and culture-specific formatting information.
		/// </summary>
		/// <param name="sb">String builder to which formatted string should be appended.</param>
		/// <param name="format">A format string containing formatting specifications.</param>
		/// <param name="arg">An object to format.</param>
		/// <param name="formatProvider">An object that supplies format information about the current instance.</param>
		/// <param name="maxLength">
		///     Maximum number of characters allowed to the formatter. Formatting will fail (and return false)
		///     if this number of characters is breached. Multi-lined formatters will ignore this parameter.
		///     Negative value indicates that formatter has unlimited space available. On output contains remaining number of characters available.
		/// </param>
		/// <returns>
		///     true if representation of <paramref name="arg" /> has been successfully appended to <paramref name="sb" />
		///     within given number of allowed characters; otherwise false.
		/// </returns>
		internal override bool Format(StringBuilder sb, string format, object arg, IFormatProvider formatProvider, ref int maxLength)
		{
			var success = true;
			var originalLength = sb.Length;

			if (PushCurrentObject(arg))
			{
				if (ShowDataType)
				{
					var instanceType = GetInstanceType(arg);
					success = success && AppendFriendlyTypeName(instanceType, arg, sb, ref maxLength);
				}

				if (sb.Length > originalLength)
				{
					success = FormatInfoUtils.TryAppendChar(this, sb, ' ', success, ref maxLength);
				}
				success = FormatInfoUtils.TryAppendString(this, sb, FirstContainedValuePrefix, success, ref maxLength);

				if (arg != null)
				{
					IncIndentationLevel(true);

					var array = (Array) arg;
					var rows = array.GetLength(0);

					var cafi = new CompactArrayFormatInfo(this);
					cafi.ShowItemsOnly = true;
					cafi.FieldLength = GetMaxValueLength(array);

					var rowNumberFormatProvider = new ScalarFormatInfo(VerboseFormatInfo.SingleLinedFormat);
					rowNumberFormatProvider.ShowDataType = false;
					rowNumberFormatProvider.ShowInstanceName = false;
					if (IsMultiLinedFormat)
					{
						rowNumberFormatProvider.FieldLength = rowNumberFormatProvider.GetValueLength(rows);
					}

					for (var i = 0; i < rows; i++)
					{
						if (i == rows - 1)
						{
							DecIndentationLevel();
							IncIndentationLevel(false); // There are no more rows in the matrix

							cafi.DecIndentationLevel();
							cafi.IncIndentationLevel(false);
						}

						success = success && FormatLinePrefix(sb, true, i == rows - 1, false, 0, ref maxLength);
						success = FormatInfoUtils.TryAppendString(this, sb, "Row ", success, ref maxLength);
						success = success && rowNumberFormatProvider.Format(sb, null, i, rowNumberFormatProvider, ref maxLength);

						success = FormatInfoUtils.TryAppendChar(this, sb, ' ', success, ref maxLength);
						success = FormatInfoUtils.TryAppendString(this, sb, FirstContainedValuePrefix, success, ref maxLength);

						// Now we should append row content, which is obtained differently in case of matrix and in case of jagged array
						if (array.Rank == 1)
						{
							// Array is jagged
							var row = (Array) array.GetValue(i);
							cafi.ShowLastDimension = false;
							success = success && cafi.Format(sb, null, row, cafi, ref maxLength);
						}
						else
						{
							// Array is a matrix
							cafi.HeadingIndices = new[] { i };
							cafi.ShowLastDimension = true;
							success = success && cafi.Format(sb, null, array, cafi, ref maxLength);
							cafi.HeadingIndices = null;
						}

						success = FormatInfoUtils.TryAppendString(this, sb, LastContainedValueSuffix, success, ref maxLength);
					}

					DecIndentationLevel();
				}

				success = FormatInfoUtils.TryAppendString(this, sb, LastContainedValueSuffix, success, ref maxLength);

				PopCurrentObject();
			}
			else
			{
				success = success && FormatInfoUtils.ReportInfiniteLoop(sb, arg, InstanceName, ref maxLength);
			}

			if (!success)
			{
				sb.Length = originalLength;
			}

			return success;
		}
Beispiel #2
0
        /// <summary>
        ///     Converts the value of a specified object to an equivalent string representation using
        ///     specified format and culture-specific formatting information.
        /// </summary>
        /// <param name="sb">String builder to which formatted string should be appended.</param>
        /// <param name="format">A format string containing formatting specifications.</param>
        /// <param name="arg">An object to format.</param>
        /// <param name="formatProvider">An object that supplies format information about the current instance.</param>
        /// <param name="maxLength">
        ///     Maximum number of characters allowed to the formatter. Formatting will fail (and return false)
        ///     if this number of characters is breached. Multi-lined formatters will ignore this parameter.
        ///     Negative value indicates that formatter has unlimited space available. On output contains remaining number of characters available.
        /// </param>
        /// <returns>
        ///     true if representation of <paramref name="arg" /> has been successfully appended to <paramref name="sb" />
        ///     within given number of allowed characters; otherwise false.
        /// </returns>
        internal override bool Format(StringBuilder sb, string format, object arg, IFormatProvider formatProvider, ref int maxLength)
        {
            var success        = true;
            var originalLength = sb.Length;

            if (PushCurrentObject(arg))
            {
                if (ShowDataType)
                {
                    var instanceType = GetInstanceType(arg);
                    success = success && AppendFriendlyTypeName(instanceType, arg, sb, ref maxLength);
                }

                if (sb.Length > originalLength)
                {
                    success = FormatInfoUtils.TryAppendChar(this, sb, ' ', success, ref maxLength);
                }
                success = FormatInfoUtils.TryAppendString(this, sb, FirstContainedValuePrefix, success, ref maxLength);

                if (arg != null)
                {
                    IncIndentationLevel(true);

                    var array = (Array)arg;
                    var rows  = array.GetLength(0);

                    var cafi = new CompactArrayFormatInfo(this);
                    cafi.ShowItemsOnly = true;
                    cafi.FieldLength   = GetMaxValueLength(array);

                    var rowNumberFormatProvider = new ScalarFormatInfo(VerboseFormatInfo.SingleLinedFormat);
                    rowNumberFormatProvider.ShowDataType     = false;
                    rowNumberFormatProvider.ShowInstanceName = false;
                    if (IsMultiLinedFormat)
                    {
                        rowNumberFormatProvider.FieldLength = rowNumberFormatProvider.GetValueLength(rows);
                    }

                    for (var i = 0; i < rows; i++)
                    {
                        if (i == rows - 1)
                        {
                            DecIndentationLevel();
                            IncIndentationLevel(false);                             // There are no more rows in the matrix

                            cafi.DecIndentationLevel();
                            cafi.IncIndentationLevel(false);
                        }

                        success = success && FormatLinePrefix(sb, true, i == rows - 1, false, 0, ref maxLength);
                        success = FormatInfoUtils.TryAppendString(this, sb, "Row ", success, ref maxLength);
                        success = success && rowNumberFormatProvider.Format(sb, null, i, rowNumberFormatProvider, ref maxLength);

                        success = FormatInfoUtils.TryAppendChar(this, sb, ' ', success, ref maxLength);
                        success = FormatInfoUtils.TryAppendString(this, sb, FirstContainedValuePrefix, success, ref maxLength);

                        // Now we should append row content, which is obtained differently in case of matrix and in case of jagged array
                        if (array.Rank == 1)
                        {
                            // Array is jagged
                            var row = (Array)array.GetValue(i);
                            cafi.ShowLastDimension = false;
                            success = success && cafi.Format(sb, null, row, cafi, ref maxLength);
                        }
                        else
                        {
                            // Array is a matrix
                            cafi.HeadingIndices    = new[] { i };
                            cafi.ShowLastDimension = true;
                            success             = success && cafi.Format(sb, null, array, cafi, ref maxLength);
                            cafi.HeadingIndices = null;
                        }

                        success = FormatInfoUtils.TryAppendString(this, sb, LastContainedValueSuffix, success, ref maxLength);
                    }

                    DecIndentationLevel();
                }

                success = FormatInfoUtils.TryAppendString(this, sb, LastContainedValueSuffix, success, ref maxLength);

                PopCurrentObject();
            }
            else
            {
                success = success && FormatInfoUtils.ReportInfiniteLoop(sb, arg, InstanceName, ref maxLength);
            }

            if (!success)
            {
                sb.Length = originalLength;
            }

            return(success);
        }
        /// <summary>
        ///     Converts the value of a specified array to an equivalent string representation using
        ///     specified format and culture-specific formatting information.
        /// </summary>
        /// <param name="sb">String builder to which formatted string should be appended.</param>
        /// <param name="format">A format string containing formatting specifications.</param>
        /// <param name="arg">An object to format.</param>
        /// <param name="formatProvider">An object that supplies format information about the current instance.</param>
        /// <param name="maxLength">
        ///     Maximum number of characters allowed to the formatter. Formatting will fail (and return false)
        ///     if this number of characters is breached. Multi-lined formatters will ignore this parameter.
        ///     Negative value indicates that formatter has unlimited space available.
        /// </param>
        /// <returns>
        ///     true if representation of <paramref name="arg" /> has been successfully appended to <paramref name="sb" />
        ///     within given number of allowed characters; otherwise false.
        /// </returns>
        internal override bool Format(StringBuilder sb, string format, object arg, IFormatProvider formatProvider, ref int maxLength)
        {
            var success        = true;
            var originalLength = sb.Length;

            var array = (Array)arg;
            var rank  = array.Rank;

            if (rank > 1 || PushCurrentObject(arg))
            {
                _currentInstance = array;

                var prevFieldLength = _fieldLength;
                UpdateFieldLength(sb);                 // Autonomously updates field length if that will help better format values from the array

                if (!_showItemsOnly && ShowDataType)
                {
                    success = success && AppendInstanceTypeName(arg, sb, ref maxLength);
                    success = FormatInfoUtils.TryAppendSpaceIfNeeded(this, sb, success, ref maxLength);
                    success = FormatInfoUtils.TryAppendString(this, sb, FirstContainedValuePrefix, success, ref maxLength);
                }

                var enumerator = GetEnumerator();

                var sfi = new ScalarFormatInfo(this);
                sfi.ShowDataType     = false;
                sfi.ShowInstanceName = false;
                sfi.FieldLength      = _fieldLength;

                var linePrefixLength   = GetCurrentLineLength(sb);
                var lineStartPos       = sb.Length;
                var isFirstValueInLine = true;
                var repeatLastValue    = false;

                while (success && (repeatLastValue || enumerator.MoveNext()))
                {
                    // At every position it might happen that line should be broken and formatting continued on the following line
                    var prevLineLength = sb.Length - lineStartPos;

                    string delimiter = null;
                    if (isFirstValueInLine)
                    {
                        delimiter = "";
                    }
                    else if (IsMultiLinedFormat)
                    {
                        delimiter = " ";
                    }
                    else
                    {
                        delimiter = FieldDelimiter;
                    }

                    success            = FormatInfoUtils.TryAppendString(this, sb, delimiter, success, ref maxLength);
                    success            = success && sfi.Format(sb, null, enumerator.Current, sfi, ref maxLength);
                    isFirstValueInLine = false;
                    repeatLastValue    = false;

                    if (IsMultiLinedFormat && _maxLineLength > 0 && sb.Length - lineStartPos > _maxLineLength && !isFirstValueInLine)
                    {
                        // Maximum line length has been breached in the multi-lined format
                        // As a consequence, last value should be deleted from output, new line should be started and last value formatted again

                        sb.Length = prevLineLength + lineStartPos;

                        success = success && FormatLinePrefix(sb, true, false, true, linePrefixLength, ref maxLength);

                        lineStartPos       = sb.Length;
                        repeatLastValue    = true;
                        isFirstValueInLine = true;
                    }
                }

                if (!_showItemsOnly)
                {
                    success = FormatInfoUtils.TryAppendString(this, sb, LastContainedValueSuffix, success, ref maxLength);
                }

                _fieldLength = prevFieldLength;                 // Restore field length to value before this method was called

                if (rank == 1)
                {
                    PopCurrentObject();
                }
            }
            else
            {
                success = success && FormatInfoUtils.ReportInfiniteLoop(sb, arg, InstanceName, ref maxLength);
            }

            if (!success)
            {
                sb.Length = originalLength;
            }

            return(success);
        }