Skip to content

Commit 50f57fd

Browse files
Add Value equality API. (#9700)
Summary: #8364 Reviewed By: bsoyluoglu Differential Revision: D71938474 Co-authored-by: Anthony Shoumikhin <[email protected]>
1 parent f873ada commit 50f57fd

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

extension/apple/ExecuTorch/Exported/ExecuTorchValue.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,15 @@ __attribute__((deprecated("This API is experimental.")))
193193
+ (instancetype)valueWithDouble:(ExecuTorchDoubleValue)value
194194
NS_SWIFT_NAME(init(_:));
195195

196+
197+
/**
198+
* Determines whether the current Value is equal to another Value.
199+
*
200+
* @param other Another ExecuTorchValue instance to compare against.
201+
* @return YES if the values have the same tag and equal underlying values; otherwise, NO.
202+
*/
203+
- (BOOL)isEqualToValue:(nullable ExecuTorchValue *)other;
204+
196205
@end
197206

198207
NS_ASSUME_NONNULL_END

extension/apple/ExecuTorch/Exported/ExecuTorchValue.mm

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,27 @@ - (BOOL)isDouble {
118118
return _tag == ExecuTorchValueTagDouble;
119119
}
120120

121+
- (BOOL)isEqualToValue:(nullable ExecuTorchValue *)other {
122+
if (!other) {
123+
return NO;
124+
}
125+
if (_tag != other->_tag) {
126+
return NO;
127+
}
128+
if (_value == nil) {
129+
return other->_value == nil;
130+
}
131+
return [_value isEqual:other->_value];
132+
}
133+
134+
- (BOOL)isEqual:(nullable id)other {
135+
if (self == other) {
136+
return YES;
137+
}
138+
if (![other isKindOfClass:[ExecuTorchValue class]]) {
139+
return NO;
140+
}
141+
return [self isEqualToValue:(ExecuTorchValue *)other];
142+
}
143+
121144
@end

extension/apple/ExecuTorch/__tests__/ValueTest.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,43 @@ class ValueTest: XCTestCase {
4646
XCTAssertTrue(value.isDouble)
4747
XCTAssertEqual(value.double, 3.14)
4848
}
49+
50+
func testIsEqual() {
51+
let noneValue1 = Value()
52+
let noneValue2 = Value()
53+
XCTAssertTrue(noneValue1.isEqual(noneValue2))
54+
55+
let intValue1 = Value(42)
56+
let intValue2 = Value(42)
57+
let intValueDifferent = Value(43)
58+
XCTAssertTrue(intValue1.isEqual(intValue2))
59+
XCTAssertFalse(intValue1.isEqual(intValueDifferent))
60+
61+
let boolValue1 = Value(true)
62+
let boolValue2 = Value(true)
63+
let boolValueDifferent = Value(false)
64+
XCTAssertTrue(boolValue1.isEqual(boolValue2))
65+
XCTAssertFalse(boolValue1.isEqual(boolValueDifferent))
66+
67+
let doubleValue1 = Value(3.14)
68+
let doubleValue2 = Value(3.14)
69+
let doubleValueDifferent = Value(2.71)
70+
XCTAssertTrue(doubleValue1.isEqual(doubleValue2))
71+
XCTAssertFalse(doubleValue1.isEqual(doubleValueDifferent))
72+
73+
let stringValue1 = Value("hello")
74+
let stringValue2 = Value("hello")
75+
let stringValueDifferent = Value("world")
76+
XCTAssertTrue(stringValue1.isEqual(stringValue2))
77+
XCTAssertFalse(stringValue1.isEqual(stringValueDifferent))
78+
79+
let tensor1 = Tensor([1.0, 2.0, 3.0])
80+
let tensor2 = Tensor([1.0, 2.0, 3.0])
81+
let tensorDifferent = Tensor([3.0, 2.0, 1.0])
82+
let tensorValue1 = Value(tensor1)
83+
let tensorValue2 = Value(tensor2)
84+
let tensorValueDifferent = Value(tensorDifferent)
85+
XCTAssertTrue(tensorValue1.isEqual(tensorValue2))
86+
XCTAssertFalse(tensorValue1.isEqual(tensorValueDifferent))
87+
}
4988
}

0 commit comments

Comments
 (0)