public IDisposable EnterElement(ElementInfo elemInfo) { var disposable = new PreviousState { NextElementPos = nextElementPos, LastElementPos = lastElementPos }; disposable.Disposed += (s, e) => { var d = (PreviousState)s; if(nextElementPos < d.LastElementPos) nextElementPos = d.NextElementPos; lastElementPos = d.LastElementPos; }; nextElementPos = elemInfo.DataPos; lastElementPos = elemInfo.DataLength.HasValue ? elemInfo.DataPos + elemInfo.DataLength.Value : ~VIntConsts.UNKNOWN_LENGTH; return disposable; }