Skip to content

Commit

Permalink
Sequences and rose trees are encodable and copyable.
Browse files Browse the repository at this point in the history
Added internal debugging method of repr.

Fixed some warnings.
  • Loading branch information
jeffh committed Feb 4, 2015
1 parent ff0b06c commit e72fbfb
Show file tree
Hide file tree
Showing 21 changed files with 371 additions and 71 deletions.
24 changes: 24 additions & 0 deletions Fox.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -378,10 +378,18 @@
1F97E1CD1A53C1DB00CE7EA4 /* FOXThreadMachine.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F97E1CA1A53C1DB00CE7EA4 /* FOXThreadMachine.h */; };
1F97E1CE1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */; };
1F97E1CF1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F97E1CB1A53C1DB00CE7EA4 /* FOXThreadMachine.m */; };
1F9DB8F21A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */; };
1F9DB8F31A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */; };
1F9DB8F81A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */; };
1F9DB8F91A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */; };
1F9E645A1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */; settings = {ATTRIBUTES = (Public, ); }; };
1F9E645B1A46F2C000651A95 /* FOXParallelGenerators.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */; settings = {ATTRIBUTES = (Public, ); }; };
1F9E645C1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */; };
1F9E645D1A46F2C000651A95 /* FOXParallelGenerators.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */; };
1FACDA761A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */; };
1FACDA771A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */; };
1FACDA781A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */; };
1FACDA791A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */; };
1FAE3B5C1A2EC1000011838A /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B5B1A2EC1000011838A /* DSL.swift */; };
1FAE3B5D1A2EC1000011838A /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B5B1A2EC1000011838A /* DSL.swift */; };
1FAE3B681A2EC5E60011838A /* SwiftGenerators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FAE3B671A2EC5E60011838A /* SwiftGenerators.swift */; };
Expand Down Expand Up @@ -604,11 +612,15 @@
1F9BA1901A11CFA90053B3C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
1F9BDD9519EA501500BAF25E /* FOXExecutedCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXExecutedCommand.h; sourceTree = "<group>"; };
1F9BDD9619EA501500BAF25E /* FOXExecutedCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXExecutedCommand.m; sourceTree = "<group>"; };
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; };
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; };
1F9E64581A46F2C000651A95 /* FOXParallelGenerators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXParallelGenerators.h; path = Fox/Public/Generators/FOXParallelGenerators.h; sourceTree = SOURCE_ROOT; };
1F9E64591A46F2C000651A95 /* FOXParallelGenerators.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXParallelGenerators.m; path = Fox/Public/Generators/FOXParallelGenerators.m; sourceTree = SOURCE_ROOT; };
1FA94A35199606F800803AF3 /* FOXSuchThatSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FOXSuchThatSpec.mm; sourceTree = "<group>"; };
1FA94A38199609D000803AF3 /* FOXSuchThatGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FOXSuchThatGenerator.h; sourceTree = "<group>"; };
1FA94A39199609D000803AF3 /* FOXSuchThatGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FOXSuchThatGenerator.m; sourceTree = "<group>"; };
1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FOXObjectiveCRepresentation.h; path = Fox/Private/Data/FOXObjectiveCRepresentation.h; sourceTree = SOURCE_ROOT; };
1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FOXObjectiveCRepresentation.m; path = Fox/Private/Data/FOXObjectiveCRepresentation.m; sourceTree = SOURCE_ROOT; };
1FAE3B5B1A2EC1000011838A /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Fox/Public/DSL.swift; sourceTree = SOURCE_ROOT; };
1FAE3B671A2EC5E60011838A /* SwiftGenerators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftGenerators.swift; path = Fox/Public/Generators/SwiftGenerators.swift; sourceTree = SOURCE_ROOT; };
1FAE3B6D1A2F10080011838A /* FOXFloatSpec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = FOXFloatSpec.mm; path = FoxSpecs/Public/Generators/FOXFloatSpec.mm; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -1089,6 +1101,10 @@
1FF679271A5E8EC6004F54DA /* FOXBlock.m */,
1F7B796D1A646BB000BA47A4 /* FOXAssertionException.h */,
1F7B796E1A646BB000BA47A4 /* FOXAssertionException.m */,
1F9DB8F11A747E22002E96AD /* FOXRunnerResult+Protected.h */,
1F9DB8F51A748096002E96AD /* FOXRunnerResult+Protected.m */,
1FACDA741A775CCF00DF0054 /* FOXObjectiveCRepresentation.h */,
1FACDA751A775CCF00DF0054 /* FOXObjectiveCRepresentation.m */,
);
path = Data;
sourceTree = "<group>";
Expand Down Expand Up @@ -1159,6 +1175,7 @@
1F38B6B31A2ACCC00078FF90 /* FOXSetGenerators.h in Headers */,
1F38B64D1A2ACCAE0078FF90 /* FOXLazySequence.h in Headers */,
1F38B6271A2ACCA80078FF90 /* FOXPureGenerator.h in Headers */,
1FACDA761A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */,
1F38B6C11A2ACCC00078FF90 /* FOXConstantRandom.h in Headers */,
1F38B62D1A2ACCA80078FF90 /* FOXStringGenerator.h in Headers */,
1F38B6C61A2ACCC00078FF90 /* FOXDebugReporter.h in Headers */,
Expand Down Expand Up @@ -1217,6 +1234,7 @@
1F38B62F1A2ACCA80078FF90 /* FOXTupleGenerator.h in Headers */,
1F38B6B81A2ACCC00078FF90 /* FOXStateTransition.h in Headers */,
1F38B6AE1A2ACCC00078FF90 /* FOXGenerator.h in Headers */,
1F9DB8F21A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */,
1F38B6551A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */,
1F38B6211A2ACCA80078FF90 /* FOXChooseGenerator.h in Headers */,
1F38B6C31A2ACCC00078FF90 /* FOXDeterministicRandom.h in Headers */,
Expand Down Expand Up @@ -1244,6 +1262,7 @@
1F38B67E1A2ACCC00078FF90 /* FOXSetGenerators.h in Headers */,
1F38B6591A2ACCAE0078FF90 /* FOXLazySequence.h in Headers */,
1F38B63F1A2ACCA90078FF90 /* FOXPureGenerator.h in Headers */,
1FACDA771A775CCF00DF0054 /* FOXObjectiveCRepresentation.h in Headers */,
1F38B68C1A2ACCC00078FF90 /* FOXConstantRandom.h in Headers */,
1F38B6451A2ACCA90078FF90 /* FOXStringGenerator.h in Headers */,
1F38B6911A2ACCC00078FF90 /* FOXDebugReporter.h in Headers */,
Expand Down Expand Up @@ -1302,6 +1321,7 @@
1F38B6471A2ACCA90078FF90 /* FOXTupleGenerator.h in Headers */,
1F38B6831A2ACCC00078FF90 /* FOXStateTransition.h in Headers */,
1F38B6791A2ACCC00078FF90 /* FOXGenerator.h in Headers */,
1F9DB8F31A747E22002E96AD /* FOXRunnerResult+Protected.h in Headers */,
1F38B6611A2ACCAE0078FF90 /* FOXPrettyArray.h in Headers */,
1F38B6391A2ACCA90078FF90 /* FOXChooseGenerator.h in Headers */,
1F38B68E1A2ACCC00078FF90 /* FOXDeterministicRandom.h in Headers */,
Expand Down Expand Up @@ -1531,6 +1551,7 @@
1F38B6281A2ACCA80078FF90 /* FOXPureGenerator.m in Sources */,
1F6DE1741A4F66F900C93B28 /* decode.c in Sources */,
1F38B6BA1A2ACCC00078FF90 /* FOXStringGenerators.m in Sources */,
1F9DB8F81A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */,
1F38B6A51A2ACCC00078FF90 /* FOXTransition.m in Sources */,
1F71D4F11A3105520017E81A /* FOXDebugging.m in Sources */,
1F97E1CE1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */,
Expand Down Expand Up @@ -1560,6 +1581,7 @@
1F38B69B1A2ACCC00078FF90 /* FOXExecutedCommand.m in Sources */,
1F7CF6AF1A3FF146005C86A5 /* FOXDictionary.m in Sources */,
1F38B6A31A2ACCC00078FF90 /* FOXSequence.m in Sources */,
1FACDA781A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */,
1F38B61E1A2ACCA80078FF90 /* FOXArrayGenerator.m in Sources */,
1FAE3B5C1A2EC1000011838A /* DSL.swift in Sources */,
31B73D3CD71E35249F44DA0F /* FOXRaiseResult.m in Sources */,
Expand Down Expand Up @@ -1654,6 +1676,7 @@
1F38B6401A2ACCA90078FF90 /* FOXPureGenerator.m in Sources */,
1F6DE1751A4F66F900C93B28 /* decode.c in Sources */,
1F38B6851A2ACCC00078FF90 /* FOXStringGenerators.m in Sources */,
1F9DB8F91A748096002E96AD /* FOXRunnerResult+Protected.m in Sources */,
1F38B6701A2ACCC00078FF90 /* FOXTransition.m in Sources */,
1F71D4F21A3105520017E81A /* FOXDebugging.m in Sources */,
1F97E1CF1A53C1DB00CE7EA4 /* FOXThreadMachine.m in Sources */,
Expand Down Expand Up @@ -1683,6 +1706,7 @@
1F38B6661A2ACCC00078FF90 /* FOXExecutedCommand.m in Sources */,
1F7CF6B01A3FF146005C86A5 /* FOXDictionary.m in Sources */,
1F38B66E1A2ACCC00078FF90 /* FOXSequence.m in Sources */,
1FACDA791A775CCF00DF0054 /* FOXObjectiveCRepresentation.m in Sources */,
1F38B6361A2ACCA90078FF90 /* FOXArrayGenerator.m in Sources */,
1FAE3B5D1A2EC1000011838A /* DSL.swift in Sources */,
31B7348EC23DF7619297D32A /* FOXRaiseResult.m in Sources */,
Expand Down
2 changes: 2 additions & 0 deletions Fox/Private/Data/FOXArraySequence.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ @interface FOXArraySequence ()

