Skip to content

Commit

Permalink
Add clone to reader
Browse files Browse the repository at this point in the history
  • Loading branch information
onevcat committed Mar 8, 2022
1 parent c64347a commit 4ff0656
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 2 deletions.
21 changes: 19 additions & 2 deletions Source/APNGKit/Reader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,13 @@ protocol Reader {

// Returns the current pointer offset for later use.
func offset() throws -> UInt64

// Returns a clone of current reader.
func clone() throws -> Self
}

// Read data from a loaded data object.
class DataReader: Reader {
final class DataReader: Reader {

private var cursor: Int = 0
private let data: Data
Expand Down Expand Up @@ -64,14 +67,22 @@ class DataReader: Reader {
func offset() throws -> UInt64 {
UInt64(cursor)
}

func clone() throws -> DataReader {
let reader = DataReader(data: data)
try reader.seek(toOffset: offset())
return reader
}
}

// Read data from a file with `FileHandle`.
class FileReader: Reader {
final class FileReader: Reader {
private let handle: FileHandle
private let url: URL

init(url: URL) throws {
do {
self.url = url
self.handle = try FileHandle(forReadingFrom: url)
} catch {
throw APNGKitError.decoderError(.fileHandleCreatingFailed(url, error))
Expand Down Expand Up @@ -140,6 +151,12 @@ class FileReader: Reader {
return false
}
}

func clone() throws -> FileReader {
let reader = try FileReader(url: url)
try reader.seek(toOffset: offset())
return reader
}
}

extension Reader {
Expand Down
22 changes: 22 additions & 0 deletions Tests/APNGKitTests/DataReaderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,26 @@ class DataReaderTests: XCTestCase {
_ = try normalReader.read(upToCount: 4)
XCTAssertEqual(5, try normalReader.offset())
}

func testDataReaderClone() throws {
let reader1 = DataReader(bytes: [1,2,3,4,5])
let data1 = try reader1.read(upToCount: 1)
XCTAssertEqual([1], data1?.bytes)

let reader2 = try reader1.clone()
let data2_1 = try reader1.read(upToCount: 2)
let data2_2 = try reader2.read(upToCount: 2)
XCTAssertEqual([2,3], data2_1?.bytes)
XCTAssertEqual([2,3], data2_2?.bytes)

let data3_1 = try reader1.read(upToCount: 2)
XCTAssertEqual([4,5], data3_1?.bytes)

try reader1.seek(toOffset: 0)
let data1_1 = try reader1.read(upToCount: 2)
XCTAssertEqual([1, 2], data1_1?.bytes)

let data3_2 = try reader2.read(upToCount: 2)
XCTAssertEqual([4,5], data3_2?.bytes)
}
}
23 changes: 23 additions & 0 deletions Tests/APNGKitTests/FileReaderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,27 @@ class FileReaderTests: XCTestCase {
_ = try normalReader.read(upToCount: 4)
XCTAssertEqual(5, try normalReader.offset())
}

func testFileReaderClone() throws {
let reader1 = try FileReader(url: Self.tmpFileURL)
let data1 = try reader1.read(upToCount: 1)
XCTAssertEqual([1], data1?.bytes)

let reader2 = try reader1.clone()

let data2_1 = try reader1.read(upToCount: 2)
let data2_2 = try reader2.read(upToCount: 2)
XCTAssertEqual([2,3], data2_1?.bytes)
XCTAssertEqual([2,3], data2_2?.bytes)

let data3_1 = try reader1.read(upToCount: 2)
XCTAssertEqual([4,5], data3_1?.bytes)

try reader1.seek(toOffset: 0)
let data1_1 = try reader1.read(upToCount: 2)
XCTAssertEqual([1, 2], data1_1?.bytes)

let data3_2 = try reader2.read(upToCount: 2)
XCTAssertEqual([4,5], data3_2?.bytes)
}
}

0 comments on commit 4ff0656

Please sign in to comment.