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);
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
0
		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);
				}
			}
		}