1 // 2 // objc_array_util.h 3 // util 4 // 5 // Copyright © 2024 Apple Inc. All rights reserved. 6 // 7 // Please refer to the license found in the LICENSE file in the root directory of the source tree. 8 9 #import <Foundation/Foundation.h> 10 #import <type_traits> 11 #import <vector> 12 13 namespace executorchcoreml { 14 15 template <typename T> T to_value(NSNumber* value); 16 to_value(NSNumber * value)17template <> inline size_t to_value(NSNumber* value) { return value.unsignedLongValue; } 18 to_value(NSNumber * value)19template <> inline ssize_t to_value(NSNumber* value) { return value.longLongValue; } 20 to_value(NSNumber * value)21template <> inline int to_value(NSNumber* value) { return value.intValue; } 22 23 template <typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type> to_array(const std::vector<T> & array)24inline NSArray<NSNumber*>* to_array(const std::vector<T>& array) { 25 NSMutableArray<NSNumber*>* result = [NSMutableArray arrayWithCapacity:array.size()]; 26 for (T value: array) { 27 [result addObject:@(value)]; 28 } 29 30 return result; 31 } 32 33 template <typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type> to_vector(NSArray<NSNumber * > * numbers)34inline std::vector<T> to_vector(NSArray<NSNumber*>* numbers) { 35 std::vector<T> result; 36 result.reserve(numbers.count); 37 for (NSNumber* number in numbers) { 38 result.emplace_back(to_value<T>(number)); 39 } 40 41 return result; 42 } 43 44 } 45