Skip to content

Commit e72fbfb

Browse files
committed
Sequences and rose trees are encodable and copyable.
Added internal debugging method of repr. Fixed some warnings.
1 parent ff0b06c commit e72fbfb

21 files changed

+371
-71
lines changed

Fox.xcodeproj/project.pbxproj

+24
Original file line numberDiff line numberDiff line change
@@ -378,10 +378,18 @@
378378
1F97E1CD1A53C1DB00CE7EA4 /* FOXThreadMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F97E1CA1A53C1DB00CE7EA4 /* FOXThreadMachine.h */; };
379379
1F97E1CE1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */; };
380380
1F97E1CF1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */; };
381+
1F9DB8F21A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */; };
382+
1F9DB8F31A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */; };
383+
1F9DB8F81A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */; };
384+
1F9DB8F91A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */; };
381385
1F9E645A1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */; settings = {ATTRIBUTES = (Public, ); }; };
382386
1F9E645B1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */; settings = {ATTRIBUTES = (Public, ); }; };
383387
1F9E645C1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */; };
384388
1F9E645D1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */; };
389+
1FACDA761A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */; };
390+
1FACDA771A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */; };
391+
1FACDA781A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */; };
392+
1FACDA791A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */; };
385393
1FAE3B5C1A2EC1000011838A /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B5B1A2EC1000011838A /* DSL.swift */; };
386394
1FAE3B5D1A2EC1000011838A /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B5B1A2EC1000011838A /* DSL.swift */; };
387395
1FAE3B681A2EC5E60011838A /* SwiftGenerators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B671A2EC5E60011838A /* SwiftGenerators.swift */; };
@@ -604,11 +612,15 @@
604612
1F9BA1901A11CFA90053B3C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
605613
1F9BDD9519EA501500BAF25E /* FOXExecutedCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXExecutedCommand.h; sourceTree = "<group>"; };
606614
1F9BDD9619EA501500BAF25E /* FOXExecutedCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXExecutedCommand.m; sourceTree = "<group>"; };
615+
1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "FOXRunnerResult+Protected.h"; path = "Fox/Private/Data/FOXRunnerResult+Protected.h"; sourceTree = SOURCE_ROOT; };
616+
1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "FOXRunnerResult+Protected.m"; path = "Fox/Private/Data/FOXRunnerResult+Protected.m"; sourceTree = SOURCE_ROOT; };
607617
1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXParallelGenerators.h; path = Fox/Public/Generators/FOXParallelGenerators.h; sourceTree = SOURCE_ROOT; };
608618
1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXParallelGenerators.m; path = Fox/Public/Generators/FOXParallelGenerators.m; sourceTree = SOURCE_ROOT; };
609619
1FA94A35199606F800803AF3 /* FOXSuchThatSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXSuchThatSpec.mm; sourceTree = "<group>"; };
610620
1FA94A38199609D000803AF3 /* FOXSuchThatGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXSuchThatGenerator.h; sourceTree = "<group>"; };
611621
1FA94A39199609D000803AF3 /* FOXSuchThatGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXSuchThatGenerator.m; sourceTree = "<group>"; };
622+
1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXObjectiveCRepresentation.h; path = Fox/Private/Data/FOXObjectiveCRepresentation.h; sourceTree = SOURCE_ROOT; };
623+
1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXObjectiveCRepresentation.m; path = Fox/Private/Data/FOXObjectiveCRepresentation.m; sourceTree = SOURCE_ROOT; };
612624
1FAE3B5B1A2EC1000011838A /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Fox/Public/DSL.swift; sourceTree = SOURCE_ROOT; };
613625
1FAE3B671A2EC5E60011838A /* SwiftGenerators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftGenerators.swift; path = Fox/Public/Generators/SwiftGenerators.swift; sourceTree = SOURCE_ROOT; };
614626
1FAE3B6D1A2F10080011838A /* FOXFloatSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXFloatSpec.mm; path = FoxSpecs/Public/Generators/FOXFloatSpec.mm; sourceTree = SOURCE_ROOT; };
@@ -1089,6 +1101,10 @@
10891101
1FF679271A5E8EC6004F54DA /* FOXBlock.m */,
10901102
1F7B796D1A646BB000BA47A4 /* FOXAssertionException.h */,
10911103
1F7B796E1A646BB000BA47A4 /* FOXAssertionException.m */,
1104+
1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */,
1105+
1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */,
1106+
1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */,
1107+
1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */,
10921108
);
10931109
path = Data;
10941110
sourceTree = "<group>";
@@ -1159,6 +1175,7 @@
11591175
1F38B6B31A2ACCC00078FF90 /* FOXSetGenerators.h in Headers */,
11601176
1F38B64D1A2ACCAE0078FF90 /* FOXLazySequence.h in Headers */,
11611177
1F38B6271A2ACCA80078FF90 /* FOXPureGenerator.h in Headers */,
1178+
1FACDA761A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */,
11621179
1F38B6C11A2ACCC00078FF90 /* FOXConstantRandom.h in Headers */,
11631180
1F38B62D1A2ACCA80078FF90 /* FOXStringGenerator.h in Headers */,
11641181
1F38B6C61A2ACCC00078FF90 /* FOXDebugReporter.h in Headers */,
@@ -1217,6 +1234,7 @@
12171234
1F38B62F1A2ACCA80078FF90 /* FOXTupleGenerator.h in Headers */,
12181235
1F38B6B81A2ACCC00078FF90 /* FOXStateTransition.h in Headers */,
12191236
1F38B6AE1A2ACCC00078FF90 /* FOXGenerator.h in Headers */,
1237+
1F9DB8F21A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */,
12201238
1F38B6551A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */,
12211239
1F38B6211A2ACCA80078FF90 /* FOXChooseGenerator.h in Headers */,
12221240
1F38B6C31A2ACCC00078FF90 /* FOXDeterministicRandom.h in Headers */,
@@ -1244,6 +1262,7 @@
12441262
1F38B67E1A2ACCC00078FF90 /* FOXSetGenerators.h in Headers */,
12451263
1F38B6591A2ACCAE0078FF90 /* FOXLazySequence.h in Headers */,
12461264
1F38B63F1A2ACCA90078FF90 /* FOXPureGenerator.h in Headers */,
1265+
1FACDA771A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */,
12471266
1F38B68C1A2ACCC00078FF90 /* FOXConstantRandom.h in Headers */,
12481267
1F38B6451A2ACCA90078FF90 /* FOXStringGenerator.h in Headers */,
12491268
1F38B6911A2ACCC00078FF90 /* FOXDebugReporter.h in Headers */,
@@ -1302,6 +1321,7 @@
13021321
1F38B6471A2ACCA90078FF90 /* FOXTupleGenerator.h in Headers */,
13031322
1F38B6831A2ACCC00078FF90 /* FOXStateTransition.h in Headers */,
13041323
1F38B6791A2ACCC00078FF90 /* FOXGenerator.h in Headers */,
1324+
1F9DB8F31A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */,
13051325
1F38B6611A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */,
13061326
1F38B6391A2ACCA90078FF90 /* FOXChooseGenerator.h in Headers */,
13071327
1F38B68E1A2ACCC00078FF90 /* FOXDeterministicRandom.h in Headers */,
@@ -1531,6 +1551,7 @@
15311551
1F38B6281A2ACCA80078FF90 /* FOXPureGenerator.m in Sources */,
15321552
1F6DE1741A4F66F900C93B28 /* decode.c in Sources */,
15331553
1F38B6BA1A2ACCC00078FF90 /* FOXStringGenerators.m in Sources */,
1554+
1F9DB8F81A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */,
15341555
1F38B6A51A2ACCC00078FF90 /* FOXTransition.m in Sources */,
15351556
1F71D4F11A3105520017E81A /* FOXDebugging.m in Sources */,
15361557
1F97E1CE1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */,
@@ -1560,6 +1581,7 @@
15601581
1F38B69B1A2ACCC00078FF90 /* FOXExecutedCommand.m in Sources */,
15611582
1F7CF6AF1A3FF146005C86A5 /* FOXDictionary.m in Sources */,
15621583
1F38B6A31A2ACCC00078FF90 /* FOXSequence.m in Sources */,
1584+
1FACDA781A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */,
15631585
1F38B61E1A2ACCA80078FF90 /* FOXArrayGenerator.m in Sources */,
15641586
1FAE3B5C1A2EC1000011838A /* DSL.swift in Sources */,
15651587
31B73D3CD71E35249F44DA0F /* FOXRaiseResult.m in Sources */,
@@ -1654,6 +1676,7 @@
16541676
1F38B6401A2ACCA90078FF90 /* FOXPureGenerator.m in Sources */,
16551677
1F6DE1751A4F66F900C93B28 /* decode.c in Sources */,
16561678
1F38B6851A2ACCC00078FF90 /* FOXStringGenerators.m in Sources */,
1679+
1F9DB8F91A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */,
16571680
1F38B6701A2ACCC00078FF90 /* FOXTransition.m in Sources */,
16581681
1F71D4F21A3105520017E81A /* FOXDebugging.m in Sources */,
16591682
1F97E1CF1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */,
@@ -1683,6 +1706,7 @@
16831706
1F38B6661A2ACCC00078FF90 /* FOXExecutedCommand.m in Sources */,
16841707
1F7CF6B01A3FF146005C86A5 /* FOXDictionary.m in Sources */,
16851708
1F38B66E1A2ACCC00078FF90 /* FOXSequence.m in Sources */,
1709+
1FACDA791A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */,
16861710
1F38B6361A2ACCA90078FF90 /* FOXArrayGenerator.m in Sources */,
16871711
1FAE3B5D1A2EC1000011838A /* DSL.swift in Sources */,
16881712
31B7348EC23DF7619297D32A /* FOXRaiseResult.m in Sources */,

