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

/*
* 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
}
}
}