Example #1
0
        /// <summary>
        ///   Initializes a new ArrayDataView from array.
        /// </summary>
        ///
        /// <param name="array">array of data.</param>
        ///
        public ArrayDataView(Array array)
        {
            if (array.Rank > 2)
            {
                throw new ArgumentException("Supports only up to two dimentional arrays", "array");
            }

            this.data = array;

            if (array.Rank == 2)
            {
                rowCount = array.GetLength(0);
                colCount = array.GetLength(1);
                type     = ArrayDataType.Multidimensional;

                rows = new ArrayRowView[rowCount];

                for (int i = 0; i < rows.Length; i++)
                {
                    rows[i] = new ArrayRowView(this, i);
                }
            }
            else
            {
                rowCount = 1;
                colCount = array.GetLength(0);
                rows     = new ArrayRowView[] { new ArrayRowView(this, 0) };
                type     = ArrayDataType.Simple;
            }
        }
        protected override LambdaExpression MakeArray(ArrayDataType type, LambdaExpression elementType)
        {
            if (!type.UnderlyingType.IsArray)
            {
                return(MakeList(type, elementType));
            }

            var streamParameter = Expression.Parameter(typeof(Stream), "stream");
            var resultParameter = Expression.Parameter(type.UnderlyingType, "result");
            var lengthParameter = Expression.Parameter(typeof(int), "length");
            var loopParameter   = Expression.Parameter(typeof(int), "i");
            var tcParameter     = Expression.Parameter(typeof(byte), "tc");

            var serializerParameter = default(ParameterExpression);
            var innerInvoke         = MakeInnerDeserialize(elementType, streamParameter, ref serializerParameter);

            var typeCode         = Protocol.TYPE_ARRAY;
            var typeCodeConstant = Expression.Constant(typeCode, typeof(byte));
            var body             = Expression.Block(
                // byte tc;
                // T[] result;
                new[] { tcParameter, resultParameter },
                // tc = stream.ReadByte();
                Expression.Assign(tcParameter, Expression.Call(ReflectionConstants.ReadByte, streamParameter)),
                // if (tc & typeCode != typeCode) throw new InvalidDataException("Unexpected type code.");
                Expression.IfThen(
                    Expression.NotEqual(Expression.And(tcParameter, typeCodeConstant), typeCodeConstant),
                    ReflectionConstants.ThrowUnexpectedTypeCode
                    ),
                // if (tc & Protocol.TYPE_FLAG_NULLVALUE == Protocol.TYPE_FLAG_NULLVALUE) return null;
                Expression.Condition(
                    Expression.Equal(Expression.And(tcParameter, ReflectionConstants.NullValueFlag), ReflectionConstants.NullValueFlag),
                    Expression.Convert(ReflectionConstants.NullObject, type.UnderlyingType),
                    // else {
                    Expression.Block(
                        // int length, i;
                        new[] { lengthParameter, loopParameter },
                        // length = (int)stream.ReadUInt32Compact();
                        Expression.Assign(lengthParameter, Expression.ConvertChecked(Expression.Call(ReflectionConstants.ReadIntCompact, streamParameter), typeof(int))),
                        // result = new T[length];
                        Expression.Assign(resultParameter, Expression.NewArrayBounds(type.ElementType.UnderlyingType, lengthParameter)),
                        // var i = 0; while (true) { if (i < length) { result[i] = /* ... deserialize inner ... */; i++; } else { break; } }
                        ExpressionHelpers.For(
                            Expression.Assign(loopParameter, ReflectionConstants.ZeroInt32),
                            Expression.LessThan(loopParameter, lengthParameter),
                            Expression.PreIncrementAssign(loopParameter),
                            Expression.Assign(Expression.ArrayAccess(resultParameter, loopParameter), innerInvoke)
                            ),
                        // return result;
                        resultParameter
                        )
                    // }
                    )
                );

            return(serializerParameter == null
                ? Expression.Lambda(body, streamParameter)
                : Expression.Lambda(body, serializerParameter, streamParameter));
        }
Example #3
0
        private TypeInfo CreateArrayType(ArrayDataType arrayType)
        {
            var result = new ArrayTypeInfo(arrayType.IsUnique, arrayType.IsOptional);

            SetTypeInfoDelayed(arrayType.ElementType, result.SetElementType);

            return(result);
        }
