public static bool SortDependenciedCDT(ComplexDataTypesList datatypes) { /* Select dependencies */ int IterationCount = 0; bool hasDependencyLower = true; while (hasDependencyLower && (IterationCount < 100)) { IterationCount++; hasDependencyLower = false; for (int i = 0; i < datatypes.Count - 1; i++) { /* Find max dependency index */ int maxDependency = findMaxDependency(datatypes, datatypes[i], i); /* if there is dependency then move the datatype after dependency and start cycle again */ if (maxDependency != -1) { ComplexDataType cdt = datatypes[i]; datatypes.RemoveAt(i); datatypes.Insert(maxDependency, cdt); hasDependencyLower = true; break; } } } return IterationCount < 100; }
public void GenerateDataTypesFile(String folder) { String FileName = folder + "\\" + Properties.Resources.RTE_DATATYPES_H_FILENAME; StreamWriter writer = new StreamWriter(FileName); RteFunctionsGenerator.GenerateFileTitle(writer, Properties.Resources.RTE_DATATYPES_H_FILENAME, Properties.Resources.DATATYPES_H_FILE_DESCRIPTION); String guardDefine = RteFunctionsGenerator.OpenGuardDefine(writer); writer.WriteLine(); RteFunctionsGenerator.AddInclude(writer, Properties.Resources.RTE_RETURN_CODES_FILENAME); writer.WriteLine(); WriteStaticGlobal(writer); WriteBaseDataTypes(writer); WriteEnumDataTypes(writer); WriteSimpleDataTypes(writer); ComplexDataTypesList sortedComplexDataTypes = SortComplexDataTypeWithDependencies(); WriteComplexDataTypes(sortedComplexDataTypes, writer); GenerateComponentsDataTypes(writer); RteFunctionsGenerator.CloseGuardDefine(writer); RteFunctionsGenerator.WriteEndOfFile(writer); writer.Close(); }
public void WriteComplexDataTypes(ComplexDataTypesList datatypes, StreamWriter writer) { writer.WriteLine("/* Complex data types */"); writer.WriteLine(""); foreach (ComplexDataType datatype in datatypes) { WriteComplexDataType(writer, datatype); } }
public static void RemoveDataTypesWithoutDependencies(ComplexDataTypesList allComplexDataTypes) { for (int i = allComplexDataTypes.Count - 1; i >= 0; i--) { /* If component doesn't have dependencies to other complex data types remove it from list */ if (isComplexDataTypeWithoutDependenciesToOtherCDT(allComplexDataTypes[i]) == true) { allComplexDataTypes.RemoveAt(i); } } }
static bool isComplexDataTypeWithoutDependenciesToOtherCDT(ComplexDataType cdt) { ComplexDataTypesList allCDT = AutosarApplication.GetInstance().ComplexDataTypes; foreach(ComplexDataTypeField field in cdt.Fields) { ComplexDataType findedCDT = allCDT.FindObject(field.DataTypeGUID); if (findedCDT != null) { return false; } } return true; }
static int findMaxDependency(ComplexDataTypesList datatypes, ComplexDataType currentDataType, int startIndex) { int maxDependency = -1; foreach (ComplexDataTypeField field in currentDataType.Fields) { for (int i = startIndex; i < datatypes.Count; i++) { if (field.DataTypeGUID.Equals(datatypes[i].GUID)) { if (maxDependency < i) { maxDependency = i; } } } } return maxDependency; }
void TestForComplexDependency() { ComplexDataTypesList allCDT = new ComplexDataTypesList(); allCDT.Capacity = autosarApp.ComplexDataTypes.Count; allCDT.AddRange(autosarApp.ComplexDataTypes); RteDataTypesGenerator.RemoveDataTypesWithoutDependencies(allCDT); bool result = RteDataTypesGenerator.SortDependenciedCDT(allCDT); if (!result) { String strRes = "There are recursion dependencies in components: " + Environment.NewLine; foreach (ComplexDataType cdt in allCDT) { strRes += cdt.Name + Environment.NewLine; } AppendText(strRes, Error: true); } }
ComplexDataTypesList SortComplexDataTypeWithDependencies() { /* Base list */ ComplexDataTypesList allComplexDataTypes = new ComplexDataTypesList(); allComplexDataTypes.Capacity = AutosarApplication.GetInstance().ComplexDataTypes.Count; ComplexDataTypesList sortedComplexDataTypes = new ComplexDataTypesList(); sortedComplexDataTypes.Capacity = AutosarApplication.GetInstance().ComplexDataTypes.Count; allComplexDataTypes.AddRange(AutosarApplication.GetInstance().ComplexDataTypes); /* First shall be structures without dependencies to complex datatypes */ for (int i = allComplexDataTypes.Count - 1; i >= 0; i--) { /* If component doesn't have dependencies to other complex data types remove it from list */ if (isComplexDataTypeWithoutDependenciesToOtherCDT(allComplexDataTypes[i]) == true) { sortedComplexDataTypes.Add(allComplexDataTypes[i]); allComplexDataTypes.RemoveAt(i); } } sortedComplexDataTypes.DoSort(); bool sortingCDTResult = SortDependenciedCDT(allComplexDataTypes); if (sortingCDTResult == false) { String strRes = "Imposible to generate RTE because there is recursion dependencies in components: " + Environment.NewLine; foreach(ComplexDataType cdt in allComplexDataTypes) { strRes += cdt.Name + Environment.NewLine; } MessageBox.Show(strRes); } sortedComplexDataTypes.AddRange(allComplexDataTypes); return sortedComplexDataTypes; }