Change 'UnicodeIterator' to 'UTFxxIterator'

This commit is contained in:
Yasuhiro Hatta 2016-06-23 01:01:28 +09:00
parent f9df2e5c9d
commit ccadfd499e
2 changed files with 63 additions and 7 deletions

View File

@ -27,7 +27,6 @@ public struct CSV: IteratorProtocol, Sequence {
private var iterator: AnyIterator<UnicodeScalar> private var iterator: AnyIterator<UnicodeScalar>
private var back: UnicodeScalar? = nil private var back: UnicodeScalar? = nil
private var innerStream: InputStream? = nil
private let delimiter: UnicodeScalar private let delimiter: UnicodeScalar
internal var currentRow: [String]? = nil internal var currentRow: [String]? = nil
@ -54,7 +53,7 @@ public struct CSV: IteratorProtocol, Sequence {
_headerRow = headerRow _headerRow = headerRow
} }
} }
/** /**
Create CSV instance with `NSInputStream`. Create CSV instance with `NSInputStream`.
@ -76,25 +75,23 @@ public struct CSV: IteratorProtocol, Sequence {
case String.Encoding.utf32, case String.Encoding.utf32,
String.Encoding.utf32BigEndian, String.Encoding.utf32BigEndian,
String.Encoding.utf32LittleEndian: String.Encoding.utf32LittleEndian:
var iterator = UnicodeIterator(input: reader.makeUInt32Iterator(), inputEncoding: UTF32.self) var iterator = UTF32Iterator(reader: reader)
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter) try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
case String.Encoding.utf16, case String.Encoding.utf16,
String.Encoding.utf16BigEndian, String.Encoding.utf16BigEndian,
String.Encoding.utf16LittleEndian: String.Encoding.utf16LittleEndian:
var iterator = UnicodeIterator(input: reader.makeUInt16Iterator(), inputEncoding: UTF16.self) var iterator = UTF16Iterator(reader: reader)
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter) try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
case String.Encoding.utf8, case String.Encoding.utf8,
String.Encoding.ascii: String.Encoding.ascii:
var iterator = UnicodeIterator(input: reader.makeUInt8Iterator(), inputEncoding: UTF8.self) var iterator = UTF8Iterator(reader: reader)
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter) try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
default: default:
throw CSVError.StringEncodingMismatch throw CSVError.StringEncodingMismatch
} }
innerStream = stream
} }
// MARK: IteratorProtocol // MARK: IteratorProtocol

View File

@ -8,6 +8,7 @@
import Foundation import Foundation
/*
internal struct UnicodeIterator< internal struct UnicodeIterator<
Input: IteratorProtocol, Input: IteratorProtocol,
InputEncoding: UnicodeCodec InputEncoding: UnicodeCodec
@ -31,3 +32,61 @@ internal struct UnicodeIterator<
} }
} }
*/
public struct UTF32Iterator: IteratorProtocol {
private var innerIterator: BinaryReader.UInt32Iterator
private var codec = UTF32()
internal init(reader: BinaryReader) {
self.innerIterator = reader.makeUInt32Iterator()
}
public mutating func next() -> UnicodeScalar? {
switch codec.decode(&innerIterator) {
case .scalarValue(let c): return c
case .emptyInput: return nil
case .error: return nil
}
}
}
public struct UTF16Iterator: IteratorProtocol {
private var innerIterator: BinaryReader.UInt16Iterator
private var codec = UTF16()
internal init(reader: BinaryReader) {
self.innerIterator = reader.makeUInt16Iterator()
}
public mutating func next() -> UnicodeScalar? {
switch codec.decode(&innerIterator) {
case .scalarValue(let c): return c
case .emptyInput: return nil
case .error: return nil
}
}
}
public struct UTF8Iterator: IteratorProtocol {
private var innerIterator: BinaryReader.UInt8Iterator
private var codec = UTF8()
internal init(reader: BinaryReader) {
self.innerIterator = reader.makeUInt8Iterator()
}
public mutating func next() -> UnicodeScalar? {
switch codec.decode(&innerIterator) {
case .scalarValue(let c): return c
case .emptyInput: return nil
case .error: return nil
}
}
}