@implementation FOXArraySequence

#pragma mark - Public

- (instancetype)initWithArray:(NSArray *)array
{
return [self initWithArray:array offset:0];
Expand Down
2 changes: 2 additions & 0 deletions Fox/Private/Data/FOXConcreteSequence.m
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ @interface FOXConcreteSequence ()

@implementation FOXConcreteSequence

#pragma mark - Public

- (instancetype)init
{
if (self = [super init]) {
Expand Down
2 changes: 2 additions & 0 deletions Fox/Private/Data/FOXLazySequence.m
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ @implementation FOXLazySequence {
OSSpinLock _lock;
}

#pragma mark - Public

- (instancetype)init
{
return self = [super init];
Expand Down
12 changes: 12 additions & 0 deletions Fox/Private/Data/FOXObjectiveCRepresentation.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#import "FOXMacros.h"

@protocol FOXObjectiveCRepresentation <NSObject>

- (NSString *)objectiveCStringRepresentation;

@end

/*! Internal Debugging Tool. Useful to make certain Fox data structures
* Dump an objective-c compatible representation.
*/
FOX_EXPORT NSString *FOXRepr(id obj);
40 changes: 40 additions & 0 deletions Fox/Private/Data/FOXObjectiveCRepresentation.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#import "FOXObjectiveCRepresentation.h"

FOX_EXPORT NSString *FOXRepr(id obj) {
if (!obj) {
return nil;
}
if ([obj respondsToSelector:@selector(objectiveCStringRepresentation)]) {
return [obj objectiveCStringRepresentation];
}
if ([obj isKindOfClass:[NSNull class]]) {
return @"[NSNull null]";
}
if ([obj isKindOfClass:[NSNumber class]]) {
return [NSString stringWithFormat:@"@%@", obj];
}
if ([obj isKindOfClass:[NSString class]]) {
return [NSString stringWithFormat:@"@\"%@\"", [[obj stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]
stringByReplacingOccurrencesOfString:@"\""
withString:@"\\\""]];
}
if ([obj isKindOfClass:[NSArray class]]) {
NSMutableString *result = [NSMutableString stringWithFormat:@"@["];
for (id item in obj) {
[result appendFormat:@"%@,\n", FOXRepr(item)];
}
[result appendString:@"]"];
return result;
}
if ([obj isKindOfClass:[NSDictionary class]]) {
NSMutableString *result = [NSMutableString stringWithFormat:@"@{"];
for (id key in obj) {
[result appendFormat:@"%@: %@,\n", FOXRepr(key), FOXRepr(obj[key])];
}
[result appendString:@"}"];
return result;
}
[NSException raise:NSInvalidArgumentException format:@"object is not supported to dump: %@ (%@)",
obj, NSStringFromClass([obj class])];
return nil;
}
55 changes: 26 additions & 29 deletions Fox/Private/Data/FOXRepeatedSequence.m
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#import "FOXRepeatedSequence.h"
#import "FOXObjectiveCRepresentation.h"

@interface FOXRepeatedSequence ()
@property (nonatomic) id firstObject;
Expand All @@ -7,6 +8,23 @@ @interface FOXRepeatedSequence ()

@implementation FOXRepeatedSequence

#pragma mark - NSCoding

- (id)initWithCoder:(NSCoder *)aDecoder
{
id firstObject = [aDecoder decodeObjectForKey:@"firstObject"];
NSUInteger times = [aDecoder decodeIntegerForKey:@"times"];
return [self initWithObject:firstObject times:times];
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.firstObject forKey:@"firstObject"];
[aCoder encodeInteger:_count forKey:@"times"];
}

#pragma mark - Public

- (instancetype)initWithObject:(id)object times:(NSUInteger)times
{
self = [super init];
Expand All @@ -23,34 +41,13 @@ - (instancetype)initWithObject:(id)object times:(NSUInteger)times
return self;
}

//#pragma mark - NSFastEnumeration
//
//- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state
// objects:(id __unsafe_unretained[])buffer
// count:(NSUInteger)batchSize
//{
// const unsigned long firstTimeState = 0;
// const unsigned long processingState = 1;
// if (state->state == firstTimeState) {
// state->mutationsPtr = (__bridge void *)self;
// state->extra[0] = (unsigned long)self;
// state->state = processingState;
// }
// NSUInteger objectsCaptured = 0;
// FOXRepeatedSequence *seq = (__bridge id)(void *)(state->extra[0]);
// id object = seq.firstObject;
//
// if (!object) {
// return 0;
// }
//
// state->itemsPtr = buffer;
//
// while (objectsCaptured < batchSize) {
// *buffer++ = object;
// objectsCaptured++;
// }
// return objectsCaptured;
//}
#pragma mark - FOXObjectiveCRepresentation

- (NSString *)objectiveCStringRepresentation
{
return [NSString stringWithFormat:@"[FOXSequence sequenceWithObject:%@ times:%lu]",
FOXRepr(self.firstObject),
_count];
}

@end
6 changes: 6 additions & 0 deletions Fox/Private/Data/FOXRunnerResult+Protected.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#import "FOXRunnerResult.h"
#import "FOXRoseTree.h"

@interface FOXRunnerResult (Protected)
@property (nonatomic) FOXRunnerResult *failingRoseTree;
@end
18 changes: 18 additions & 0 deletions Fox/Private/Data/FOXRunnerResult+Protected.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#import "FOXRunnerResult+Protected.h"
#import <objc/runtime.h>

@implementation FOXRunnerResult (Protected)

const char *FOXRunnerResultFailingRoseTreeKey;

- (FOXRoseTree *)failingRoseTree
{
return objc_getAssociatedObject(self, &FOXRunnerResultFailingRoseTreeKey);
}

- (void)setFailingRoseTree:(FOXRunnerResult *)failingRoseTree
{
objc_setAssociatedObject(self, &FOXRunnerResultFailingRoseTreeKey, failingRoseTree, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end
2 changes: 1 addition & 1 deletion Fox/Private/FOXStringUtil.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
}

FOX_EXPORT NSString *FOXWhitespace(NSUInteger indent) {
NSMutableString *whitespace = [NSMutableString string];
NSMutableString *whitespace = [NSMutableString stringWithCapacity:indent];
for (NSUInteger i = 0; i < indent; i++) {
[whitespace appendString:@" "];
}
Expand Down
5 changes: 4 additions & 1 deletion Fox/Public/Data/FOXRoseTree.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@
/*! A rose tree data structure. Generators return these lazy trees which allows "shrinking" of
* a given value by walking its children.
*
* The Fox's shrinking algorithm is a greedy, depth-first search. So the smallest possible values
* should be first, as immediate children.
*
* Like sequences, rose trees support operations to derive new lazy rose trees from existing ones.
*/
@interface FOXRoseTree : NSObject
@interface FOXRoseTree : NSObject <NSCoding, NSCopying>

/*! The value that this tree holds. Smaller variants of this value are in this tree's children.
*/
Expand Down
Loading

0 comments on commit e72fbfb

Please sign in to comment.