класс Prism::CodeUnitsCache
Кэш, который может использоваться для быстрого вычисления смещений кодовых единиц от байтовых смещений. Он намеренно предоставляет только один метод [] для доступа к кэшу, чтобы минимизировать поверхность.
Обратите внимание, что здесь есть некоторые известные проблемы, которые могут или не могут быть решены в будущем:
-
Первая проблема заключается в том, что возникают проблемы, когда кэш вычисляет значения, которые не находятся на границах символов. Это может привести к тому, что последующие вычисления будут отличаться на одну или несколько кодовых единиц.
-
Вторая проблема заключается в том, что этот кэш в настоящее время не ограничен. Теоретически мы могли бы ввести какой-либо кэш LRU для ограничения числа записей, но это пока не реализовано.
Публичные методы класса
Исходный код
# File lib/prism/parse_result.rb, line 198
def initialize(source, encoding)
@source = source
@counter =
if encoding == Encoding::UTF_16LE || encoding == Encoding::UTF_16BE
UTF16Counter.new(source, encoding)
else
LengthCounter.new(source, encoding)
end
@cache = {} #: Hash[Integer, Integer]
@offsets = [] #: Array[Integer]
end Инициализирует новый кэш с заданным источником и кодировкой.
Публичные методы экземпляра
Исходный код
# File lib/prism/parse_result.rb, line 212
def [](byte_offset)
@cache[byte_offset] ||=
if (index = @offsets.bsearch_index { |offset| offset > byte_offset }).nil?
@offsets << byte_offset
@counter.count(0, byte_offset)
elsif index == 0
@offsets.unshift(byte_offset)
@counter.count(0, byte_offset)
else
@offsets.insert(index, byte_offset)
offset = @offsets[index - 1]
@cache[offset] + @counter.count(offset, byte_offset - offset)
end
end Возвращает смещение кодовых единиц от заданного байтового смещения.
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.