コード例 #1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ArrayTypeValue"/> class.
        /// Values are decoded from the byte store
        /// </summary>
        /// <param name="theArrayTypeDefinition">The array type definition.</param>
        /// <param name="theBytes">The bytes.</param>
        /// <param name="parent">The parent.</param>
        public ArrayTypeValue(ArrayTypeDefinition theArrayTypeDefinition, ByteStore theBytes, Value parent)
            : base(theArrayTypeDefinition, parent)
        {
            m_ArrayTypeDefinition = theArrayTypeDefinition;

            m_ArrayValues = new ArrayValueContainer(m_ArrayTypeDefinition.UpperBound);

            if (m_ArrayTypeDefinition.Rank > 0)
            {
                // Fixed-size arrays - populate with decoded elements of the base type
                m_ArrayValues.Populate(() => m_ArrayTypeDefinition.ElementType.Decode(theBytes, this));
            }
            else if (!string.IsNullOrEmpty(m_ArrayTypeDefinition.UpperBoundVariable))
            {
                // Variable size array. Locate the discriminator if there is one
                // TODO
            }
            else
            {
                // Variable size array - number of elements limited by the number of bytes available or an end marker being discovered
                bool done = false;

                do
                {
                    Value theValue = m_ArrayTypeDefinition.ElementType.Decode(theBytes, this);
                    m_ArrayValues.Add(theValue);

                    if (theValue.FundamentalType.TypeId == TypeId.StructType)
                    {
                        done = IsEndMarker(theValue as StructureValue);
                    }
                }
                while (!done);
            }
        }
コード例 #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ArrayTypeValue"/> class.
        /// Values are default values
        /// </summary>
        /// <param name="theArrayTypeDefinition">The array type definition.</param>
        /// <param name="parent">The parent.</param>
        public ArrayTypeValue(ArrayTypeDefinition theArrayTypeDefinition, Value parent)
            : base(theArrayTypeDefinition, parent)
        {
            m_ArrayTypeDefinition = theArrayTypeDefinition;

            m_ArrayValues = new ArrayValueContainer(m_ArrayTypeDefinition.UpperBound);

            if (m_ArrayTypeDefinition.Rank > 0)
            {
                // Fixed-size arrays - populate with instantiate elements
                // Variable-size arrays are populated on demand
                m_ArrayValues.Populate(() => m_ArrayTypeDefinition.ElementType.Instantiate(this));
            }
        }
コード例 #3
0
        /// <summary>
        /// Displays the fixed size array value members.
        /// </summary>
        /// <param name="signalText">The signal text.</param>
        /// <param name="indent">The indent.</param>
        /// <param name="valueName">Name of the value.</param>
        /// <param name="arrayTypeValue">The array type value.</param>
        /// <param name="arrayDefinition">The array definition.</param>
        private void DisplayFixedSizeArrayValueMembers(StringBuilder signalText, string indent, string valueName, ArrayTypeValue arrayTypeValue, ArrayTypeDefinition arrayDefinition)
        {
            // Set up a (N-1)-dimensional array to contain sub-arrays. The final Nth dimension holds
            // simple values rather than arrays.
            int[] indices = new int[arrayDefinition.Rank - 1];
            for (int i = 0; i < arrayDefinition.Rank - 1; i++)
            {
                indices[i] = arrayDefinition.UpperBound[i];
            }

            // Iterate over the indices array generating script to create the N-d array
            DepthFirstArrayIterator arrayCreationIterator = new DepthFirstArrayIterator(indices);
            foreach (var item in arrayCreationIterator)
            {
                StringBuilder itemIndexText = new StringBuilder(valueName);
                for (int j = 0; j < item.Length; j++)
                {
                    // Add 1 to index because Lua uses 1-based indices
                    itemIndexText.AppendFormat("[{0}]", item[j] + 1);
                }

                signalText.AppendFormat("{0}{1} = {{}}      -- create empty table/array\n", indent, itemIndexText);
            }

            // Iterate over the values
            arrayTypeValue.Iterate(
                (arrayValue, arrayIndices) =>
                {
                    StringBuilder itemIndexText = new StringBuilder(valueName);
                    for (int i = 0; i < arrayIndices.Length; i++)
                    {
                        // Add 1 to index because Lua uses 1-based indices
                        itemIndexText.AppendFormat("[{0}]", arrayIndices[i] + 1);
                    }

                    EncodeSignalElement(arrayValue, signalText, indent, itemIndexText.ToString());
                });
        }
コード例 #4
0
        /// <summary>
        /// Displays the variable size array value members.
        /// </summary>
        /// <param name="signalText">The signal text.</param>
        /// <param name="prefix">The prefix.</param>
        /// <param name="valueName">Name of the value.</param>
        /// <param name="arrayTypeValue">The array type value.</param>
        /// <param name="arrayDefinition">The array definition.</param>
        private void DisplayVariableSizeArrayValueMembers(StringBuilder signalText, string prefix, string valueName, ArrayTypeValue arrayTypeValue, ArrayTypeDefinition arrayDefinition)
        {
            // Iterate over the values (remembering Lua indices are 1-based
            int index = 1;
            foreach (var item in arrayTypeValue.Values)
            {
                StringBuilder itemIndexText = new StringBuilder(valueName);
                itemIndexText.AppendFormat("[{0}]", index);
                index += 1;

                EncodeSignalElement(item, signalText, prefix, itemIndexText.ToString());
            }
        }