BytesSequence.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. //
  2. // BytesSequence.swift
  3. // CryptoSwift
  4. //
  5. // Created by Marcin Krzyzanowski on 26/09/15.
  6. // Copyright © 2015 Marcin Krzyzanowski. All rights reserved.
  7. //
  8. /// Generic version of BytesSequence is slower, therefore specialized version is in use
  9. ///
  10. // struct BytesSequence<D: RandomAccessCollection>: Sequence where D.Iterator.Element == UInt8, D.IndexDistance == Int, D.SubSequence.IndexDistance == Int, D.Index == Int {
  11. // let chunkSize: D.IndexDistance
  12. // let data: D
  13. //
  14. // func makeIterator() -> AnyIterator<D.SubSequence> {
  15. // var offset = data.startIndex
  16. // return AnyIterator {
  17. // let end = Swift.min(self.chunkSize, self.data.count - offset)
  18. // let result = self.data[offset..<offset + end]
  19. // offset = offset.advanced(by: result.count)
  20. // if !result.isEmpty {
  21. // return result
  22. // }
  23. // return nil
  24. // }
  25. // }
  26. // }
  27. struct BytesSequence: Sequence {
  28. let chunkSize: Array<UInt8>.IndexDistance
  29. let data: Array<UInt8>
  30. func makeIterator() -> AnyIterator<ArraySlice<UInt8>> {
  31. var offset = data.startIndex
  32. return AnyIterator {
  33. let end = Swift.min(self.chunkSize, self.data.count &- offset)
  34. let result = self.data[offset ..< offset &+ end]
  35. offset = offset.advanced(by: result.count)
  36. if !result.isEmpty {
  37. return result
  38. }
  39. return nil
  40. }
  41. }
  42. }