private ModuleData(TreeNode logicalSchemaRoot) { var schema = logicalSchemaRoot.Container.Schema; var fieldContainers = logicalSchemaRoot.DescendantFieldContainers().ToList(); originalSegmentsByFieldContainer = new Dictionary <FieldContainer, DataSegment>(); // First populate the containers var fieldMap = new SortedDictionary <FieldContainer, IReadOnlyList <IDataField> >(FieldContainer.AddressComparer); foreach (var fieldContainer in fieldContainers) { fieldMap[fieldContainer] = fieldContainer.Fields.ToReadOnlyList(field => DataFieldBase.CreateDataField(field, schema)); originalSegmentsByFieldContainer[fieldContainer] = new DataSegment(fieldContainer.Address, new byte[fieldContainer.Size]); } fieldsByFieldContainer = fieldMap; IEnumerable <DataFieldBase> allFields = fieldsByFieldContainer.SelectMany(pair => pair.Value).Cast <DataFieldBase>(); // Now resolve fields foreach (var pair in fieldsByFieldContainer) { foreach (var field in pair.Value.Cast <DataFieldBase>()) { field.ResolveFields(this, pair.Key); } } // Reset all fields to default values. foreach (var pair in fieldsByFieldContainer) { foreach (var field in pair.Value) { field.Reset(); } } // Note: must populate this *after* containers. LogicalRoot = new DataTreeNode(this, logicalSchemaRoot); }
private ModuleData(TreeNode logicalSchemaRoot) { PhysicalRoot = logicalSchemaRoot.Container; if (!(PhysicalRoot is ContainerBase containerBase)) { throw new ArgumentException("Invalid root for ModuleData"); } var schema = PhysicalRoot.Schema; var fieldContainers = containerBase.DescendantsAndSelf().OfType <FieldContainer>().ToList(); // First populate the containers var fieldMap = new SortedDictionary <FieldContainer, IReadOnlyList <IDataField> >(FieldContainer.AddressComparer); foreach (var fieldContainer in fieldContainers) { fieldMap[fieldContainer] = fieldContainer.Fields.ToReadOnlyList(field => DataFieldBase.CreateDataField(field, schema)); } fieldsByFieldContainer = fieldMap; IEnumerable <DataFieldBase> allFields = fieldsByFieldContainer.SelectMany(pair => pair.Value).Cast <DataFieldBase>(); // Now resolve fields foreach (var pair in fieldsByFieldContainer) { foreach (var field in pair.Value.Cast <DataFieldBase>()) { field.ResolveFields(this, pair.Key); } } // Reset all fields to default values. foreach (var pair in fieldsByFieldContainer) { foreach (var field in pair.Value) { field.Reset(); } } // Note: must populate this *after* containers. LogicalRoot = new DataTreeNode(this, logicalSchemaRoot); }