You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.1 KiB
76 lines
2.1 KiB
/* |
|
* Copyright 1999-2101 Alibaba Group. |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
// |
|
// OtherExtension.swift |
|
// HandyJSON |
|
// |
|
// Created by zhouzhuo on 08/01/2017. |
|
// |
|
|
|
protocol UTF8Initializable { |
|
init?(validatingUTF8: UnsafePointer<CChar>) |
|
} |
|
|
|
extension String : UTF8Initializable {} |
|
|
|
extension Array where Element : UTF8Initializable { |
|
|
|
init(utf8Strings: UnsafePointer<CChar>) { |
|
var strings = [Element]() |
|
var pointer = utf8Strings |
|
while let string = Element(validatingUTF8: pointer) { |
|
strings.append(string) |
|
while pointer.pointee != 0 { |
|
pointer.advance() |
|
} |
|
pointer.advance() |
|
guard pointer.pointee != 0 else { |
|
break |
|
} |
|
} |
|
self = strings |
|
} |
|
} |
|
|
|
extension Strideable { |
|
mutating func advance() { |
|
self = advanced(by: 1) |
|
} |
|
} |
|
|
|
extension UnsafePointer { |
|
|
|
init<T>(_ pointer: UnsafePointer<T>) { |
|
self = UnsafeRawPointer(pointer).assumingMemoryBound(to: Pointee.self) |
|
} |
|
} |
|
|
|
func relativePointer<T, U, V>(base: UnsafePointer<T>, offset: U) -> UnsafePointer<V> where U : FixedWidthInteger { |
|
return UnsafeRawPointer(base).advanced(by: Int(integer: offset)).assumingMemoryBound(to: V.self) |
|
} |
|
|
|
extension Int { |
|
fileprivate init<T : FixedWidthInteger>(integer: T) { |
|
switch integer { |
|
case let value as Int: self = value |
|
case let value as Int32: self = Int(value) |
|
case let value as Int16: self = Int(value) |
|
case let value as Int8: self = Int(value) |
|
default: self = 0 |
|
} |
|
} |
|
}
|
|
|