Array+Extension.swift 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. 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. let unicodeHexMap:[UnicodeScalar:UInt8] = ["0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9,"a":10,"b":11,"c":12,"d":13,"e":14,"f":15,"A":10,"B":11,"C":12,"D":13,"E":14,"F":15]
  33. var buffer:UInt8?
  34. var skip = hex.hasPrefix("0x") ? 2 : 0
  35. for char in hex.unicodeScalars.lazy {
  36. guard skip == 0 else {
  37. skip -= 1
  38. continue
  39. }
  40. guard let value = unicodeHexMap[char] else {
  41. self.removeAll()
  42. return
  43. }
  44. if let b = buffer {
  45. self.append(b << 4 | value as! Element)
  46. buffer = nil
  47. } else {
  48. buffer = value
  49. }
  50. }
  51. if let b = buffer{
  52. self.append(b as! Element)
  53. }
  54. }
  55. }