Пример #1
0
        public TextOccurences(string text, TreapBuilder positions)
        {
            if (text == null) throw new ArgumentNullException("text");
            if (positions == null) throw new ArgumentNullException("positions");

            _text = text;
            _textLength = text.Length;
            _positions = positions.ToTreap();
            _count = positions.Count;
        }
Пример #2
0
        public void ReplaceMarks(TextOccurences occurences, int start, int end, int tailOffset)
        {
            if (occurences == null)
            {
                throw new ArgumentNullException("occurences");
            }

            lock (_marksSyncRoot)
            {
                if (_positions == null)
                {
                    ReplaceMarks(occurences);
                    return;
                }

                Treap markThatContainsStart = FindMarkThatContainsPosition(_positions, start);
                if (markThatContainsStart != null)
                {
                    start = markThatContainsStart.x;
                }

                Treap right   = null;
                Treap garbage = null;
                _positions.Split(start - 1, out _positions, out right);

                if (right != null)
                {
                    right.Split(end, out garbage, out right);
                }

                if (garbage != null)
                {
                    garbage.ForEachInOrder(IncludeTextToScreenUpdate);
                }

                if (occurences != TextOccurences.Empty && occurences.Count > 0)
                {
                    _markLength = occurences.TextLength;
                    occurences.Positions.ForEachInOrder(IncludeTextToScreenUpdate);
                    _positions = Treap.Merge(_positions, occurences.Positions);
                }

                if (right != null)
                {
                    TreapBuilder shiftedMarks = new TreapBuilder();
                    right.ForEachInOrder((x) => { shiftedMarks.Add(x + tailOffset); });
                    _positions = Treap.Merge(_positions, shiftedMarks.ToTreap());
                }
            }
        }
Пример #3
0
        public TextOccurences(string text, TreapBuilder positions)
        {
            if (text == null)
            {
                throw new ArgumentNullException("text");
            }
            if (positions == null)
            {
                throw new ArgumentNullException("positions");
            }

            _text       = text;
            _textLength = text.Length;
            _positions  = positions.ToTreap();
            _count      = positions.Count;
        }
Пример #4
0
        public void ReplaceMarks(TextOccurences occurences, int start, int end, int tailOffset)
        {
            if (occurences == null) throw new ArgumentNullException("occurences");

            lock (_marksSyncRoot)
            {
                if (_positions == null)
                {
                    ReplaceMarks(occurences);
                    return;
                }

                Treap markThatContainsStart = FindMarkThatContainsPosition(_positions, start);
                if (markThatContainsStart != null)
                {
                    start = markThatContainsStart.x;
                }

                Treap right = null;
                Treap garbage = null;
                _positions.Split(start - 1, out _positions, out right);

                if (right != null)
                {
                    right.Split(end, out garbage, out right);
                }

                if (garbage != null)
                {
                    garbage.ForEachInOrder(IncludeTextToScreenUpdate);
                }

                if (occurences != TextOccurences.Empty && occurences.Count > 0)
                {
                    _markLength = occurences.TextLength;
                    occurences.Positions.ForEachInOrder(IncludeTextToScreenUpdate);
                    _positions = Treap.Merge(_positions, occurences.Positions);
                }

                if (right != null)
                {
                    TreapBuilder shiftedMarks = new TreapBuilder();
                    right.ForEachInOrder((x) => { shiftedMarks.Add(x + tailOffset); });
                    _positions = Treap.Merge(_positions, shiftedMarks.ToTreap());
                }
            }
        }