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.
77 lines
2.1 KiB
77 lines
2.1 KiB
![]()
2 years ago
|
/*
|
||
|
* 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
|
||
|
}
|
||
|
}
|
||
|
}
|