Skip to content

Commit 070f804

Browse files
authored
Init Value with a generic scalar. (#11429)
Summary: This is to facilitate wrapping any NSNumber with Value Differential Revision: D76072803
1 parent ca68afc commit 070f804

File tree

4 files changed

+98
-20
lines changed

4 files changed

+98
-20
lines changed

extension/apple/ExecuTorch/Exported/ExecuTorchValue.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,17 @@ __attribute__((deprecated("This API is experimental.")))
208208
+ (instancetype)valueWithDouble:(ExecuTorchDoubleValue)value
209209
NS_SWIFT_NAME(init(_:));
210210

211+
/**
212+
* Creates an instance encapsulating a scalar value.
213+
*
214+
* The value's tag will be set according to the type encoding of the ExecuTorchScalarValue.
215+
*
216+
* @param value An ExecuTorchScalarValue.
217+
* @return A new ExecuTorchValue instance with the appropriate tag.
218+
*/
219+
+ (instancetype)valueWithScalar:(ExecuTorchScalarValue)value
220+
NS_SWIFT_NAME(init(_:));
221+
211222
/**
212223
* Returns a copy of the value.
213224
*

extension/apple/ExecuTorch/Exported/ExecuTorchValue.mm

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,25 @@
1010

1111
#import <executorch/runtime/platform/assert.h>
1212

13+
static inline ExecuTorchValueTag deduceValueTag(NSNumber *number) {
14+
ET_CHECK(number);
15+
auto type = [number objCType][0];
16+
type = (type >= 'A' && type <= 'Z') ? type + ('a' - 'A') : type;
17+
switch (type) {
18+
case 'c': return ExecuTorchValueTagBoolean;
19+
case 's':
20+
case 'i':
21+
case 'q':
22+
case 'l': return ExecuTorchValueTagInteger;
23+
case 'f':
24+
case 'd': return ExecuTorchValueTagDouble;
25+
default: {
26+
ET_CHECK_MSG(false, "Unsupported type: %c", type);
27+
return ExecuTorchValueTagNone;
28+
}
29+
}
30+
}
31+
1332
@interface ExecuTorchValue ()
1433

1534
- (instancetype)initWithTag:(ExecuTorchValueTag)tag
@@ -24,28 +43,39 @@ @implementation ExecuTorchValue {
2443

2544
+ (instancetype)valueWithTensor:(ExecuTorchTensor *)value {
2645
ET_CHECK(value);
27-
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagTensor value:value];
46+
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagTensor
47+
value:value];
2848
}
2949

3050
+ (instancetype)valueWithString:(ExecuTorchStringValue)value {
3151
ET_CHECK(value);
32-
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagString value:value];
52+
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagString
53+
value:value];
3354
}
3455

3556
+ (instancetype)valueWithBoolean:(ExecuTorchBooleanValue)value {
36-
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagBoolean value:@(value)];
57+
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagBoolean
58+
value:@(value)];
3759
}
3860

3961
+ (instancetype)valueWithInteger:(ExecuTorchIntegerValue)value {
40-
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagInteger value:@(value)];
62+
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagInteger
63+
value:@(value)];
4164
}
4265

4366
+ (instancetype)valueWithDouble:(ExecuTorchDoubleValue)value {
44-
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagDouble value:@(value)];
67+
return [[ExecuTorchValue alloc] initWithTag:ExecuTorchValueTagDouble
68+
value:@(value)];
69+
}
70+
71+
+ (instancetype)valueWithScalar:(ExecuTorchScalarValue)value {
72+
return [[ExecuTorchValue alloc] initWithTag:deduceValueTag(value)
73+
value:value];
4574
}
4675

4776
- (instancetype)init {
48-
return [self initWithTag:ExecuTorchValueTagNone value:nil];
77+
return [self initWithTag:ExecuTorchValueTagNone
78+
value:nil];
4979
}
5080

5181
- (instancetype)initWithTag:(ExecuTorchValueTag)tag

extension/apple/ExecuTorch/Internal/ExecuTorchUtils.mm

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,22 @@
1313
using namespace runtime;
1414

1515
ScalarType deduceType(NSNumber *number) {
16+
ET_CHECK(number);
1617
auto type = [number objCType][0];
1718
type = (type >= 'A' && type <= 'Z') ? type + ('a' - 'A') : type;
18-
if (type == 'c') {
19-
return ScalarType::Byte;
20-
} else if (type == 's') {
21-
return ScalarType::Short;
22-
} else if (type == 'i') {
23-
return ScalarType::Int;
24-
} else if (type == 'q' || type == 'l') {
25-
return ScalarType::Long;
26-
} else if (type == 'f') {
27-
return ScalarType::Float;
28-
} else if (type == 'd') {
29-
return ScalarType::Double;
19+
switch(type) {
20+
case 'c': return ScalarType::Byte;
21+
case 's': return ScalarType::Short;
22+
case 'i': return ScalarType::Int;
23+
case 'q':
24+
case 'l': return ScalarType::Long;
25+
case 'f': return ScalarType::Float;
26+
case 'd': return ScalarType::Double;
27+
default: {
28+
ET_CHECK_MSG(false, "Unsupported type: %c", type);
29+
return ScalarType::Undefined;
30+
}
3031
}
31-
ET_CHECK_MSG(false, "Unsupported type: %c", type);
32-
return ScalarType::Undefined;
3332
}
3433

3534
} // namespace executorch::extension::utils

extension/apple/ExecuTorch/__tests__/ValueTest.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,44 @@ class ValueTest: XCTestCase {
4646
XCTAssertEqual(value.double, 3.14)
4747
}
4848

49+
func testScalarBoolean() {
50+
let value = Value(true as NSNumber)
51+
XCTAssertTrue(value.isBoolean)
52+
XCTAssertEqual(value.boolean, true)
53+
54+
let value2 = Value(false as NSNumber)
55+
XCTAssertTrue(value2.isBoolean)
56+
XCTAssertEqual(value2.boolean, false)
57+
}
58+
59+
func testScalarInteger() {
60+
let value = Value(42 as NSNumber)
61+
XCTAssertTrue(value.isInteger)
62+
XCTAssertEqual(value.integer, 42)
63+
64+
let value2 = Value(Int16(7) as NSNumber)
65+
XCTAssertTrue(value2.isInteger)
66+
XCTAssertEqual(value2.integer, 7)
67+
68+
let value3 = Value(Int32(13) as NSNumber)
69+
XCTAssertTrue(value3.isInteger)
70+
XCTAssertEqual(value3.integer, 13)
71+
72+
let value4 = Value(Int64(64) as NSNumber)
73+
XCTAssertTrue(value4.isInteger)
74+
XCTAssertEqual(value4.integer, 64)
75+
}
76+
77+
func testScalarDouble() {
78+
let value = Value(3.14 as NSNumber)
79+
XCTAssertTrue(value.isDouble)
80+
XCTAssertEqual(value.double, 3.14)
81+
82+
let value2 = Value(Float(6.28) as NSNumber)
83+
XCTAssertTrue(value2.isFloat)
84+
XCTAssertEqual(value2.float, 6.28)
85+
}
86+
4987
func testIsEqual() {
5088
let noneValue1 = Value()
5189
let noneValue2 = Value()

0 commit comments

Comments
 (0)