Example #4
0
 void WriteZeroDefaultValuesForArrays(StreamWriter writer, ArrayDataType datatype)
 {
     writer.Write("{ { ");
     for (int i = 0; i < datatype.Size; i++)
     {
         WriteZeroDefaultValue(writer, datatype.DataType);
         if (i < datatype.Size - 1)
         {
             writer.Write(", ");
         }
     }
     writer.Write(" } }");
 }
        /// <summary>
        /// Checks if a constant can be converted from one array data type to another.
        /// </summary>
        /// <param name="newValue">Value to convert.</param>
        /// <param name="oldDataType">Old data type.</param>
        protected virtual void CheckConstantArray(Object newValue, ArrayDataType oldDataType)
        {
            var oldArray = oldDataType.GetList(newValue.Value);

            if (!Helpers.TryGetElementType(newValue.TypeSlim, out var newElementType))
            {
                throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Cannot convert constant of type '{0}' to type '{1}'.", oldDataType.UnderlyingType.ToCSharpStringPretty(), newValue.TypeSlim));
            }

            for (var i = 0; i < oldArray.Count; i++)
            {
                var oldElement = Object.Create(oldArray[i], newElementType, oldDataType.UnderlyingType);
                CheckConstant(oldElement, oldDataType.ElementType);
            }
        }
Example #6
0
        /// <summary>
        ///   Initializes a new ArrayDataView from array with custom column names.
        /// </summary>
        ///
        /// <param name="array">array of data.</param>
        /// <param name="columnNames">collection of column names.</param>
        ///
        public ArrayDataView(Array array, object[] columnNames)
            : this(array)
        {
            if (array.Rank == 2)
            {
                if (columnNames.Length != array.GetLength(1))
                {
                    throw new ArgumentException("column names must correspond to array columns.", "columnNames");
                }

                rowCount = array.GetLength(0);
                colCount = array.GetLength(1);
                type     = ArrayDataType.Multidimensional;
            }
            else
            {
                if (array.GetValue(0) is Array)
                {
                    Array row = array.GetValue(0) as Array;
                    if (columnNames.Length != row.GetLength(0))
                    {
                        throw new ArgumentException("column names must correspond to array columns.", "columnNames");
                    }

                    rowCount = array.GetLength(0);
                    colCount = row.GetLength(0);
                    type     = ArrayDataType.Jagged;
                }
                else
                {
                    if (columnNames.Length != array.GetLength(0))
                    {
                        throw new ArgumentException("column names must correspond to array columns.", "columnNames");
                    }

                    rowCount = 1;
                    colCount = array.GetLength(0);
                    type     = ArrayDataType.Simple;
                }
            }

            this.columnNames = new string[columnNames.Length];
            for (int i = 0; i < columnNames.Length; i++)
            {
                this.columnNames[i] = columnNames[i].ToString();
            }
        }
Example #7
0
        internal static void ReadDataFromSpectrumNavigator(XPathNodeIterator binaryDataArrayChildNodes, out double[] mz, out double[] intensity)
        {
            mz = null;
            intensity = null;

            int word_length_in_bytes = 0;
            bool zlib_compressed = false;
            ArrayDataType array_data_type = ArrayDataType.Unknown;
            foreach(XPathNavigator navigator in binaryDataArrayChildNodes)
            {
                if(navigator.Name.Equals("cvParam", StringComparison.OrdinalIgnoreCase))
                {
                    if(navigator.GetAttribute("name", string.Empty).Equals("32-bit float", StringComparison.OrdinalIgnoreCase))
                    {
                        word_length_in_bytes = 4;
                    }
                    else if(navigator.GetAttribute("name", string.Empty).Equals("64-bit float", StringComparison.OrdinalIgnoreCase))
                    {
                        word_length_in_bytes = 8;
                    }
                    else if(navigator.GetAttribute("name", string.Empty).Equals("zlib compression", StringComparison.OrdinalIgnoreCase))
                    {
                        zlib_compressed = true;
                    }
                    else if(navigator.GetAttribute("name", string.Empty).Equals("m/z array", StringComparison.OrdinalIgnoreCase))
                    {
                        array_data_type = ArrayDataType.MZ;
                    }
                    else if(navigator.GetAttribute("name", string.Empty).Equals("intensity array", StringComparison.OrdinalIgnoreCase))
                    {
                        array_data_type = ArrayDataType.Intensity;
                    }
                }
                else if(navigator.Name.Equals("binary", StringComparison.OrdinalIgnoreCase))
                {
                    if(array_data_type == ArrayDataType.MZ)
                    {
                        mz = ReadBase64EncodedDoubleArray(navigator.InnerXml, word_length_in_bytes, zlib_compressed);
                    }
                    else if(array_data_type == ArrayDataType.Intensity)
                    {
                        intensity = ReadBase64EncodedDoubleArray(navigator.InnerXml, word_length_in_bytes, zlib_compressed);
                    }
                }
            }
        }
