protected virtual IEnumerable <string> SolveAnySignal(IComponent component) { //throw new NotImplementedException(); if (component.Type == Constant.CONSTANT) { yield return(((Constant)component).Id + "a"); yield break; } if (component.Type == Splitter.SPLITTER) { SplitterInfo splitterInfo = GetSplitterInfo((Splitter)component); if (!(splitterInfo.LockedSplitter is null)) { yield return(""); yield break; } splitterInfo.AnyCount++; if (splitterInfo.AnyCount == splitterInfo.MaxOutputs) //TODO: Algorithm breaks if not all outputs of the splitter are connected. { foreach (string anySolution in SolveAnySignal(component.Inputs[0])) { yield return(anySolution); } splitterInfo.AnyCount--; yield break; } yield return(""); splitterInfo.AnyCount--; yield break; } if (component.Type == Not.NOT) { foreach (string any in SolveAnySignal(component.Inputs[0])) { yield return(any); } yield break; } //Hard coded two inputs: foreach (string anyLeft in SolveAnySignal(component.Inputs[0])) { foreach (string anyRight in SolveAnySignal(component.Inputs[1])) { yield return(anyLeft + anyRight); } } }
private void UpdateSplitterDistance(SplitterInfo splitterInfo) { if (_splitter.Orientation == Orientation.Horizontal) { _splitter.SplitterDistance = ViewsManager.GetChildDimensionFromPercentage(_splitter.Height, splitterInfo.HorizontalPercentage); } else { _splitter.SplitterDistance = ViewsManager.GetChildDimensionFromPercentage(_splitter.Width, splitterInfo.VerticalPercentage); } }
private void UpdateSplitterInfo(SplitterInfo splitterInfo) { if (_splitter.Orientation == Orientation.Horizontal) { splitterInfo.HorizontalPercentage = ViewsManager.GetChildPercentageFromDimension(_splitter.Height, _splitter.SplitterDistance); } else { splitterInfo.VerticalPercentage = ViewsManager.GetChildPercentageFromDimension(_splitter.Width, _splitter.SplitterDistance); } }
protected SplitterInfo GetSplitterInfo(Splitter splitter) { if (_splitterInfoLookup.TryGetValue(splitter, out SplitterInfo splitterInfo)) { return(splitterInfo); } splitterInfo = new SplitterInfo(splitter.MaxOutputs); _splitterInfoLookup.Add(splitter, splitterInfo); return(splitterInfo); }
private IEnumerable <string> SolveSplitter(bool requestedSignal, IComponent splitter) { SplitterInfo splitterInfo = GetSplitterInfo((Splitter)splitter); IComponent input = splitter.Inputs[0]; if (splitterInfo.LockedSplitter is null) { splitterInfo.LockedSplitter = requestedSignal; foreach (string solution in Solve(requestedSignal, input)) { yield return(solution); } splitterInfo.LockedSplitter = null; yield break; } if (splitterInfo.LockedSplitter != requestedSignal) { yield break; } yield return(""); }