Avatar
internal init(encodedOffset o: Int, transcodedOffset: Int = 0, _ c: _Cache) { _compoundOffset = UInt64(o << _Self._strideBits | transcodedOffset) _cache = c }
9:03 AM
2bitシフトして、 (UTF16でのインデックス, 0...3) のタプルになっている
9:04 AM
現在のUnicodeが21bitでUTF8で4バイト文字までしか存在しないから
9:05 AM
UTF8での位置は、 UTF16でvalidな位置 + 0〜3のオフセット
9:05 AM
で、常に表現できるってことか?
9:06 AM
(ユニコードでの位置+UTF8ずらし分)的なデータ構造じゃないと辻褄が合わないと思ってて、こんなの出てきたからそうっぽいけど・・・
9:06 AM
extension String { /// A position of a character or code unit in a string. @_fixed_layout // FIXME(sil-serialize-all) public struct Index { @_versioned // FIXME(sil-serialize-all) internal var _compoundOffset : UInt64 @_versioned internal var _cache: _Cache internal typealias _UTF8Buffer = _ValidUTF8Buffer<UInt64> @_versioned internal enum _Cache { case utf16 case utf8(buffer: _UTF8Buffer) case character(stride: UInt16) case unicodeScalar(value: Unicode.Scalar) } } }
9:07 AM
String.Index型自体は内部に enum _Cache で、どの種類のビューのIndexなのかを保持しているから、適宜変換も可能と