Array+Extension.swift 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //
  2. // ArrayExtension.swift
  3. // CryptoSwift
  4. //
  5. // Created by Marcin Krzyzanowski on 10/08/14.
  6. // Copyright (c) 2014 Marcin Krzyzanowski. All rights reserved.
  7. //
  8. extension Array {
  9. init(reserveCapacity: Int) {
  10. self = Array<Element>()
  11. self.reserveCapacity(reserveCapacity)
  12. }
  13. }
  14. extension Array {
  15. /** split in chunks with given chunk size */
  16. public func chunks(size chunksize: Int) -> Array<Array<Element>> {
  17. var words = Array<Array<Element>>()
  18. words.reserveCapacity(self.count / chunksize)
  19. for idx in stride(from: chunksize, through: self.count, by: chunksize) {
  20. words.append(Array(self[idx - chunksize ..< idx])) // slow for large table
  21. }
  22. let remainder = self.suffix(self.count % chunksize)
  23. if !remainder.isEmpty {
  24. words.append(Array(remainder))
  25. }
  26. return words
  27. }
  28. }
  29. extension Array where Element: Integer, Element.IntegerLiteralType == UInt8 {
  30. public init(hex: String) {
  31. self.init(reserveCapacity: hex.unicodeScalars.lazy.underestimatedCount)
  32. var buffer:UInt8?
  33. var skip = hex.hasPrefix("0x") ? 2 : 0
  34. for char in hex.unicodeScalars.lazy {
  35. guard skip == 0 else {
  36. skip -= 1
  37. continue
  38. }
  39. guard char.value >= 48 && char.value <= 102 else {
  40. self.removeAll()
  41. return
  42. }
  43. let v:UInt8
  44. let c:UInt8 = UInt8(char.value)
  45. switch c{
  46. case let c where c <= 57:
  47. v = c - 48
  48. case let c where c >= 65 && c <= 70:
  49. v = c - 55
  50. case let c where c >= 97:
  51. v = c - 87
  52. default:
  53. self.removeAll()
  54. return
  55. }
  56. if let b = buffer {
  57. self.append(b << 4 | v as! Element)
  58. buffer = nil
  59. } else {
  60. buffer = v
  61. }
  62. }
  63. if let b = buffer{
  64. self.append(b as! Element)
  65. }
  66. }
  67. }