public void AppendToBack(StringManager anotherStr, int fromIndex) { _internalString += anotherStr._internalString.Substring(fromIndex); _ropeString.AppendToBack(anotherStr._ropeString, fromIndex); if (_ropeString.ToString() != _internalString) throw new InvalidOperationException("Strings are different!"); }
/// <summary> /// Constructor of DNA processor. /// </summary> /// <param name="inputStream">Input stream with source DNA.</param> /// <param name="outputStream">Output stream for produced RNA.</param> public DnaRunner(Stream inputStream, Stream outputStream) { if (inputStream.CanSeek) inputStream.Seek(0, SeekOrigin.Begin); _sourceDna = new StringManager(new StreamReader(inputStream).ReadToEnd()); RnaStream = outputStream; _state = RunningState.Stoped; }
public StringManager Substring(int fromIndex, int length) { var subRopeRope = _ropeString.Substring(fromIndex, length); var subRope = new StringManager(string.Empty) { _internalString = subRopeRope.ToString(), _ropeString = subRopeRope }; var subStr = new StringManager(_internalString.Substring(fromIndex, length)); if (subStr.ToString() != subRope.ToString()) throw new InvalidOperationException("Substring are different!"); return subRope; }
private void Replace(TemplateInfo template, List<StringManager> environment) { var newPrefix = new StringManager(string.Empty); foreach (TemplateItemInfo temp in template) { if (temp.IsBase) { newPrefix.AppendToBack(new StringManager(new string(temp.Symbol, 1)), 0); continue; } if (temp.IsProtect) { if (temp.Reference >= environment.Count) continue; newPrefix.AppendToBack(Protect(temp.Level, environment[temp.Reference]), 0); continue; } if (temp.IsAsNat) { if (temp.Reference >= environment.Count) { newPrefix.AppendToBack(new StringManager(AsNat(0)), 0); continue; } newPrefix.AppendToBack(new StringManager(AsNat(environment[temp.Reference].Length)), 0); continue; } } newPrefix.AppendToBack(_runningDna, _currentIndex); _runningDna = newPrefix; _currentIndex = 0; }
private static StringManager Quote(StringManager str) { var result = new StringManager(string.Empty); for (int index = 0; index < str.Length; ++index) { if (str.HasPatternAtPosition( new[] { "I" }, index)) result.AppendToBack(new StringManager("C"), 0); else if (str.HasPatternAtPosition( new[] { "C" }, index)) result.AppendToBack(new StringManager("F"), 0); else if (str.HasPatternAtPosition( new[] { "F" }, index)) result.AppendToBack(new StringManager("P"), 0); else if (str.HasPatternAtPosition( new[] { "P" }, index)) result.AppendToBack(new StringManager("IC"), 0); } return result; }
private static StringManager Protect(int level, StringManager str) { if (level == 0) return str; return Protect(level - 1, Quote(str)); }
/// <summary> /// Start DNA processing. /// </summary> public void Start() { lock (_runningMutex) { if (_state == RunningState.Running) return; _state = RunningState.Running; } _rnaWriter = new StreamWriter(RnaStream); _runningDna = new StringManager(Prefix); _runningDna.AppendToBack(_sourceDna, 0); _totalCharsOfRna = 0; _totalCommandProcessed = 0; _lastRaisedCharsCountOverEvent = 0; _lastRaisedCommandsCountOverEvent = 0; _currentIndex = 0; _runningThread = new Thread(ProcessDna); _runningThread.Start(); }