diff --git a/Sources/Tokenizer/CharRefTokenizer.swift b/Sources/Tokenizer/CharRefTokenizer.swift index 1449d96..1dcad01 100644 --- a/Sources/Tokenizer/CharRefTokenizer.swift +++ b/Sources/Tokenizer/CharRefTokenizer.swift @@ -20,7 +20,7 @@ enum CharRefProcessResult: ~Copyable { case doneChar(Char) } -struct CharRefTokenizer { +struct CharRefTokenizer: ~Copyable { private var state: CharRefState = .initial private var num: Int = 0 private var numTooBig: Bool = false diff --git a/Sources/Tokenizer/Optional+take.swift b/Sources/Tokenizer/Optional+take.swift new file mode 100644 index 0000000..0c5ee49 --- /dev/null +++ b/Sources/Tokenizer/Optional+take.swift @@ -0,0 +1,7 @@ +extension Optional where Wrapped: ~Copyable { + @inlinable mutating func take() -> Self { + let value = self + self = nil + return value + } +} diff --git a/Sources/Tokenizer/Tokenizer.swift b/Sources/Tokenizer/Tokenizer.swift index 6b2daca..248bd92 100644 --- a/Sources/Tokenizer/Tokenizer.swift +++ b/Sources/Tokenizer/Tokenizer.swift @@ -43,7 +43,7 @@ public struct Tokenizer: ~Copyable { } private mutating func step(_ input: inout BufferQueue) -> ProcessResult { - if var charRefTokenizer { + if var charRefTokenizer = self.charRefTokenizer.take() { repeat { switch charRefTokenizer.step(tokenizer: &self, input: &input) { case .continue: continue @@ -52,7 +52,6 @@ public struct Tokenizer: ~Copyable { } break } while true - self.charRefTokenizer = nil } return switch self.state {