xref: /aosp_15_r20/external/executorch/backends/apple/coreml/runtime/util/objc_array_util.h (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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)17 template <> inline size_t to_value(NSNumber* value) { return value.unsignedLongValue; }
18 
to_value(NSNumber * value)19 template <> inline ssize_t to_value(NSNumber* value) { return value.longLongValue; }
20 
to_value(NSNumber * value)21 template <> 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)24 inline 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)34 inline 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