CharArrayTextSource
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 CharArrayTextSource : IReadOnlyTextSource, IDisposable
{
private int _index;
[System.Runtime.CompilerServices.Nullable(2)]
private string _content;
private readonly char[] _array;
[System.Runtime.CompilerServices.Nullable(0)]
private readonly ReadOnlyMemory<char> _memory;
private readonly int _length;
public string Text => _content ?? (_content = new string(_array, 0, _length));
public char this[int index] {
get {
return _array[index];
}
}
public int Length => _length;
public Encoding CurrentEncoding {
get {
return TextEncoding.Utf8;
}
set {
}
}
public int Index {
get {
return _index;
}
set {
_index = value;
}
}
public CharArrayTextSource(char[] array, int length)
{
_array = array;
_length = length;
_memory = array.AsMemory(0, length);
}
public void Dispose()
{
}
public char ReadCharacter()
{
if (_index < _length)
return _array[_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;
}
}
}