protected IEnumerable <HexSpan> GetValidSpans(HexBuffer buffer, HexPosition start, HexPosition upperBounds)
        {
            var  pos      = start;
            bool fullSpan = true;

            while (pos < HexPosition.MaxEndPosition)
            {
                var span = buffer.GetNextValidSpan(pos, upperBounds, fullSpan);
                if (span == null)
                {
                    break;
                }

                var newStart = HexPosition.Max(pos, span.Value.Start);
                var newEnd   = HexPosition.Min(upperBounds, span.Value.End);
                if (newStart < newEnd)
                {
                    yield return(HexSpan.FromBounds(newStart, newEnd));
                }

                pos      = span.Value.End;
                fullSpan = false;
            }
        }