public UTree(byte[] store, int count) { _store = store; _root = new UNode(); _activePoint = new ActivePoint(_root, 0, 0); ConstructFromInitialStoreValues(count); }
private void ActiveEdgeWithSymbol() { _activePoint = _activePoint.MoveOneSymbol(); if (_activePoint.PointsToTheEndOfActiveEdge()) { _activePoint = _activePoint.MoveToNextNodeOfActiveEdge(); } }
private void ActiveNodeHasEdgeForSymbol(byte symbol, UNode uNode) { _activePoint.SetSuffixLinkToActiveNodeAndReturnActiveNode(uNode); _activePoint = _activePoint.MoveToEdgeStartingWith(symbol); if (_activePoint.PointsToTheEndOfActiveEdge()) { _activePoint = _activePoint.MoveToNextNodeOfActiveEdge(); } }
private ActivePoint WalkDownTree(int index) { while (!_activePoint.PointsToActiveNode() && (_activePoint.PointsAfterTheEndOfActiveEdge() || _activePoint.PointsToTheEndOfActiveEdge())) { _activePoint = _activePoint.PointsAfterTheEndOfActiveEdge() ? _activePoint.MoveToNextNodeOfActiveEdge(_store, index) : _activePoint.MoveToNextNodeOfActiveEdge(); } return(_activePoint); }
private UNode InternalWithoutEdgeForSymbol(int index, byte symbol, UNode uNode) { _activePoint.AddEdgeToActiveNode(symbol, new UEdge(index, _store.Length, null)); UNode activeUNode = _activePoint.SetSuffixLinkToActiveNodeAndReturnActiveNode(uNode); _activePoint = _activePoint.HasASuffixLink() ? _activePoint.MoveToSuffixLink() : _activePoint.MoveTo(_root); return(activeUNode); }
private UNode EdgeFromRootWithoutSymbol(int index, byte symbol, UNode oldUNode) { UNode newUNode = new UNode(); _activePoint.SplitActiveEdge(_store, newUNode, index, symbol); _activePoint.SetSuffixLinkTo(oldUNode, newUNode); _activePoint = _activePoint.MoveToEdgeStartingWithAndByActiveLengthLessOne(_root, _store[index - _remainder + 2]); _activePoint = WalkDownTree(index); return(newUNode); }
private UNode EdgeFromInternalWithoutSymbol(int index, byte symbol, UNode oldUNode) { UNode newUNode = new UNode(); _activePoint.SplitActiveEdge(_store, newUNode, index, symbol); _activePoint.SetSuffixLinkTo(oldUNode, newUNode); _activePoint = _activePoint.HasASuffixLink() ? _activePoint.MoveToSuffixLink() : _activePoint.MoveTo(_root); _activePoint = WalkDownTree(index); return(newUNode); }
private void RootHasNoEdgeForSymbol(int index, byte symbol) { _activePoint.AddEdgeToActiveNode(symbol, new UEdge(index, _store.Length, null)); _activePoint = _activePoint.MoveTo(_root); }