Fox/Private/Data/FOXArraySequence.m

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ @interface FOXArraySequence ()
88

99
@implementation FOXArraySequence
1010

11+
#pragma mark - Public
12+
1113
- (instancetype)initWithArray:(NSArray *)array
1214
{
1315
return [self initWithArray:array offset:0];

Fox/Private/Data/FOXConcreteSequence.m

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ @interface FOXConcreteSequence ()
1111

1212
@implementation FOXConcreteSequence
1313

14+
#pragma mark - Public
15+
1416
- (instancetype)init
1517
{
1618
if (self = [super init]) {

Fox/Private/Data/FOXLazySequence.m

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ @implementation FOXLazySequence {
1515
OSSpinLock _lock;
1616
}
1717

18+
#pragma mark - Public
19+
1820
- (instancetype)init
1921
{
2022
return self = [super init];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#import "FOXMacros.h"
2+
3+
@protocol FOXObjectiveCRepresentation <NSObject>
4+
5+
- (NSString *)objectiveCStringRepresentation;
6+
7+
@end
8+
9+
/*! Internal Debugging Tool. Useful to make certain Fox data structures
10+
* Dump an objective-c compatible representation.
11+
*/
12+
FOX_EXPORT NSString *FOXRepr(id obj);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#import "FOXObjectiveCRepresentation.h"
2+
3+
FOX_EXPORT NSString *FOXRepr(id obj) {
4+
if (!obj) {
5+
return nil;
6+
}
7+
if ([obj respondsToSelector:@selector(objectiveCStringRepresentation)]) {
8+
return [obj objectiveCStringRepresentation];
9+
}
10+
if ([obj isKindOfClass:[NSNull class]]) {
11+
return @"[NSNull null]";
12+
}
13+
if ([obj isKindOfClass:[NSNumber class]]) {
14+
return [NSString stringWithFormat:@"@%@", obj];
15+
}
16+
if ([obj isKindOfClass:[NSString class]]) {
17+
return [NSString stringWithFormat:@"@\"%@\"", [[obj stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]
18+
stringByReplacingOccurrencesOfString:@"\""
19+
withString:@"\\\""]];
20+
}
21+
if ([obj isKindOfClass:[NSArray class]]) {
22+
NSMutableString *result = [NSMutableString stringWithFormat:@"@["];
23+
for (id item in obj) {
24+
[result appendFormat:@"%@,\n", FOXRepr(item)];
25+
}
26+
[result appendString:@"]"];
27+
return result;
28+
}
29+
if ([obj isKindOfClass:[NSDictionary class]]) {
30+
NSMutableString *result = [NSMutableString stringWithFormat:@"@{"];
31+
for (id key in obj) {
32+
[result appendFormat:@"%@: %@,\n", FOXRepr(key), FOXRepr(obj[key])];
33+
}
34+
[result appendString:@"}"];
35+
return result;
36+
}
37+
[NSException raise:NSInvalidArgumentException format:@"object is not supported to dump: %@ (%@)",
38+
obj, NSStringFromClass([obj class])];
39+
return nil;
40+
}
+26-29
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#import "FOXRepeatedSequence.h"
2+
#import "FOXObjectiveCRepresentation.h"
23

34
@interface FOXRepeatedSequence ()
45
@property (nonatomic) id firstObject;
@@ -7,6 +8,23 @@ @interface FOXRepeatedSequence ()
78

89
@implementation FOXRepeatedSequence
910

11+
#pragma mark - NSCoding
12+
13+
- (id)initWithCoder:(NSCoder *)aDecoder
14+
{
15+
id firstObject = [aDecoder decodeObjectForKey:@"firstObject"];
16+
NSUInteger times = [aDecoder decodeIntegerForKey:@"times"];
17+
return [self initWithObject:firstObject times:times];
18+
}
19+
20+
- (void)encodeWithCoder:(NSCoder *)aCoder
21+
{
22+
[aCoder encodeObject:self.firstObject forKey:@"firstObject"];
23+
[aCoder encodeInteger:_count forKey:@"times"];
24+
}
25+
26+
#pragma mark - Public
27+
1028
- (instancetype)initWithObject:(id)object times:(NSUInteger)times
1129
{
1230
self = [super init];
@@ -23,34 +41,13 @@ - (instancetype)initWithObject:(id)object times:(NSUInteger)times
2341
return self;
2442
}
2543

26-
//#pragma mark - NSFastEnumeration
27-
//
28-
//- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state
29-
// objects:(id __unsafe_unretained[])buffer
30-
// count:(NSUInteger)batchSize
31-
//{
32-
// const unsigned long firstTimeState = 0;
33-
// const unsigned long processingState = 1;
34-
// if (state->state == firstTimeState) {
35-
// state->mutationsPtr = (__bridge void *)self;
36-
// state->extra[0] = (unsigned long)self;
37-
// state->state = processingState;
38-
// }
39-
// NSUInteger objectsCaptured = 0;
40-
// FOXRepeatedSequence *seq = (__bridge id)(void *)(state->extra[0]);
41-
// id object = seq.firstObject;
42-
//
43-
// if (!object) {
44-
// return 0;
45-
// }
46-
//
47-
// state->itemsPtr = buffer;
48-
//
49-
// while (objectsCaptured < batchSize) {
50-
// *buffer++ = object;
51-
// objectsCaptured++;
52-
// }
53-
// return objectsCaptured;
54-
//}
44+
#pragma mark - FOXObjectiveCRepresentation
45+
46+
- (NSString *)objectiveCStringRepresentation
47+
{
48+
return [NSString stringWithFormat:@"[FOXSequence sequenceWithObject:%@ times:%lu]",
49+
FOXRepr(self.firstObject),
50+
_count];
51+
}
5552

5653
@end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#import "FOXRunnerResult.h"
2+
#import "FOXRoseTree.h"
3+
4+
@interface FOXRunnerResult (Protected)
5+
@property (nonatomic) FOXRunnerResult *failingRoseTree;
6+
@end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#import "FOXRunnerResult+Protected.h"
2+
#import <objc/runtime.h>
3+
4+
@implementation FOXRunnerResult (Protected)
5+
6+
const char *FOXRunnerResultFailingRoseTreeKey;
7+
8+
- (FOXRoseTree *)failingRoseTree
9+
{
10+
return objc_getAssociatedObject(self, &FOXRunnerResultFailingRoseTreeKey);
11+
}
12+
13+
- (void)setFailingRoseTree:(FOXRunnerResult *)failingRoseTree
14+
{
15+
objc_setAssociatedObject(self, &FOXRunnerResultFailingRoseTreeKey, failingRoseTree, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
16+
}
17+
18+
@end

Fox/Private/FOXStringUtil.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
}
99

1010
FOX_EXPORT NSString *FOXWhitespace(NSUInteger indent) {
11-
NSMutableString *whitespace = [NSMutableString string];
11+
NSMutableString *whitespace = [NSMutableString stringWithCapacity:indent];
1212
for (NSUInteger i = 0; i < indent; i++) {
1313
[whitespace appendString:@" "];
1414
}

Fox/Public/Data/FOXRoseTree.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
/*! A rose tree data structure. Generators return these lazy trees which allows "shrinking" of
99
* a given value by walking its children.
1010
*
11+
* The Fox's shrinking algorithm is a greedy, depth-first search. So the smallest possible values
12+
* should be first, as immediate children.
13+
*
1114
* Like sequences, rose trees support operations to derive new lazy rose trees from existing ones.
1215
*/
13-
@interface FOXRoseTree : NSObject
16+
@interface FOXRoseTree : NSObject <NSCoding, NSCopying>
1417

1518
/*! The value that this tree holds. Smaller variants of this value are in this tree's children.
1619
*/

0 commit comments

Comments
 (0)