public ManyWritersManyReadersOneReader(uint bufferPower, int maxSequenceValue, bool delay) { _maxSequenceValue = maxSequenceValue; _delay = delay; _buffer = new RingBuffer <int>(bufferPower); _waitStrategy = new BlockingWaitStrategy(); // init _committer = new ConcurrentRingBufferWriter(_buffer.Size, _waitStrategy); _journaler = new RingBufferReader(_waitStrategy); _replicator = new RingBufferReader(_waitStrategy); _processor = new RingBufferReader(_waitStrategy); // setup _committer.DependsOn(_processor); _journaler.DependsOn(_committer); _replicator.DependsOn(_committer); _processor.DependsOn(_journaler, _replicator); }
public IEnumerable <SearchResult> Search(FileProvider provider, TextReader reader, string pattern, FilterOptions filter) { if (reader == null) { yield break; } int i = provider.SelectionStartPosition < 0 ? 0 : Math.Max(0, provider.SelectionStartPosition); var buffer = new RingBufferReader(reader, pattern.Length + 2); bool wasSeparator = true; if (!filter.CaseSensitive) { pattern = pattern.ToUpperInvariant(); } while (true) { int next = buffer.Next(); if (next < 0) { yield break; } char ch = (char)next; if ((filter.CaseSensitive ? ch : char.ToUpperInvariant(ch)) == pattern [0] && (!filter.WholeWordsOnly || wasSeparator)) { bool isMatch = true; for (int j = 1; j < pattern.Length; j++) { next = buffer.Next(); if (next < 0) { yield break; } if ((filter.CaseSensitive ? next : char.ToUpperInvariant((char)next)) != pattern [j]) { buffer.TakeBack(j); isMatch = false; break; } } if (isMatch) { if (filter.WholeWordsOnly) { next = buffer.Next(); if (next >= 0 && !FilterOptions.IsWordSeparator((char)next)) { buffer.TakeBack(pattern.Length); i++; continue; } buffer.TakeBack(1); } yield return(new SearchResult(provider, i, pattern.Length)); i += pattern.Length - 1; } } i++; if (filter.WholeWordsOnly) { wasSeparator = FilterOptions.IsWordSeparator((char)ch); } } }
public IEnumerable<SearchResult> Search (FileProvider provider, TextReader reader, string pattern, FilterOptions filter) { if (reader == null) yield break; int i = provider.SelectionStartPosition < 0 ? 0 : Math.Max (0, provider.SelectionStartPosition); var buffer = new RingBufferReader(reader, pattern.Length + 2); bool wasSeparator = true; if (!filter.CaseSensitive) pattern = pattern.ToUpperInvariant (); while (true) { int next = buffer.Next (); if (next < 0) yield break; char ch = (char)next; if ((filter.CaseSensitive ? ch : char.ToUpperInvariant (ch)) == pattern [0] && (!filter.WholeWordsOnly || wasSeparator)) { bool isMatch = true; for (int j = 1; j < pattern.Length; j++) { next = buffer.Next (); if (next < 0) yield break; if ((filter.CaseSensitive ? next : char.ToUpperInvariant ((char)next)) != pattern [j]) { buffer.TakeBack (j); isMatch = false; break; } } if (isMatch) { if (filter.WholeWordsOnly) { next = buffer.Next (); if (next >= 0 && !FilterOptions.IsWordSeparator ((char)next)) { buffer.TakeBack (pattern.Length); i++; continue; } buffer.TakeBack (1); } yield return new SearchResult (provider, i, pattern.Length); i += pattern.Length - 1; } } i++; if (filter.WholeWordsOnly) { wasSeparator = FilterOptions.IsWordSeparator ((char)ch); } } }