using System.Collections.Generic; using System.Linq; using ZoneCodeGenerator.Domain; using ZoneCodeGenerator.Domain.FastFileStructure; using ZoneCodeGenerator.Domain.Information; namespace ZoneCodeGenerator.Persistence { class InMemoryDataRepository : IDataRepository { private readonly List typedefs; private readonly List enums; private readonly List structs; private readonly List unions; private readonly List structureInformationList; private readonly List blocks; public InMemoryDataRepository() { typedefs = new List(); enums = new List(); structs = new List(); unions = new List(); structureInformationList = new List(); blocks = new List(); } public void Add(DataTypeEnum data) { enums.Add(data); } public void Add(DataTypeTypedef data) { typedefs.Add(data); } public void Add(FastFileBlock block) { blocks.Add(block); } public void Add(DataTypeStruct data) { structs.Add(data); } public void Add(DataTypeUnion data) { unions.Add(data); } public IEnumerable GetAllEnums() { return enums.AsEnumerable(); } public IEnumerable GetAllStructs() { return structs.AsEnumerable(); } public IEnumerable GetAllTypedefs() { return typedefs.AsEnumerable(); } public IEnumerable GetAllStructureInformation() { return structureInformationList.AsEnumerable(); } public IEnumerable GetAllFastFileBlocks() { return blocks.AsEnumerable(); } public IEnumerable GetAllUnions() { return unions.AsEnumerable(); } public DataType GetDataTypeByName(string name) { DataType data = enums.Find(_enum => _enum.FullName.Equals(name)); if (data != null) return data; data = structs.Find(_struct => _struct.FullName.Equals(name)); if (data != null) return data; data = unions.Find(_struct => _struct.FullName.Equals(name)); if (data != null) return data; data = typedefs.Find(typeDef => typeDef.FullName.Equals(name)); return data; } public StructureInformation GetInformationFor(DataTypeWithMembers dataTypeWithMembers) { var information = structureInformationList.Find(listEntry => listEntry.Type == dataTypeWithMembers); if (information == null) { information = new StructureInformation(dataTypeWithMembers); structureInformationList.Add(information); foreach (var member in dataTypeWithMembers.Members) { StructureInformation memberStructureInformation = null; if (member.VariableType.Type is DataTypeWithMembers memberType) { memberStructureInformation = GetInformationFor(memberType); } information.OrderedMembers.Add(new MemberInformation(member, memberStructureInformation)); } } return information; } } }