/// <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); } }
/// <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)); } }
/// <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()); }); }
/// <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()); } }