protected virtual bool CheckReset() { var anyChange = CheckRemove(); if (!FReset.IsAnyInvalid() && FReset[0]) { Keep.Clear(); anyChange = true; FCountOut.FlushItem <int>(Keep.Count); } return(anyChange); }
// copy and paste from AbstractMessageKeepNode.cs protected virtual bool UpKeep(bool force = false) { if (!force && !Keep.IsChanged) { if (!Keep.QuickMode && FChangeOut.SliceCount != 0) { FChangeOut.FlushNil(); FChangeIndexOut.FlushNil(); } var recentCommits = from message in Keep where message.HasRecentCommit() select message; foreach (var message in recentCommits) { message.Commit(Keep); } return(false); } if (Keep.QuickMode) { Keep.Sync(); } else { IEnumerable <int> indexes; var changes = Keep.Sync(out indexes); FChangeIndexOut.FlushResult(indexes); FChangeOut.FlushResult(changes); } FOutput.FlushResult(Keep); FCountOut.FlushItem <int>(Keep.Count); return(true); }
public void Evaluate(int SpreadMax) { var flow = FFlowControl[0]; FChange.SliceCount = 0; SpreadMax = FInput.SliceCount; if (FForce[0]) { flow = FlowControlEnum.Force; } switch (flow) { case FlowControlEnum.Default: if (FInput.IsChanged && !FInput.IsAnyInvalid()) { FOutput.FlushResult(FInput); FChange.FlushItem(true); } else { FChange.FlushItem(false); } break; case FlowControlEnum.Inspect: if (FInput.IsAnyInvalid()) { FChange.FlushItem(false); break; } var change = FInput.Select(message => message.IsChanged); if (FInput.IsChanged || change.Any()) { if (FFilter[0]) { FOutput.FlushResult(FInput.Where(message => message.IsChanged)); } else { FOutput.FlushResult(FInput); } FChange.FlushResult(change); } else { FChange.FlushResult(Enumerable.Repeat(false, SpreadMax)); } break; case FlowControlEnum.SinceLastFrame: if (FInput.IsAnyInvalid()) { FChange.FlushItem(false); break; } var changed = FInput.Select(message => message.HasRecentCommit()); if (FInput.IsChanged || changed.Any()) { if (FFilter[0]) { FOutput.FlushResult(FInput.Where(message => message.HasRecentCommit())); } else { FOutput.FlushResult(FInput); } FChange.FlushResult(changed); } else { FChange.FlushResult(Enumerable.Repeat(false, SpreadMax)); } break; case FlowControlEnum.Block: FChange.FlushItem(false); break; case FlowControlEnum.Force: FOutput.FlushResult(FInput); FChange.FlushResult(Enumerable.Repeat(true, SpreadMax)); break; default: // all bases covered? FChange.FlushItem <bool>(false); break; } }
public void Evaluate(int SpreadMax) { if (FConfiguration.IsAnyInvalid() || FName.IsAnyInvalid()) { return; } ForceUpdate |= !FUpdate.IsAnyInvalid() && FUpdate[0]; var change = ForceUpdate || FInherits.IsChanged || FName.IsChanged || FConfiguration.IsChanged; if (!ForceUpdate && !change) { if (_lastException != null) { FError.FlushItem(_lastException.ToString()); throw _lastException; } } // untoggle exception. if (_lastException != null) { var tmp = _lastException; FError.FlushItem(_lastException.ToString()); _lastException = null; // assume innocence throw tmp; } if (!change && !ForceUpdate) { return; } FOutput.SliceCount = SpreadMax = FName.SliceCount; var id = this.PluginHost.GetNodePath(false); var reg = MessageFormularRegistry.Context; for (int i = 0; i < SpreadMax; i++) { if (string.IsNullOrWhiteSpace(FName[i])) { _lastException = new ParseFormularException("A Formular cannot have an empty Name."); return; } var config = string.Join(", ", FConfiguration[i]).Split(','); var fields = new List <FormularFieldDescriptor>(); foreach (var def in config) { FormularFieldDescriptor field; try { field = new FormularFieldDescriptor(def.Trim(), true); } catch (ParseFormularException e) { _lastException = e; return; } var match = ( from f in fields where f.Name == field.Name select f ).FirstOrDefault(); if (match != null) { _lastException = new DuplicateFieldException("Cannot add \"" + def + "\" in Formular for [" + FName[i] + "]. Field with the same name already defined.", match, field); return; } else { fields.Add(field); } } var formular = new MessageFormular(FName[i], fields); if (!FInherits.IsAnyInvalid()) { // flatten var allFields = ( from form in FInherits from field in form.FieldDescriptors select field ).Distinct(); foreach (var field in allFields) { if (!formular.CanAppend(field)) { var duplicate = formular[field.Name]; _lastException = new DuplicateFieldException("Cannot add new Field \"" + field.ToString() + "\" to Formular [" + formular.Name + "]. Field is already defined as \"" + duplicate.ToString() + "\".", field, duplicate); return; } else { try { formular.Append(field, true); } catch (DuplicateFieldException e) { _lastException = e; return; } } } } // only register, when update has been hit! if (ForceUpdate) { try { var defined = reg.Define(id, formular); // will raise Change events to inform all formularable nodes if (defined) { FOutput[i] = formular; } } catch (RegistryException e) { _lastException = e; return; } }