Example #8
0
        private void AddArrayDataTypeMenu_Click(object sender, RoutedEventArgs e)
        {
            string ArrayDataTypeTemplateName = "New_ArrayDataType";

            if (autosarApp.ArrayDataTypes.FindObject(ArrayDataTypeTemplateName) != null)
            {
                int index = 0;
                while (autosarApp.ComplexDataTypes.FindObject(ArrayDataTypeTemplateName) != null)
                {
                    index++;
                    ArrayDataTypeTemplateName = "New_ArrayDataType" + index.ToString();
                }
            }

            ArrayDataType datatype = DataTypeFabric.Instance().CreateArrayDataType(ArrayDataTypeTemplateName);

            autosarApp.ArrayDataTypes.Add(datatype);
            AutosarTree.UpdateAutosarTreeView(datatype);
            AutosarTree.Focus();
        }
        public IGUID GetDataType(Guid GUID)
        {
            BaseDataType baseDatatype = BaseDataTypes.FindObject(GUID);

            if (baseDatatype != null)
            {
                return(baseDatatype);
            }

            SimpleDataType simpleDataType = SimpleDataTypes.FindObject(GUID);

            if (simpleDataType != null)
            {
                return(simpleDataType);
            }

            ComplexDataType complexDataType = ComplexDataTypes.FindObject(GUID);

            if (complexDataType != null)
            {
                return(complexDataType);
            }

            EnumDataType enumDataType = Enums.FindObject(GUID);

            if (enumDataType != null)
            {
                return(enumDataType);
            }

            ArrayDataType arrayDataType = ArrayDataTypes.FindObject(GUID);

            if (arrayDataType != null)
            {
                return(arrayDataType);
            }

            return(null);
        }
        public String GetDataTypeName(Guid GUID)
        {
            ArrayDataType arrayDatatype = ArrayDataTypes.FindObject(GUID);

            if (arrayDatatype != null)
            {
                return(arrayDatatype.Name);
            }

            BaseDataType baseDatatype = BaseDataTypes.FindObject(GUID);

            if (baseDatatype != null)
            {
                return(baseDatatype.Name);
            }

            SimpleDataType simpleDataType = SimpleDataTypes.FindObject(GUID);

            if (simpleDataType != null)
            {
                return(simpleDataType.Name);
            }

            ComplexDataType complexDataType = ComplexDataTypes.FindObject(GUID);

            if (complexDataType != null)
            {
                return(complexDataType.Name);
            }

            EnumDataType enumDataType = Enums.FindObject(GUID);

            if (enumDataType != null)
            {
                return(enumDataType.Name);
            }

            return(ErrorDataType);
        }
        /// <summary>
        /// Converts a constant from one array data type to another.
        /// </summary>
        /// <param name="originalValue">Original value to convert.</param>
        /// <param name="oldDataType">Old data type.</param>
        /// <param name="newDataType">New data type.</param>
        /// <returns>Converted constant.</returns>
        protected virtual object ConvertConstantArray(object originalValue, ArrayDataType oldDataType, ArrayDataType newDataType)
        {
            var oldArray = oldDataType.GetList(originalValue);
            var newArray = (IList)newDataType.CreateInstance(oldArray.Count);

            ConstantsMap[originalValue] = newArray; // Allow cycles

            for (var i = 0; i < oldArray.Count; i++)
            {
                var oldElement = oldArray[i];
                var newElement = ConvertConstant(oldElement, oldDataType.ElementType, newDataType.ElementType);

                if (newArray.IsFixedSize)
                {
                    newArray[i] = newElement;
                }
                else
                {
                    newArray.Add(newElement);
                }
            }

            return(newArray);
        }
