diff --git a/Sources/CSV.swift b/Sources/CSV.swift index 9dff1cf..710e4e0 100755 --- a/Sources/CSV.swift +++ b/Sources/CSV.swift @@ -27,7 +27,6 @@ public struct CSV: IteratorProtocol, Sequence { private var iterator: AnyIterator private var back: UnicodeScalar? = nil - private var innerStream: InputStream? = nil private let delimiter: UnicodeScalar internal var currentRow: [String]? = nil @@ -54,7 +53,7 @@ public struct CSV: IteratorProtocol, Sequence { _headerRow = headerRow } } - + /** Create CSV instance with `NSInputStream`. @@ -76,25 +75,23 @@ public struct CSV: IteratorProtocol, Sequence { case String.Encoding.utf32, String.Encoding.utf32BigEndian, 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) case String.Encoding.utf16, String.Encoding.utf16BigEndian, 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) case String.Encoding.utf8, 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) default: throw CSVError.StringEncodingMismatch } - - innerStream = stream } // MARK: IteratorProtocol diff --git a/Sources/UnicodeIterator.swift b/Sources/UnicodeIterator.swift index 888d67b..df0cda1 100755 --- a/Sources/UnicodeIterator.swift +++ b/Sources/UnicodeIterator.swift @@ -8,6 +8,7 @@ import Foundation +/* internal struct UnicodeIterator< Input: IteratorProtocol, 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 + } + } + +}