public void CloneChanges(ObservableCollection <MetaField> changedFields, FieldChangeTracker tracker, FieldChangeSet changes) { for (int i = 0; i < changedFields.Count; i++) { MetaField field = changedFields[i]; var reflexive = field as ReflexiveData; bool changed = changes.HasChanged(field); if (field != null && (changed || reflexive != null)) { if (_fields[i] == null) { _fields[i] = field.CloneValue(); tracker.AttachTo(_fields[i]); if (changed) { tracker.MarkChanged(_fields[i]); } tracker.MarkUnchanged(field); if (reflexive != null) { reflexive.ResetPages(); } } else if (field != _fields[i]) { throw new InvalidOperationException("Cannot cache changes in a meta field from a different page"); } } } }
private void ReadField(MetaField field) { // Update the field's memory address var valueField = field as ValueField; if (valueField != null) { valueField.FieldAddress = BaseOffset + valueField.Offset; if (_type == LoadType.File) { valueField.FieldAddress = _cache.MetaArea.OffsetToPointer((int)valueField.FieldAddress); } } // Read its contents if it hasn't changed (or if change detection is disabled) if (_ignoredFields == null || !_ignoredFields.HasChanged(field)) { field.Accept(this); } // If it's a block, read its children var block = field as TagBlockData; if (block != null) { ReadTagBlockChildren(block); } }
public void CloneChanges(ObservableCollection<MetaField> changedFields, FieldChangeTracker tracker, FieldChangeSet changes) { for (int i = 0; i < changedFields.Count; i++) { MetaField field = changedFields[i]; var reflexive = field as ReflexiveData; bool changed = changes.HasChanged(field); if (field != null && (changed || reflexive != null)) { if (_fields[i] == null) { _fields[i] = field.CloneValue(); tracker.AttachTo(_fields[i]); if (changed) tracker.MarkChanged(_fields[i]); tracker.MarkUnchanged(field); if (reflexive != null) reflexive.ResetPages(); } else if (field != _fields[i]) { throw new InvalidOperationException("Cannot cache changes in a meta field from a different page"); } } } }
private void WriteField(MetaField field) { if (_changes == null || _changes.HasChanged(field)) { field.Accept(this); } var block = field as TagBlockData; if (block != null) { WriteTagBlockChildren(block); } }
private void WriteField(MetaField field) { if (_changes == null || _changes.HasChanged(field)) { field.Accept(this); } var reflexive = field as ReflexiveData; if (reflexive != null) { WriteReflexiveChildren(reflexive); } }