Example #12
0
 internal DataBlockDefinition(BlockDefinition blockDef, ArrayDataType dataType)
     : base(blockDef.Module, blockDef.Id, blockDef.Offset, blockDef.Length)
 {
     DataType = dataType;
 }
Example #13
0
        /// <summary>
        ///   Initializes a new ArrayDataView from array.
        /// </summary>
        /// 
        /// <param name="array">array of data.</param>
        /// 
        public ArrayDataView(Array array)
        {
            if (array.Rank > 2)
                throw new ArgumentException("Supports only up to two dimensional arrays", "array");

            this.data = array;

            if (array.Rank == 2)
            {
                rowCount = array.GetLength(0);
                colCount = array.GetLength(1);
                type = ArrayDataType.Multidimensional;
            }
            else
            {
                if (array.GetValue(0) is Array)
                {
                    Array row = array.GetValue(0) as Array;

                    rowCount = array.GetLength(0);
                    colCount = row.GetLength(0);
                    type = ArrayDataType.Jagged;
                }
                else
                {
                    rowCount = 1;
                    colCount = array.GetLength(0);
                    type = ArrayDataType.Simple;
                }
            }

            rows = new ArrayRowView[rowCount];
            for (int i = 0; i < rows.Length; i++)
                rows[i] = new ArrayRowView(this, i);
        }
Example #14
0
 public ArrayDataType CreateArrayDataType(string Name)
 {
     ArrayDataType datatype = new ArrayDataType();
     datatype.Name = Name;
     return datatype;
 }
Example #15
0
        /// <summary>
        ///   Initializes a new ArrayDataView from array with custom column names.
        /// </summary>
        /// 
        /// <param name="array">Array of data.</param>
        /// <param name="columnNames">Collection of column names.</param>
        /// <param name="rowNames">Collecion of row names.</param>
        /// 
        public ArrayDataView(Array array, object[] columnNames, object[] rowNames)
            : this(array)
        {
            if (array.Rank == 2)
            {
                if (columnNames.Length != array.GetLength(1))
                    throw new ArgumentException("Column names must correspond to array columns.", "columnNames");
                
                if (rowNames.Length != array.GetLength(0)) 
                    throw new ArgumentException("Row names must correspond to array rows.", "rowNames");

                rowCount = array.GetLength(0);
                colCount = array.GetLength(1);
                type = ArrayDataType.Multidimensional;
            }
            else
            {
                if (array.GetValue(0) is Array)
                {
                    Array row = array.GetValue(0) as Array;

                    if (columnNames.Length != row.GetLength(0))
                        throw new ArgumentException("column names must correspond to array columns.", "columnNames");

                    if (rowNames.Length != array.GetLength(0))
                        throw new ArgumentException("Row names must correspond to array rows.", "rowNames");

                    rowCount = array.GetLength(0);
                    colCount = row.GetLength(0);
                    type = ArrayDataType.Jagged;
                }
                else
                {
                    if (columnNames.Length != array.GetLength(0))
                        throw new ArgumentException("column names must correspond to array columns.", "columnNames");
                    if (rowNames.Length != 1)
                        throw new ArgumentException("Row names must correspond to array rows.", "rowNames");

                    rowCount = 1;
                    colCount = array.GetLength(0);
                    type = ArrayDataType.Simple;
                }
            }

            this.columnNames = new string[columnNames.Length];
            for (int i = 0; i < columnNames.Length; i++)
                this.columnNames[i] = columnNames[i].ToString();

            this.rowNames = new string[rowNames.Length];
            for (int i = 0; i < rowNames.Length; i++)
                this.rowNames[i] = rowNames[i].ToString();
        }
 public bool Delete(ArrayDataType arrayDataType)
 {
     arrayDataTypes.Remove(arrayDataType);
     return(true);
 }
Example #17
0
 public virtual void VisitArrayDataType(ArrayDataType arrayDataType)
 {
     DefaultVisit(arrayDataType);
 }
Example #18
0
 protected override Type MakeArray(ArrayDataType type, Type elementType)
 {
     return(elementType.MakeArrayType());
 }
Example #19
0
 public DataBlockDefinition AsData(ArrayDataType elementDataType) => new DataBlockDefinition(this, elementDataType);