Add CSV.init with UnicodeCodec

This commit is contained in:
Yasuhiro Hatta 2016-06-25 14:47:48 +09:00
parent 0718eab0bb
commit 26b4bd153a
2 changed files with 15 additions and 62 deletions

View File

@ -54,6 +54,18 @@ public struct CSV: IteratorProtocol, Sequence {
}
}
public init<T: UnicodeCodec where T.CodeUnit == UInt8>(
stream: InputStream,
codecType: T.Type,
hasHeaderRow: Bool = defaultHasHeaderRow,
delimiter: UnicodeScalar = defaultDelimiter)
throws
{
let reader = BinaryReader(stream: stream, encoding: .utf8, closeOnDeinit: true)
var iterator = UnicodeIterator(input: reader.makeUInt8Iterator(), inputEncoding: codecType)
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
}
/**
Create CSV instance with `NSInputStream`.
@ -75,18 +87,18 @@ public struct CSV: IteratorProtocol, Sequence {
case String.Encoding.utf32,
String.Encoding.utf32BigEndian,
String.Encoding.utf32LittleEndian:
var iterator = UTF32Iterator(reader: reader)
var iterator = UnicodeIterator(input: reader.makeUInt32Iterator(), inputEncoding: UTF32.self)
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
case String.Encoding.utf16,
String.Encoding.utf16BigEndian,
String.Encoding.utf16LittleEndian:
var iterator = UTF16Iterator(reader: reader)
var iterator = UnicodeIterator(input: reader.makeUInt16Iterator(), inputEncoding: UTF16.self)
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
case String.Encoding.utf8,
String.Encoding.ascii:
var iterator = UTF8Iterator(reader: reader)
var iterator = UnicodeIterator(input: reader.makeUInt8Iterator(), inputEncoding: UTF8.self)
try self.init(iterator: &iterator, hasHeaderRow: hasHeaderRow, delimiter: delimiter)
default:

View File

@ -8,7 +8,6 @@
import Foundation
/*
internal struct UnicodeIterator<
Input: IteratorProtocol,
InputEncoding: UnicodeCodec
@ -32,61 +31,3 @@ 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
}
}
}