/* * 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) } extension String : UTF8Initializable {} extension Array where Element : UTF8Initializable { init(utf8Strings: UnsafePointer) { 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(_ pointer: UnsafePointer) { self = UnsafeRawPointer(pointer).assumingMemoryBound(to: Pointee.self) } } func relativePointer(base: UnsafePointer, offset: U) -> UnsafePointer where U : FixedWidthInteger { return UnsafeRawPointer(base).advanced(by: Int(integer: offset)).assumingMemoryBound(to: V.self) } extension Int { fileprivate init(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 } } }