StringTextSource
Char array based immutable text source
using AngleSharp.Common;
using System;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AngleSharp.Text
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public sealed class StringTextSource : IReadOnlyTextSource, IDisposable
{
private readonly string _string;
[System.Runtime.CompilerServices.Nullable(0)]
private readonly ReadOnlyMemory<char> _memory;
private readonly int _length;
private int _index;
public string Text => _string;
public char this[int index] {
get {
return _string[index];
}
}
public int Length => _length;
public Encoding CurrentEncoding {
get {
return TextEncoding.Utf8;
}
set {
}
}
public int Index {
get {
return _index;
}
set {
_index = value;
}
}
public StringTextSource(string source)
{
_string = source;
_length = source.Length;
_memory = source.AsMemory();
}
public void Dispose()
{
}
public char ReadCharacter()
{
if (_index < _length)
return _string[_index++];
_index++;
return '';
}
public string ReadCharacters(int characters)
{
return ReadMemory(characters).ToString();
}
public StringOrMemory ReadMemory(int characters)
{
int index = _index;
if (index + characters <= _length) {
_index += characters;
return _memory.Slice(index, characters);
}
_index += characters;
characters = Math.Min(characters, _length - index);
return _memory.Slice(index, characters);
}
public Task PrefetchAsync(int length, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public Task PrefetchAllAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public bool TryGetContentLength(out int length)
{
length = _length;
return true;
}
}
}