From efdcc215d6b2a8465f65948c0b2a22a8837819de Mon Sep 17 00:00:00 2001 From: Kelly Roach Date: Tue, 28 Aug 2018 13:40:04 -0700 Subject: [PATCH 1/2] Convert to Swift 4, 'pod update', fix compile issues --- .travis.yml | 4 +- Example/MLKit.xcodeproj/project.pbxproj | 232 +- .../xcschemes/MLKit-Example.xcscheme | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Example/MLKit/GameScene.swift | 14 +- .../AppIcon.appiconset/Contents.json | 5 + Example/Podfile | 2 +- Example/Podfile.lock | 28 +- .../Pods/Local Podspecs/MLKit.podspec.json | 33 - .../MachineLearningKit.podspec.json | 4 +- Example/Pods/Manifest.lock | 28 +- Example/Pods/Nimble/README.md | 733 ++++-- .../CwlCatchException/CwlCatchException.h | 30 - .../CwlCatchException/CwlCatchException.m | 35 - .../CwlCatchException/CwlCatchException.swift | 32 - .../CwlBadInstructionException.swift | 76 - .../CwlCatchBadInstruction.h | 61 - .../CwlCatchBadInstruction.m | 50 - .../CwlCatchBadInstruction.swift | 193 -- .../CwlDarwinDefinitions.swift | 63 - .../CwlPreconditionTesting/mach_excServer.c | 537 ---- .../CwlPreconditionTesting/mach_excServer.h | 298 --- .../Nimble/Adapters/AssertionRecorder.swift | 2 +- .../Nimble/Adapters/NMBExpectation.swift | 146 +- .../Nimble/Adapters/NMBObjCMatcher.swift | 8 +- .../Nimble/Adapters/NimbleEnvironment.swift | 2 +- .../Nimble/Adapters/NimbleXCTestHandler.swift | 20 +- .../Pods/Nimble/Sources/Nimble/DSL+Wait.swift | 40 +- Example/Pods/Nimble/Sources/Nimble/DSL.swift | 2 +- .../Nimble/Sources/Nimble/Expectation.swift | 71 +- .../Sources/Nimble/ExpectationMessage.swift | 262 ++ .../Nimble/Sources/Nimble/Expression.swift | 13 +- .../Sources/Nimble/FailureMessage.swift | 31 +- .../Sources/Nimble/Matchers/AllPass.swift | 125 +- .../Nimble/Matchers/AsyncMatcherWrapper.swift | 105 +- .../Sources/Nimble/Matchers/BeAKindOf.swift | 64 +- .../Nimble/Matchers/BeAnInstanceOf.swift | 56 +- .../Sources/Nimble/Matchers/BeCloseTo.swift | 56 +- .../Sources/Nimble/Matchers/BeEmpty.swift | 72 +- .../Nimble/Matchers/BeGreaterThan.swift | 25 +- .../Matchers/BeGreaterThanOrEqualTo.swift | 16 +- .../Nimble/Matchers/BeIdenticalTo.swift | 25 +- .../Sources/Nimble/Matchers/BeLessThan.swift | 16 +- .../Nimble/Matchers/BeLessThanOrEqual.swift | 18 +- .../Sources/Nimble/Matchers/BeLogical.swift | 54 +- .../Sources/Nimble/Matchers/BeNil.swift | 11 +- .../Sources/Nimble/Matchers/BeVoid.swift | 7 +- .../Sources/Nimble/Matchers/BeginWith.swift | 37 +- .../Sources/Nimble/Matchers/Contain.swift | 37 +- .../Matchers/ContainElementSatisfying.swift | 13 +- .../Sources/Nimble/Matchers/EndWith.swift | 24 +- .../Sources/Nimble/Matchers/Equal.swift | 139 +- .../Sources/Nimble/Matchers/HaveCount.swift | 16 +- .../Sources/Nimble/Matchers/Match.swift | 19 +- .../Sources/Nimble/Matchers/MatchError.swift | 50 +- .../Sources/Nimble/Matchers/MatcherFunc.swift | 22 +- .../Nimble/Matchers/MatcherProtocols.swift | 77 +- .../Nimble/Matchers/PostNotification.swift | 46 +- .../Sources/Nimble/Matchers/Predicate.swift | 348 +++ .../Nimble/Matchers/RaisesException.swift | 43 +- .../Nimble/Matchers/SatisfyAllOf.swift | 101 + .../Nimble/Matchers/SatisfyAnyOf.swift | 107 +- .../Nimble/Matchers/ThrowAssertion.swift | 9 +- .../Sources/Nimble/Matchers/ThrowError.swift | 253 +- .../Sources/Nimble/Matchers/ToSucceed.swift | 37 + Example/Pods/Nimble/Sources/Nimble/Nimble.h | 9 +- .../Nimble/Sources/Nimble/Utils/Async.swift | 68 +- .../Nimble/Sources/Nimble/Utils/Errors.swift | 88 +- .../Sources/Nimble/Utils/Stringers.swift | 16 +- .../NimbleObjectiveC/CurrentTestCaseTracker.h | 9 - .../Nimble/Sources/NimbleObjectiveC/DSL.h | 14 +- .../Nimble/Sources/NimbleObjectiveC/DSL.m | 25 +- .../NimbleObjectiveC/NMBExceptionCapture.h | 4 +- .../NimbleObjectiveC/NMBExceptionCapture.m | 6 +- .../Sources/NimbleObjectiveC/NMBStringify.h | 2 +- .../Sources/NimbleObjectiveC/NMBStringify.m | 5 + .../XCTestObservationCenter+Register.m | 7 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 2295 +++++++++-------- .../contents.xcworkspacedata | 7 - .../Pods/Quick/Sources/Quick/Behavior.swift | 17 + .../Pods/Quick/Sources/Quick/Callsite.swift | 15 +- .../Quick/Configuration/Configuration.swift | 4 +- .../Pods/Quick/Sources/Quick/DSL/DSL.swift | 30 + .../Quick/Sources/Quick/DSL/World+DSL.swift | 49 +- .../Quick/Sources/Quick/ErrorUtility.swift | 2 +- .../Pods/Quick/Sources/Quick/Example.swift | 25 +- .../Quick/Sources/Quick/ExampleGroup.swift | 14 +- .../Quick/Sources/Quick/ExampleMetadata.swift | 15 +- Example/Pods/Quick/Sources/Quick/Filter.swift | 15 +- .../Quick/NSBundle+CurrentTestBundle.swift | 2 +- .../NSString+C99ExtendedIdentifier.swift | 26 +- .../Quick/QuickSelectedTestSuiteBuilder.swift | 2 +- .../Quick/Sources/Quick/QuickTestSuite.swift | 12 +- Example/Pods/Quick/Sources/Quick/World.swift | 22 +- .../Configuration/QuickConfiguration.m | 7 +- .../Sources/QuickObjectiveC/DSL/QCKDSL.m | 8 +- .../Sources/QuickObjectiveC/DSL/World+DSL.h | 20 - .../Quick/Sources/QuickObjectiveC/QuickSpec.h | 6 + .../Quick/Sources/QuickObjectiveC/QuickSpec.m | 14 +- .../Quick/Sources/QuickObjectiveC/World.h | 18 - .../XCTestSuite+QuickTestSuiteBuilder.m | 5 + .../QuickSpecBase/include/QuickSpecBase.h | 4 +- .../MachineLearningKit/Info.plist | 2 +- .../MachineLearningKit.xcconfig | 9 +- .../Target Support Files/Nimble/Info.plist | 2 +- .../Nimble/Nimble-umbrella.h | 7 +- .../Nimble/Nimble.xcconfig | 12 +- .../Pods-MLKit_Example-frameworks.sh | 80 +- .../Pods-MLKit_Example-resources.sh | 43 +- .../Pods-MLKit_Example.debug.xcconfig | 9 +- .../Pods-MLKit_Example.release.xcconfig | 9 +- .../Pods-MLKit_Tests-frameworks.sh | 80 +- .../Pods-MLKit_Tests-resources.sh | 43 +- .../Pods-MLKit_Tests.debug.xcconfig | 9 +- .../Pods-MLKit_Tests.release.xcconfig | 9 +- .../Target Support Files/Quick/Info.plist | 2 +- .../Target Support Files/Quick/Quick.xcconfig | 10 +- .../Target Support Files/Upsurge/Info.plist | 2 +- .../Upsurge/Upsurge.xcconfig | 7 +- Example/Pods/Upsurge/README.md | 34 +- .../Pods/Upsurge/Source/Complex/Complex.swift | 151 -- .../Upsurge}/2DTensorSlice.swift | 36 +- .../Upsurge}/Arithmetic.swift | 6 +- .../Upsurge}/Auxiliary.swift | 71 +- .../Upsurge/Sources/Upsurge/Complex.swift | 113 + .../Upsurge}/ComplexArithmetic.swift | 62 +- .../Upsurge}/ComplexArray.swift | 79 +- .../Upsurge}/ComplexArrayRealSlice.swift | 72 +- .../Upsurge}/ComplexArraySlice.swift | 112 +- .../{Source/DSP => Sources/Upsurge}/DSP.swift | 0 .../Upsurge}/Exponential.swift | 0 .../{Source/DSP => Sources/Upsurge}/FFT.swift | 25 +- .../Upsurge}/Hyperbolic.swift | 0 .../Types => Sources/Upsurge}/Interval.swift | 12 +- .../Upsurge}/LinearOperators.swift | 82 +- .../1D => Sources/Upsurge}/LinearType.swift | 48 +- .../2D => Sources/Upsurge}/Matrix.swift | 130 +- .../Upsurge}/MatrixArithmetic.swift | 49 +- .../2D => Sources/Upsurge}/MatrixSlice.swift | 96 +- .../Upsurge}/PointerUtilities.swift | 73 +- .../Upsurge}/QuadraticType.swift | 1 - .../Types => Sources/Upsurge}/Real.swift | 2 +- .../Upsurge/Sources/Upsurge/Sequence.swift | 36 + .../{Source/ND => Sources/Upsurge}/Span.swift | 124 +- .../ND => Sources/Upsurge}/Tensor.swift | 51 +- .../ND => Sources/Upsurge}/TensorSlice.swift | 42 +- .../ND => Sources/Upsurge}/TensorType.swift | 18 +- .../Upsurge}/Trigonometric.swift | 8 +- .../Types => Sources/Upsurge}/Value.swift | 2 +- .../1D => Sources/Upsurge}/ValueArray.swift | 159 +- .../Upsurge}/ValueArraySlice.swift | 108 +- MLKit-PlayGround.playground/Contents.swift | 357 --- .../contents.xcplayground | 4 - .../contents.xcworkspacedata | 7 - .../timeline.xctimeline | 16 - MLKit/Classes/ANN/Layer.swift | 32 +- MLKit/Classes/ANN/NeuralNetwork.swift | 10 +- .../BiologicalProcessManager.swift | 40 +- .../Genetic Algorithms/Population.swift | 4 +- .../Extensions.swift | 4 +- MLKit/Classes/K Means Clustering/KMeans.swift | 28 +- .../Classes/Regression/LassoRegression.swift | 8 +- .../Regression/PolynomialRegression.swift | 10 +- .../Classes/Regression/RidgeRegression.swift | 10 +- 164 files changed, 5545 insertions(+), 5102 deletions(-) create mode 100644 Example/MLKit.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 Example/Pods/Local Podspecs/MLKit.podspec.json delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c delete mode 100644 Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h create mode 100644 Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift create mode 100644 Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift create mode 100644 Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift create mode 100644 Example/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift delete mode 100644 Example/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h delete mode 100644 Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/Pods/Quick/Sources/Quick/Behavior.swift delete mode 100644 Example/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h delete mode 100644 Example/Pods/Quick/Sources/QuickObjectiveC/World.h delete mode 100644 Example/Pods/Upsurge/Source/Complex/Complex.swift rename Example/Pods/Upsurge/{Source/2D => Sources/Upsurge}/2DTensorSlice.swift (84%) rename Example/Pods/Upsurge/{Source/Operations => Sources/Upsurge}/Arithmetic.swift (98%) rename Example/Pods/Upsurge/{Source/Operations => Sources/Upsurge}/Auxiliary.swift (86%) create mode 100644 Example/Pods/Upsurge/Sources/Upsurge/Complex.swift rename Example/Pods/Upsurge/{Source/Complex => Sources/Upsurge}/ComplexArithmetic.swift (57%) rename Example/Pods/Upsurge/{Source/Complex => Sources/Upsurge}/ComplexArray.swift (73%) rename Example/Pods/Upsurge/{Source/Complex => Sources/Upsurge}/ComplexArrayRealSlice.swift (73%) rename Example/Pods/Upsurge/{Source/Complex => Sources/Upsurge}/ComplexArraySlice.swift (53%) rename Example/Pods/Upsurge/{Source/DSP => Sources/Upsurge}/DSP.swift (100%) rename Example/Pods/Upsurge/{Source/Operations => Sources/Upsurge}/Exponential.swift (100%) rename Example/Pods/Upsurge/{Source/DSP => Sources/Upsurge}/FFT.swift (86%) rename Example/Pods/Upsurge/{Source/Operations => Sources/Upsurge}/Hyperbolic.swift (100%) rename Example/Pods/Upsurge/{Source/Types => Sources/Upsurge}/Interval.swift (90%) rename Example/Pods/Upsurge/{Source/1D => Sources/Upsurge}/LinearOperators.swift (80%) rename Example/Pods/Upsurge/{Source/1D => Sources/Upsurge}/LinearType.swift (79%) rename Example/Pods/Upsurge/{Source/2D => Sources/Upsurge}/Matrix.swift (64%) rename Example/Pods/Upsurge/{Source/2D => Sources/Upsurge}/MatrixArithmetic.swift (88%) rename Example/Pods/Upsurge/{Source/2D => Sources/Upsurge}/MatrixSlice.swift (68%) rename Example/Pods/Upsurge/{Source/Operations => Sources/Upsurge}/PointerUtilities.swift (52%) rename Example/Pods/Upsurge/{Source/2D => Sources/Upsurge}/QuadraticType.swift (98%) rename Example/Pods/Upsurge/{Source/Types => Sources/Upsurge}/Real.swift (93%) create mode 100644 Example/Pods/Upsurge/Sources/Upsurge/Sequence.swift rename Example/Pods/Upsurge/{Source/ND => Sources/Upsurge}/Span.swift (57%) rename Example/Pods/Upsurge/{Source/ND => Sources/Upsurge}/Tensor.swift (87%) rename Example/Pods/Upsurge/{Source/ND => Sources/Upsurge}/TensorSlice.swift (83%) rename Example/Pods/Upsurge/{Source/ND => Sources/Upsurge}/TensorType.swift (89%) rename Example/Pods/Upsurge/{Source/Operations => Sources/Upsurge}/Trigonometric.swift (97%) rename Example/Pods/Upsurge/{Source/Types => Sources/Upsurge}/Value.swift (93%) rename Example/Pods/Upsurge/{Source/1D => Sources/Upsurge}/ValueArray.swift (61%) rename Example/Pods/Upsurge/{Source/1D => Sources/Upsurge}/ValueArraySlice.swift (61%) delete mode 100644 MLKit-PlayGround.playground/Contents.swift delete mode 100644 MLKit-PlayGround.playground/contents.xcplayground delete mode 100644 MLKit-PlayGround.playground/playground.xcworkspace/contents.xcworkspacedata delete mode 100644 MLKit-PlayGround.playground/timeline.xctimeline diff --git a/.travis.yml b/.travis.yml index 76c6450..fb0a86d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ # * http://www.objc.io/issue-6/travis-ci.html # * https://github.com/supermarin/xcpretty#usage -osx_image: xcode7.3 +osx_image: xcode9.4 language: objective-c # cache: cocoapods # podfile: Example/Podfile @@ -10,5 +10,5 @@ language: objective-c # - gem install cocoapods # Since Travis is not always on latest version # - pod install --project-directory=Example script: -- set -o pipefail && xcodebuild test -workspace Example/MLKit.xcworkspace -scheme MLKit-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty +- set -o pipefail && xcodebuild test -workspace Example/MLKit.xcworkspace -scheme MLKit-Example -sdk iphonesimulator11.4 ONLY_ACTIVE_ARCH=NO | xcpretty - pod lib lint diff --git a/Example/MLKit.xcodeproj/project.pbxproj b/Example/MLKit.xcodeproj/project.pbxproj index f1e0c68..3d737dc 100644 --- a/Example/MLKit.xcodeproj/project.pbxproj +++ b/Example/MLKit.xcodeproj/project.pbxproj @@ -8,17 +8,8 @@ /* Begin PBXBuildFile section */ 16C9F55B9FB2BEAF643302B4 /* Pods_MLKit_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8829C99A800D59865185C8D0 /* Pods_MLKit_Example.framework */; }; - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 7D7064C9A3631B7752642915 /* Pods_MLKit_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F7E553BF29858564109C95C /* Pods_MLKit_Tests.framework */; }; 9A2618FF1E6F1C5E006B9D6E /* GeneticSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2618FD1E6F1C4E006B9D6E /* GeneticSpec.swift */; }; - 9A5294461E6F22BA00506C2A /* GameScene.sks in Resources */ = {isa = PBXBuildFile; fileRef = 9A5294451E6F22BA00506C2A /* GameScene.sks */; }; - 9A5294481E6F22C000506C2A /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5294471E6F22C000506C2A /* GameScene.swift */; }; - 9A52944A1E6F22C800506C2A /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5294491E6F22C800506C2A /* GameViewController.swift */; }; - 9A52944C1E6F232F00506C2A /* bird.atlas in Resources */ = {isa = PBXBuildFile; fileRef = 9A52944B1E6F232F00506C2A /* bird.atlas */; }; - 9A5294501E6F44E200506C2A /* GeneticOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A52944F1E6F44E200506C2A /* GeneticOperations.swift */; }; 9A54B3B81E5B5D6D0059B577 /* kc_house_data.csv in Resources */ = {isa = PBXBuildFile; fileRef = 9A54B3B71E5B5D6D0059B577 /* kc_house_data.csv */; }; 9A92AE061E6DB958000DBC84 /* LassoRegressionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE051E6DB958000DBC84 /* LassoRegressionSpec.swift */; }; 9A92AE081E6DB96B000DBC84 /* MLDataManagerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE071E6DB96B000DBC84 /* MLDataManagerSpec.swift */; }; @@ -27,6 +18,15 @@ 9A92AE0E1E6DB9A4000DBC84 /* RidgeRegressionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE0D1E6DB9A4000DBC84 /* RidgeRegressionSpec.swift */; }; 9A92AE101E6DB9B1000DBC84 /* NeuralNetworkSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE0F1E6DB9B1000DBC84 /* NeuralNetworkSpec.swift */; }; 9A92AE141E6DBD9A000DBC84 /* CSVReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE131E6DBD9A000DBC84 /* CSVReader.swift */; }; + E163E7B221352514002310EB /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E79921352514002310EB /* GameViewController.swift */; }; + E163E7B521352514002310EB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E163E79E21352514002310EB /* Images.xcassets */; }; + E163E7B621352514002310EB /* GameScene.sks in Resources */ = {isa = PBXBuildFile; fileRef = E163E79F21352514002310EB /* GameScene.sks */; }; + E163E7B721352514002310EB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E7A021352514002310EB /* AppDelegate.swift */; }; + E163E7B821352514002310EB /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E7A121352514002310EB /* GameScene.swift */; }; + E163E7B921352514002310EB /* GeneticOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E7A221352514002310EB /* GeneticOperations.swift */; }; + E163E7CA21352561002310EB /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = E163E7C521352561002310EB /* LaunchScreen.xib */; }; + E163E7CB21352561002310EB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E163E7C721352561002310EB /* Main.storyboard */; }; + E163E7CC21352561002310EB /* bird.atlas in Resources */ = {isa = PBXBuildFile; fileRef = E163E7C921352561002310EB /* bird.atlas */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -58,23 +58,12 @@ 4F7E553BF29858564109C95C /* Pods_MLKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MLKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 533ED56CBC06E518D99EE4BE /* Pods-MLKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MLKit_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.debug.xcconfig"; sourceTree = ""; }; 607FACD01AFB9204008FA782 /* MLKit_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MLKit_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 607FACE51AFB9204008FA782 /* MLKit_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = MLKit_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65CE8F014155800F07E3652F /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 6FE1BF7F8EF374CFB92CBB77 /* Pods-MLKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MLKit_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.release.xcconfig"; sourceTree = ""; }; 8829C99A800D59865185C8D0 /* Pods_MLKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MLKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9A2618FD1E6F1C4E006B9D6E /* GeneticSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneticSpec.swift; sourceTree = ""; }; - 9A4707A91E5C8F51002C2268 /* MLKit-PlayGround.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = "MLKit-PlayGround.playground"; path = "../MLKit-PlayGround.playground"; sourceTree = ""; }; - 9A5294451E6F22BA00506C2A /* GameScene.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = GameScene.sks; sourceTree = ""; }; - 9A5294471E6F22C000506C2A /* GameScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = ""; }; - 9A5294491E6F22C800506C2A /* GameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = ""; }; - 9A52944B1E6F232F00506C2A /* bird.atlas */ = {isa = PBXFileReference; lastKnownFileType = folder.skatlas; path = bird.atlas; sourceTree = ""; }; - 9A52944F1E6F44E200506C2A /* GeneticOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneticOperations.swift; sourceTree = ""; }; 9A54B3B71E5B5D6D0059B577 /* kc_house_data.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = kc_house_data.csv; sourceTree = ""; }; 9A92AE051E6DB958000DBC84 /* LassoRegressionSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LassoRegressionSpec.swift; sourceTree = ""; }; 9A92AE071E6DB96B000DBC84 /* MLDataManagerSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MLDataManagerSpec.swift; sourceTree = ""; }; @@ -84,7 +73,17 @@ 9A92AE0F1E6DB9B1000DBC84 /* NeuralNetworkSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NeuralNetworkSpec.swift; sourceTree = ""; }; 9A92AE131E6DBD9A000DBC84 /* CSVReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSVReader.swift; sourceTree = ""; }; AD54BBE1B07E33FF3F5DD543 /* Pods-MLKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MLKit_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.release.xcconfig"; sourceTree = ""; }; - BCFC43680C2D8165DD3A9F1E /* MachineLearningKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = MachineLearningKit.podspec; path = ../MachineLearningKit.podspec; sourceTree = ""; }; + BCFC43680C2D8165DD3A9F1E /* MachineLearningKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = MachineLearningKit.podspec; path = ../MachineLearningKit.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + E163E79921352514002310EB /* GameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = ""; }; + E163E79E21352514002310EB /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + E163E79F21352514002310EB /* GameScene.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = GameScene.sks; sourceTree = ""; }; + E163E7A021352514002310EB /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E163E7A121352514002310EB /* GameScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = ""; }; + E163E7A221352514002310EB /* GeneticOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneticOperations.swift; sourceTree = ""; }; + E163E7A321352514002310EB /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E163E7C621352561002310EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = LaunchScreen.xib; sourceTree = ""; }; + E163E7C821352561002310EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Main.storyboard; sourceTree = ""; }; + E163E7C921352561002310EB /* bird.atlas */ = {isa = PBXFileReference; lastKnownFileType = folder.skatlas; path = bird.atlas; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -130,9 +129,10 @@ 607FACC71AFB9204008FA782 = { isa = PBXGroup; children = ( - 9A4707A91E5C8F51002C2268 /* MLKit-PlayGround.playground */, - 607FACF51AFB993E008FA782 /* Podspec Metadata */, - 607FACD21AFB9204008FA782 /* Example for MLKit */, + 1C1CAD4BD2BE393928F7BE50 /* LICENSE */, + BCFC43680C2D8165DD3A9F1E /* MachineLearningKit.podspec */, + 65CE8F014155800F07E3652F /* README.md */, + E163E79721352514002310EB /* MLKit */, 607FACE81AFB9204008FA782 /* Tests */, 607FACD11AFB9204008FA782 /* Products */, 2BB0D1DA9E4FBF6A18F70F15 /* Pods */, @@ -149,65 +149,46 @@ name = Products; sourceTree = ""; }; - 607FACD21AFB9204008FA782 /* Example for MLKit */ = { - isa = PBXGroup; - children = ( - 607FACD51AFB9204008FA782 /* AppDelegate.swift */, - 9A5294451E6F22BA00506C2A /* GameScene.sks */, - 9A52944F1E6F44E200506C2A /* GeneticOperations.swift */, - 9A5294471E6F22C000506C2A /* GameScene.swift */, - 9A5294491E6F22C800506C2A /* GameViewController.swift */, - 607FACD91AFB9204008FA782 /* Main.storyboard */, - 9A52944B1E6F232F00506C2A /* bird.atlas */, - 607FACDC1AFB9204008FA782 /* Images.xcassets */, - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, - 607FACD31AFB9204008FA782 /* Supporting Files */, - ); - name = "Example for MLKit"; - path = MLKit; - sourceTree = ""; - }; - 607FACD31AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACD41AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; 607FACE81AFB9204008FA782 /* Tests */ = { isa = PBXGroup; children = ( 9A92AE131E6DBD9A000DBC84 /* CSVReader.swift */, + 9A2618FD1E6F1C4E006B9D6E /* GeneticSpec.swift */, + 607FACEA1AFB9204008FA782 /* Info.plist */, + 9A54B3B71E5B5D6D0059B577 /* kc_house_data.csv */, 9A92AE051E6DB958000DBC84 /* LassoRegressionSpec.swift */, 9A92AE071E6DB96B000DBC84 /* MLDataManagerSpec.swift */, + 9A92AE0F1E6DB9B1000DBC84 /* NeuralNetworkSpec.swift */, 9A92AE091E6DB984000DBC84 /* PolynomialRegressionSpec.swift */, - 9A92AE0B1E6DB995000DBC84 /* SimpleLinearRegressionSpec.swift */, 9A92AE0D1E6DB9A4000DBC84 /* RidgeRegressionSpec.swift */, - 9A92AE0F1E6DB9B1000DBC84 /* NeuralNetworkSpec.swift */, - 9A2618FD1E6F1C4E006B9D6E /* GeneticSpec.swift */, - 607FACE91AFB9204008FA782 /* Supporting Files */, + 9A92AE0B1E6DB995000DBC84 /* SimpleLinearRegressionSpec.swift */, ); path = Tests; sourceTree = ""; }; - 607FACE91AFB9204008FA782 /* Supporting Files */ = { + E163E79721352514002310EB /* MLKit */ = { isa = PBXGroup; children = ( - 9A54B3B71E5B5D6D0059B577 /* kc_house_data.csv */, - 607FACEA1AFB9204008FA782 /* Info.plist */, + E163E7A021352514002310EB /* AppDelegate.swift */, + E163E7C421352561002310EB /* Base.lproj */, + E163E7C921352561002310EB /* bird.atlas */, + E163E79F21352514002310EB /* GameScene.sks */, + E163E7A121352514002310EB /* GameScene.swift */, + E163E79921352514002310EB /* GameViewController.swift */, + E163E7A221352514002310EB /* GeneticOperations.swift */, + E163E79E21352514002310EB /* Images.xcassets */, + E163E7A321352514002310EB /* Info.plist */, ); - name = "Supporting Files"; + path = MLKit; sourceTree = ""; }; - 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { + E163E7C421352561002310EB /* Base.lproj */ = { isa = PBXGroup; children = ( - BCFC43680C2D8165DD3A9F1E /* MachineLearningKit.podspec */, - 65CE8F014155800F07E3652F /* README.md */, - 1C1CAD4BD2BE393928F7BE50 /* LICENSE */, + E163E7C521352561002310EB /* LaunchScreen.xib */, + E163E7C721352561002310EB /* Main.storyboard */, ); - name = "Podspec Metadata"; + path = Base.lproj; sourceTree = ""; }; /* End PBXGroup section */ @@ -222,7 +203,6 @@ 607FACCD1AFB9204008FA782 /* Frameworks */, 607FACCE1AFB9204008FA782 /* Resources */, B2A28970539C0F840B7FC745 /* [CP] Embed Pods Frameworks */, - 3A8A5DE2CE9B29776BD52FBD /* [CP] Copy Pods Resources */, 9A4707BB1E5C8FCB002C2268 /* Embed Frameworks */, ); buildRules = ( @@ -243,7 +223,6 @@ 607FACE21AFB9204008FA782 /* Frameworks */, 607FACE31AFB9204008FA782 /* Resources */, 24A3EFCC92C196B1ED88B40B /* [CP] Embed Pods Frameworks */, - E0D9FAAD7A176A48DE5B1E39 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -262,18 +241,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 0940; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 607FACCF1AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 0940; ProvisioningStyle = Automatic; }; 607FACE41AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; DevelopmentTeam = DZV4MYF2U6; - LastSwiftMigration = 0820; + LastSwiftMigration = 0940; TestTargetID = 607FACCF1AFB9204008FA782; }; }; @@ -302,11 +281,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9A5294461E6F22BA00506C2A /* GameScene.sks in Resources */, - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, - 9A52944C1E6F232F00506C2A /* bird.atlas in Resources */, - 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, + E163E7CB21352561002310EB /* Main.storyboard in Resources */, + E163E7B521352514002310EB /* Images.xcassets in Resources */, + E163E7B621352514002310EB /* GameScene.sks in Resources */, + E163E7CA21352561002310EB /* LaunchScreen.xib in Resources */, + E163E7CC21352561002310EB /* bird.atlas in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -327,39 +306,34 @@ files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework", + "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Quick.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 3A8A5DE2CE9B29776BD52FBD /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; B2A28970539C0F840B7FC745 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${SRCROOT}/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/MachineLearningKit/MachineLearningKit.framework", + "${BUILT_PRODUCTS_DIR}/Upsurge/Upsurge.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MachineLearningKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Upsurge.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -372,13 +346,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-MLKit_Tests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; CBF04E3B88BDFD9CA04873B6 /* [CP] Check Pods Manifest.lock */ = { @@ -387,28 +364,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-MLKit_Example-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - E0D9FAAD7A176A48DE5B1E39 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -418,10 +383,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9A5294481E6F22C000506C2A /* GameScene.swift in Sources */, - 9A5294501E6F44E200506C2A /* GeneticOperations.swift in Sources */, - 9A52944A1E6F22C800506C2A /* GameViewController.swift in Sources */, - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + E163E7B821352514002310EB /* GameScene.swift in Sources */, + E163E7B921352514002310EB /* GeneticOperations.swift in Sources */, + E163E7B721352514002310EB /* AppDelegate.swift in Sources */, + E163E7B221352514002310EB /* GameViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -451,20 +416,20 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 607FACD91AFB9204008FA782 /* Main.storyboard */ = { + E163E7C521352561002310EB /* LaunchScreen.xib */ = { isa = PBXVariantGroup; children = ( - 607FACDA1AFB9204008FA782 /* Base */, + E163E7C621352561002310EB /* Base */, ); - name = Main.storyboard; + name = LaunchScreen.xib; sourceTree = ""; }; - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { + E163E7C721352561002310EB /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 607FACDF1AFB9204008FA782 /* Base */, + E163E7C821352561002310EB /* Base */, ); - name = LaunchScreen.xib; + name = Main.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ @@ -478,14 +443,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -509,7 +482,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -525,14 +498,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -549,7 +530,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -562,6 +543,7 @@ baseConfigurationReference = 533ED56CBC06E518D99EE4BE /* Pods-MLKit_Example.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = MLKit/Info.plist; @@ -570,7 +552,8 @@ MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -579,6 +562,7 @@ baseConfigurationReference = AD54BBE1B07E33FF3F5DD543 /* Pods-MLKit_Example.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = MLKit/Info.plist; @@ -587,7 +571,7 @@ MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; }; name = Release; }; @@ -595,9 +579,10 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0A3DE73AE01ACF9939D79E62 /* Pods-MLKit_Tests.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; DEVELOPMENT_TEAM = DZV4MYF2U6; FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", + "$(SDKROOT)/System/Library/Frameworks", "$(inherited)", ); GCC_PREPROCESSOR_DEFINITIONS = ( @@ -609,7 +594,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MLKit_Example.app/MLKit_Example"; }; name = Debug; @@ -618,9 +603,10 @@ isa = XCBuildConfiguration; baseConfigurationReference = 6FE1BF7F8EF374CFB92CBB77 /* Pods-MLKit_Tests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; DEVELOPMENT_TEAM = DZV4MYF2U6; FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", + "$(SDKROOT)/System/Library/Frameworks", "$(inherited)", ); INFOPLIST_FILE = Tests/Info.plist; @@ -628,7 +614,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/MLKit_Example.app/MLKit_Example"; }; name = Release; diff --git a/Example/MLKit.xcodeproj/xcshareddata/xcschemes/MLKit-Example.xcscheme b/Example/MLKit.xcodeproj/xcshareddata/xcschemes/MLKit-Example.xcscheme index a2b7ab9..f247345 100644 --- a/Example/MLKit.xcodeproj/xcshareddata/xcschemes/MLKit-Example.xcscheme +++ b/Example/MLKit.xcodeproj/xcshareddata/xcschemes/MLKit-Example.xcscheme @@ -1,6 +1,6 @@ + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/MLKit/GameScene.swift b/Example/MLKit/GameScene.swift index ebf4b47..9a6e9bf 100755 --- a/Example/MLKit/GameScene.swift +++ b/Example/MLKit/GameScene.swift @@ -310,10 +310,10 @@ class GameScene: SKScene, SKPhysicsContactDelegate { if bird.fitness >= 9.0 { print("FOUND RARE BIRD") - print(bird.brain?.layers[0].weights) - print(bird.brain?.layers[1].weights) - print(bird.brain?.layers[0].bias) - print(bird.brain?.layers[1].bias) + print(bird.brain?.layers[0].weights as Any) + print(bird.brain?.layers[1].weights as Any) + print(bird.brain?.layers[0].bias as Any) + print(bird.brain?.layers[1].bias as Any) } } @@ -396,7 +396,7 @@ class GameScene: SKScene, SKPhysicsContactDelegate { if generation.count > currentFlappy { currentBird = generation[currentFlappy] } else { - if let bestBird = maxBird { + if maxBird != nil { currentBird = maxBird } } @@ -549,7 +549,7 @@ class GameScene: SKScene, SKPhysicsContactDelegate { moving.speed = 0 bird.physicsBody?.collisionBitMask = worldCategory - bird.run( SKAction.rotate(byAngle: CGFloat(M_PI) * CGFloat(bird.position.y) * 0.01, duration:1), completion: {self.bird.speed = 0 }) + bird.run( SKAction.rotate(byAngle: CGFloat.pi * CGFloat(bird.position.y) * 0.01, duration:1), completion: {self.bird.speed = 0 }) // Flash background if contact is detected self.removeAction(forKey: "flash") @@ -587,7 +587,7 @@ class GameScene: SKScene, SKPhysicsContactDelegate { moving.speed = 0 bird.physicsBody?.collisionBitMask = worldCategory - bird.run( SKAction.rotate(byAngle: CGFloat(M_PI) * CGFloat(bird.position.y) * 0.01, duration:1), completion: {self.bird.speed = 0 }) + bird.run( SKAction.rotate(byAngle: CGFloat.pi * CGFloat(bird.position.y) * 0.01, duration:1), completion: {self.bird.speed = 0 }) // Flash background if contact is detected self.removeAction(forKey: "flash") diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json index b8236c6..19882d5 100644 --- a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json @@ -39,6 +39,11 @@ "idiom" : "iphone", "size" : "60x60", "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Example/Podfile b/Example/Podfile index 6fb3fc1..c522415 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -13,7 +13,7 @@ target 'MLKit_Example' do post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '3.0' + config.build_settings['SWIFT_VERSION'] = '4.0' end end end diff --git a/Example/Podfile.lock b/Example/Podfile.lock index c0288ad..db22dea 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,9 +1,9 @@ PODS: - - MachineLearningKit (0.1.7): + - MachineLearningKit (0.1.8): - Upsurge - - Nimble (6.0.1) - - Quick (1.1.0) - - Upsurge (0.8.0) + - Nimble (7.1.3) + - Quick (1.3.1) + - Upsurge (0.10.2) DEPENDENCIES: - MachineLearningKit (from `../`) @@ -11,16 +11,22 @@ DEPENDENCIES: - Quick - Upsurge +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Nimble + - Quick + - Upsurge + EXTERNAL SOURCES: MachineLearningKit: - :path: ../ + :path: "../" SPEC CHECKSUMS: - MachineLearningKit: 040457b6d6afce606454c16008b954f3952a0d32 - Nimble: 1527fd1bd2b4cf0636251a36bc8ab37e81da8347 - Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d - Upsurge: 614412863a3b5470b31636a004654b6ef3a34f47 + MachineLearningKit: 24cf37aed754e3fab2b5c0c823e3e82a0063f905 + Nimble: 2839b01d1b31f6a6a7777a221f0d91cf52e8e27b + Quick: d17304d58d0d169dd0bd1c6e5c28e3318de32a1a + Upsurge: 5866beadc3da27f91c5df4ac795deb3f3238d678 -PODFILE CHECKSUM: 6efa57e13fa4fabb331b61a3a84a43c047bb3113 +PODFILE CHECKSUM: 6f086d02cdc4ed10abc56279cba6e00448c35830 -COCOAPODS: 1.2.0 +COCOAPODS: 1.5.3 diff --git a/Example/Pods/Local Podspecs/MLKit.podspec.json b/Example/Pods/Local Podspecs/MLKit.podspec.json deleted file mode 100644 index fcf3edc..0000000 --- a/Example/Pods/Local Podspecs/MLKit.podspec.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "MLKit", - "version": "0.1.0", - "summary": "A simple machine learning framework written in Swift 🤖", - "description": "MLKit is a simple machine learning framework written in Swift. Currently MLKit features machine learning algorithms that deal with the topic of regression, but the framework will expand over time with topics such as classification, clustering, recommender systems, and deep learning. The vision and goal of this framework is to provide developers with a toolkit to create products that can learn from data. MLKit is a side project of mine in order to make it easier for developers to implement machine learning algorithms on the go, and to familiarlize myself with machine learning concepts.", - "homepage": "https://github.com/Somnibyte/MLKit", - "license": { - "type": "MIT", - "file": "LICENSE" - }, - "authors": { - "Guled Ahmed": "guledahmed777@gmail.com" - }, - "source": { - "git": "https://github.com/Somnibyte/MLKit.git", - "tag": "0.1.0" - }, - "platforms": { - "ios": "9.0", - "watchos": "3.1", - "tvos": "10.1" - }, - "source_files": "MLKit/Classes/**/*", - "frameworks": [ - "UIKit", - "MapKit" - ], - "dependencies": { - "Upsurge": [ - - ] - } -} diff --git a/Example/Pods/Local Podspecs/MachineLearningKit.podspec.json b/Example/Pods/Local Podspecs/MachineLearningKit.podspec.json index 2443d3f..7a006a8 100644 --- a/Example/Pods/Local Podspecs/MachineLearningKit.podspec.json +++ b/Example/Pods/Local Podspecs/MachineLearningKit.podspec.json @@ -1,6 +1,6 @@ { "name": "MachineLearningKit", - "version": "0.1.7", + "version": "0.1.8", "summary": "A simple machine learning framework written in Swift 🤖", "description": "MLKit is a simple machine learning framework written in Swift. Currently MLKit features machine learning algorithms that deal with the topic of regression, but the framework will expand over time with topics such as classification, clustering, recommender systems, and deep learning. The vision and goal of this framework is to provide developers with a toolkit to create products that can learn from data. MLKit is a side project of mine in order to make it easier for developers to implement machine learning algorithms on the go, and to familiarlize myself with machine learning concepts.", "homepage": "https://github.com/Somnibyte/MLKit", @@ -13,7 +13,7 @@ }, "source": { "git": "https://github.com/Somnibyte/MLKit.git", - "tag": "0.1.7" + "tag": "0.1.8" }, "platforms": { "ios": "9.0", diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index c0288ad..db22dea 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,9 +1,9 @@ PODS: - - MachineLearningKit (0.1.7): + - MachineLearningKit (0.1.8): - Upsurge - - Nimble (6.0.1) - - Quick (1.1.0) - - Upsurge (0.8.0) + - Nimble (7.1.3) + - Quick (1.3.1) + - Upsurge (0.10.2) DEPENDENCIES: - MachineLearningKit (from `../`) @@ -11,16 +11,22 @@ DEPENDENCIES: - Quick - Upsurge +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Nimble + - Quick + - Upsurge + EXTERNAL SOURCES: MachineLearningKit: - :path: ../ + :path: "../" SPEC CHECKSUMS: - MachineLearningKit: 040457b6d6afce606454c16008b954f3952a0d32 - Nimble: 1527fd1bd2b4cf0636251a36bc8ab37e81da8347 - Quick: dafc587e21eed9f4cab3249b9f9015b0b7a7f71d - Upsurge: 614412863a3b5470b31636a004654b6ef3a34f47 + MachineLearningKit: 24cf37aed754e3fab2b5c0c823e3e82a0063f905 + Nimble: 2839b01d1b31f6a6a7777a221f0d91cf52e8e27b + Quick: d17304d58d0d169dd0bd1c6e5c28e3318de32a1a + Upsurge: 5866beadc3da27f91c5df4ac795deb3f3238d678 -PODFILE CHECKSUM: 6efa57e13fa4fabb331b61a3a84a43c047bb3113 +PODFILE CHECKSUM: 6f086d02cdc4ed10abc56279cba6e00448c35830 -COCOAPODS: 1.2.0 +COCOAPODS: 1.5.3 diff --git a/Example/Pods/Nimble/README.md b/Example/Pods/Nimble/README.md index ecf9501..19c562f 100644 --- a/Example/Pods/Nimble/README.md +++ b/Example/Pods/Nimble/README.md @@ -1,5 +1,10 @@ # Nimble +[![Build Status](https://travis-ci.org/Quick/Nimble.svg?branch=master)](https://travis-ci.org/Quick/Nimble) +[![CocoaPods](https://img.shields.io/cocoapods/v/Nimble.svg)](https://cocoapods.org/pods/Nimble) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Platforms](https://img.shields.io/cocoapods/p/Nimble.svg)](https://cocoapods.org/pods/Nimble) + Use Nimble to express the expected outcomes of Swift or Objective-C expressions. Inspired by [Cedar](https://github.com/pivotal/cedar). @@ -42,16 +47,25 @@ expect(ocean.isClean).toEventually(beTruthy()) - [Exceptions](#exceptions) - [Collection Membership](#collection-membership) - [Strings](#strings) - - [Checking if all elements of a collection pass a condition](#checking-if-all-elements-of-a-collection-pass-a-condition) - - [Verify collection count](#verify-collection-count) - - [Verify a notification was posted](#verifying-a-notification-was-posted) + - [Collection Elements](#collection-elements) + - [Collection Count](#collection-count) + - [Notifications](#notifications) - [Matching a value to any of a group of matchers](#matching-a-value-to-any-of-a-group-of-matchers) + - [Custom Validation](#custom-validation) - [Writing Your Own Matchers](#writing-your-own-matchers) + - [PredicateResult](#predicateresult) - [Lazy Evaluation](#lazy-evaluation) - [Type Checking via Swift Generics](#type-checking-via-swift-generics) - [Customizing Failure Messages](#customizing-failure-messages) + - [Basic Customization](#basic-customization) + - [Full Customization](#full-customization) - [Supporting Objective-C](#supporting-objective-c) - [Properly Handling `nil` in Objective-C Matchers](#properly-handling-nil-in-objective-c-matchers) + - [Migrating from the Old Matcher API](#migrating-from-the-old-matcher-api) + - [Minimal Step - Use `.predicate`](#minimal-step---use-predicate) + - [Convert to use `Predicate` Type with Old Matcher Constructor](#convert-to-use-predicate-type-with-old-matcher-constructor) + - [Convert to `Predicate` Type with Preferred Constructor](#convert-to-predicate-type-with-preferred-constructor) + - [Deprecation Roadmap](#deprecation-roadmap) - [Installing Nimble](#installing-nimble) - [Installing Nimble as a Submodule](#installing-nimble-as-a-submodule) - [Installing Nimble via CocoaPods](#installing-nimble-via-cocoapods) @@ -212,9 +226,9 @@ exception once evaluated: // that Nimble will catch. // (see https://github.com/Quick/Nimble/issues/220#issuecomment-172667064) let exception = NSException( - name: NSInternalInconsistencyException, - reason: "Not enough fish in the sea.", - userInfo: ["something": "is fishy"]) + name: NSInternalInconsistencyException, + reason: "Not enough fish in the sea.", + userInfo: ["something": "is fishy"]) expect { exception.raise() }.to(raiseException()) // Also, you can customize raiseException to be more specific @@ -282,9 +296,9 @@ expect(1 as CInt).to(equal(1)) make expectations on primitive C values, wrap then in an object literal: - ```objc - expect(@(1 + 1)).to(equal(@2)); - ``` +```objc +expect(@(1 + 1)).to(equal(@2)); +``` ## Asynchronous Expectations @@ -292,11 +306,22 @@ In Nimble, it's easy to make expectations on values that are updated asynchronously. Just use `toEventually` or `toEventuallyNot`: ```swift -// Swift +// Swift 3.0 and later + +DispatchQueue.main.async { + ocean.add("dolphins") + ocean.add("whales") +} +expect(ocean).toEventually(contain("dolphins", "whales")) +``` + + +```swift +// Swift 2.3 and earlier dispatch_async(dispatch_get_main_queue()) { - ocean.add("dolphins") - ocean.add("whales") + ocean.add("dolphins") + ocean.add("whales") } expect(ocean).toEventually(contain("dolphins", "whales")) ``` @@ -304,9 +329,10 @@ expect(ocean).toEventually(contain("dolphins", "whales")) ```objc // Objective-C + dispatch_async(dispatch_get_main_queue(), ^{ - [ocean add:@"dolphins"]; - [ocean add:@"whales"]; + [ocean add:@"dolphins"]; + [ocean add:@"whales"]; }); expect(ocean).toEventually(contain(@"dolphins", @"whales")); ``` @@ -348,9 +374,10 @@ You can also provide a callback by using the `waitUntil` function: // Swift waitUntil { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(0.5) - done() + ocean.goFish { success in + expect(success).to(beTrue()) + done() + } } ``` @@ -358,9 +385,10 @@ waitUntil { done in // Objective-C waitUntil(^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:0.5]; - done(); + [ocean goFishWithHandler:^(BOOL success){ + expect(success).to(beTrue()); + done(); + }]; }); ``` @@ -370,9 +398,10 @@ waitUntil(^(void (^done)(void)){ // Swift waitUntil(timeout: 10) { done in - // do some stuff that takes a while... - NSThread.sleepForTimeInterval(1) - done() + ocean.goFish { success in + expect(success).to(beTrue()) + done() + } } ``` @@ -380,13 +409,14 @@ waitUntil(timeout: 10) { done in // Objective-C waitUntilTimeout(10, ^(void (^done)(void)){ - // do some stuff that takes a while... - [NSThread sleepForTimeInterval:1]; - done(); + [ocean goFishWithHandler:^(BOOL success){ + expect(success).to(beTrue()); + done(); + }]; }); ``` -Note: waitUntil triggers its timeout code on the main thread. Blocking the main +Note: `waitUntil` triggers its timeout code on the main thread. Blocking the main thread will cause Nimble to stop the run loop to continue. This can cause test pollution for whatever incomplete code that was running on the main thread. Blocking the main thread can be caused by blocking IO, calls to sleep(), @@ -496,25 +526,25 @@ Nimble supports checking the type membership of any kind of object, whether Objective-C conformant or not: ```swift -// Swift +// Swift protocol SomeProtocol{} class SomeClassConformingToProtocol: SomeProtocol{} struct SomeStructConformingToProtocol: SomeProtocol{} // The following tests pass -expect(1).to(beKindOf(Int.self)) -expect("turtle").to(beKindOf(String.self)) +expect(1).to(beAKindOf(Int.self)) +expect("turtle").to(beAKindOf(String.self)) let classObject = SomeClassConformingToProtocol() -expect(classObject).to(beKindOf(SomeProtocol.self)) -expect(classObject).to(beKindOf(SomeClassConformingToProtocol.self)) -expect(classObject).toNot(beKindOf(SomeStructConformingToProtocol.self)) +expect(classObject).to(beAKindOf(SomeProtocol.self)) +expect(classObject).to(beAKindOf(SomeClassConformingToProtocol.self)) +expect(classObject).toNot(beAKindOf(SomeStructConformingToProtocol.self)) let structObject = SomeStructConformingToProtocol() -expect(structObject).to(beKindOf(SomeProtocol.self)) -expect(structObject).to(beKindOf(SomeStructConformingToProtocol.self)) -expect(structObject).toNot(beKindOf(SomeClassConformingToProtocol.self)) +expect(structObject).to(beAKindOf(SomeProtocol.self)) +expect(structObject).to(beAKindOf(SomeStructConformingToProtocol.self)) +expect(structObject).toNot(beAKindOf(SomeClassConformingToProtocol.self)) ``` ```objc @@ -527,16 +557,17 @@ expect(@1).toNot(beAKindOf([NSNull class])); ``` Objects can be tested for their exact types using the `beAnInstanceOf` matcher: + ```swift -// Swift +// Swift protocol SomeProtocol{} class SomeClassConformingToProtocol: SomeProtocol{} struct SomeStructConformingToProtocol: SomeProtocol{} -// Unlike the 'beKindOf' matcher, the 'beAnInstanceOf' matcher only +// Unlike the 'beKindOf' matcher, the 'beAnInstanceOf' matcher only // passes if the object is the EXACT type requested. The following -// tests pass -- note its behavior when working in an inheritance hierarchy. +// tests pass -- note its behavior when working in an inheritance hierarchy. expect(1).to(beAnInstanceOf(Int.self)) expect("turtle").to(beAnInstanceOf(String.self)) @@ -549,18 +580,18 @@ let structObject = SomeStructConformingToProtocol() expect(structObject).toNot(beAnInstanceOf(SomeProtocol.self)) expect(structObject).to(beAnInstanceOf(SomeStructConformingToProtocol.self)) expect(structObject).toNot(beAnInstanceOf(SomeClassConformingToProtocol.self)) -```` +``` ## Equivalence ```swift // Swift -// Passes if actual is equivalent to expected: +// Passes if 'actual' is equivalent to 'expected': expect(actual).to(equal(expected)) expect(actual) == expected -// Passes if actual is not equivalent to expected: +// Passes if 'actual' is not equivalent to 'expected': expect(actual).toNot(equal(expected)) expect(actual) != expected ``` @@ -568,10 +599,10 @@ expect(actual) != expected ```objc // Objective-C -// Passes if actual is equivalent to expected: +// Passes if 'actual' is equivalent to 'expected': expect(actual).to(equal(expected)) -// Passes if actual is not equivalent to expected: +// Passes if 'actual' is not equivalent to 'expected': expect(actual).toNot(equal(expected)) ``` @@ -583,25 +614,33 @@ Values must be `Equatable`, `Comparable`, or subclasses of `NSObject`. ```swift // Swift -// Passes if actual has the same pointer address as expected: +// Passes if 'actual' has the same pointer address as 'expected': expect(actual).to(beIdenticalTo(expected)) expect(actual) === expected -// Passes if actual does not have the same pointer address as expected: +// Passes if 'actual' does not have the same pointer address as 'expected': expect(actual).toNot(beIdenticalTo(expected)) expect(actual) !== expected ``` -Its important to remember that `beIdenticalTo` only makes sense when comparing types with reference semantics, which have a notion of identity. In Swift, that means a `class`. This matcher will not work with types with value semantics such as `struct` or `enum`. If you need to compare two value types, you can either compare individual properties or if it makes sense to do so, make your type implement `Equatable` and use Nimble's equivalence matchers instead. +It is important to remember that `beIdenticalTo` only makes sense when comparing +types with reference semantics, which have a notion of identity. In Swift, +that means types that are defined as a `class`. + +This matcher will not work when comparing types with value semantics such as +those defined as a `struct` or `enum`. If you need to compare two value types, +consider what it means for instances of your type to be identical. This may mean +comparing individual properties or, if it makes sense to do so, conforming your type +to `Equatable` and using Nimble's equivalence matchers instead. ```objc // Objective-C -// Passes if actual has the same pointer address as expected: +// Passes if 'actual' has the same pointer address as 'expected': expect(actual).to(beIdenticalTo(expected)); -// Passes if actual does not have the same pointer address as expected: +// Passes if 'actual' does not have the same pointer address as 'expected': expect(actual).toNot(beIdenticalTo(expected)); ``` @@ -675,7 +714,7 @@ expect(actual) ≈ expected expect(actual) ≈ (expected, delta) ``` -(Type Option-x to get ≈ on a U.S. keyboard) +(Type option+x to get `≈` on a U.S. keyboard) The former version uses the default delta of 0.0001. Here is yet another way to do this: @@ -686,7 +725,7 @@ expect(actual) ≈ expected ± delta expect(actual) == expected ± delta ``` -(Type Option-Shift-= to get ± on a U.S. keyboard) +(Type option+shift+= to get `±` on a U.S. keyboard) If you are comparing arrays of floating point numbers, you'll find the following useful: @@ -706,20 +745,20 @@ expect([0.0, 2.0]).to(beCloseTo([0.1, 2.1], within: 0.1)) ```swift // Swift -// Passes if instance is an instance of aClass: +// Passes if 'instance' is an instance of 'aClass': expect(instance).to(beAnInstanceOf(aClass)) -// Passes if instance is an instance of aClass or any of its subclasses: +// Passes if 'instance' is an instance of 'aClass' or any of its subclasses: expect(instance).to(beAKindOf(aClass)) ``` ```objc // Objective-C -// Passes if instance is an instance of aClass: +// Passes if 'instance' is an instance of 'aClass': expect(instance).to(beAnInstanceOf(aClass)); -// Passes if instance is an instance of aClass or any of its subclasses: +// Passes if 'instance' is an instance of 'aClass' or any of its subclasses: expect(instance).to(beAKindOf(aClass)); ``` @@ -746,38 +785,38 @@ expect(dolphin).to(beAKindOf([Mammal class])); ## Truthiness ```swift -// Passes if actual is not nil, true, or an object with a boolean value of true: +// Passes if 'actual' is not nil, true, or an object with a boolean value of true: expect(actual).to(beTruthy()) -// Passes if actual is only true (not nil or an object conforming to Boolean true): +// Passes if 'actual' is only true (not nil or an object conforming to Boolean true): expect(actual).to(beTrue()) -// Passes if actual is nil, false, or an object with a boolean value of false: +// Passes if 'actual' is nil, false, or an object with a boolean value of false: expect(actual).to(beFalsy()) -// Passes if actual is only false (not nil or an object conforming to Boolean false): +// Passes if 'actual' is only false (not nil or an object conforming to Boolean false): expect(actual).to(beFalse()) -// Passes if actual is nil: +// Passes if 'actual' is nil: expect(actual).to(beNil()) ``` ```objc // Objective-C -// Passes if actual is not nil, true, or an object with a boolean value of true: +// Passes if 'actual' is not nil, true, or an object with a boolean value of true: expect(actual).to(beTruthy()); -// Passes if actual is only true (not nil or an object conforming to Boolean true): +// Passes if 'actual' is only true (not nil or an object conforming to Boolean true): expect(actual).to(beTrue()); -// Passes if actual is nil, false, or an object with a boolean value of false: +// Passes if 'actual' is nil, false, or an object with a boolean value of false: expect(actual).to(beFalsy()); -// Passes if actual is only false (not nil or an object conforming to Boolean false): +// Passes if 'actual' is only false (not nil or an object conforming to Boolean false): expect(actual).to(beFalse()); -// Passes if actual is nil: +// Passes if 'actual' is nil: expect(actual).to(beNil()); ``` @@ -788,14 +827,16 @@ If you're using Swift, you can use the `throwAssertion` matcher to check if an a ```swift // Swift -// Passes if somethingThatThrows() throws an assertion, such as calling fatalError() or precondition fails: +// Passes if 'somethingThatThrows()' throws an assertion, +// such as by calling 'fatalError()' or if a precondition fails: +expect { try somethingThatThrows() }.to(throwAssertion()) expect { () -> Void in fatalError() }.to(throwAssertion()) expect { precondition(false) }.to(throwAssertion()) -// Passes if throwing a NSError is not equal to throwing an assertion: +// Passes if throwing an NSError is not equal to throwing an assertion: expect { throw NSError(domain: "test", code: 0, userInfo: nil) }.toNot(throwAssertion()) -// Passes if the post assertion code is not run: +// Passes if the code after the precondition check is not run: var reachedPoint1 = false var reachedPoint2 = false expect { @@ -816,40 +857,53 @@ Notes: ## Swift Error Handling -If you're using Swift 2.0+, you can use the `throwError` matcher to check if an error is thrown. +If you're using Swift 2.0 or newer, you can use the `throwError` matcher to check if an error is thrown. + +Note: +The following code sample references the `Swift.Error` protocol. +This is `Swift.ErrorProtocol` in versions of Swift prior to version 3.0. ```swift // Swift -// Passes if somethingThatThrows() throws an ErrorProtocol: -expect{ try somethingThatThrows() }.to(throwError()) +// Passes if 'somethingThatThrows()' throws an 'Error': +expect { try somethingThatThrows() }.to(throwError()) -// Passes if somethingThatThrows() throws an error with a given domain: -expect{ try somethingThatThrows() }.to(throwError { (error: ErrorProtocol) in +// Passes if 'somethingThatThrows()' throws an error within a particular domain: +expect { try somethingThatThrows() }.to(throwError { (error: Error) in expect(error._domain).to(equal(NSCocoaErrorDomain)) }) -// Passes if somethingThatThrows() throws an error with a given case: -expect{ try somethingThatThrows() }.to(throwError(NSCocoaError.PropertyListReadCorruptError)) +// Passes if 'somethingThatThrows()' throws a particular error enum case: +expect { try somethingThatThrows() }.to(throwError(NSCocoaError.PropertyListReadCorruptError)) -// Passes if somethingThatThrows() throws an error with a given type: -expect{ try somethingThatThrows() }.to(throwError(errorType: NimbleError.self)) +// Passes if 'somethingThatThrows()' throws an error of a particular type: +expect { try somethingThatThrows() }.to(throwError(errorType: NimbleError.self)) ``` -If you are working directly with `ErrorProtocol` values, as is sometimes the case when using `Result` or `Promise` types, you can use the `matchError` matcher to check if the error is the same error is is supposed to be, without requiring explicit casting. +When working directly with `Error` values, using the `matchError` matcher +allows you to perform certain checks on the error itself without having to +explicitly cast the error. + +The `matchError` matcher allows you to check whether or not the error: + +- is the same _type_ of error you are expecting. +- represents a particular error value that you are expecting. + +This can be useful when using `Result` or `Promise` types, for example. ```swift // Swift -let actual: ErrorProtocol = … +let actual: Error = ... -// Passes if actual contains any error value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum)) +// Passes if 'actual' represents any error value from the NimbleErrorEnum type: +expect(actual).to(matchError(NimbleErrorEnum.self)) -// Passes if actual contains the Timeout value from the NimbleErrorEnum type: -expect(actual).to(matchError(NimbleErrorEnum.Timeout)) +// Passes if 'actual' represents the case 'timeout' from the NimbleErrorEnum type: +expect(actual).to(matchError(NimbleErrorEnum.timeout)) -// Passes if actual contains an NSError equal to the given one: +// Passes if 'actual' contains an NSError equal to the one provided: expect(actual).to(matchError(NSError(domain: "err", code: 123, userInfo: nil))) ``` @@ -860,17 +914,17 @@ Note: This feature is only available in Swift. ```swift // Swift -// Passes if actual, when evaluated, raises an exception: +// Passes if 'actual', when evaluated, raises an exception: expect(actual).to(raiseException()) -// Passes if actual raises an exception with the given name: +// Passes if 'actual' raises an exception with the given name: expect(actual).to(raiseException(named: name)) -// Passes if actual raises an exception with the given name and reason: +// Passes if 'actual' raises an exception with the given name and reason: expect(actual).to(raiseException(named: name, reason: reason)) -// Passes if actual raises an exception and it passes expectations in the block -// (in this case, if name begins with 'a r') +// Passes if 'actual' raises an exception which passes expectations defined in the given closure: +// (in this case, if the exception's name begins with "a r") expect { exception.raise() }.to(raiseException { (exception: NSException) in expect(exception.name).to(beginWith("a r")) }) @@ -879,44 +933,44 @@ expect { exception.raise() }.to(raiseException { (exception: NSException) in ```objc // Objective-C -// Passes if actual, when evaluated, raises an exception: +// Passes if 'actual', when evaluated, raises an exception: expect(actual).to(raiseException()) -// Passes if actual raises an exception with the given name +// Passes if 'actual' raises an exception with the given name expect(actual).to(raiseException().named(name)) -// Passes if actual raises an exception with the given name and reason: +// Passes if 'actual' raises an exception with the given name and reason: expect(actual).to(raiseException().named(name).reason(reason)) -// Passes if actual raises an exception and it passes expectations in the block -// (in this case, if name begins with 'a r') +// Passes if 'actual' raises an exception and it passes expectations defined in the given block: +// (in this case, if name begins with "a r") expect(actual).to(raiseException().satisfyingBlock(^(NSException *exception) { expect(exception.name).to(beginWith(@"a r")); })); ``` -Note: Swift currently doesn't have exceptions (see [#220](https://github.com/Quick/Nimble/issues/220#issuecomment-172667064)). Only Objective-C code can raise -exceptions that Nimble will catch. +Note: Swift currently doesn't have exceptions (see [#220](https://github.com/Quick/Nimble/issues/220#issuecomment-172667064)). +Only Objective-C code can raise exceptions that Nimble will catch. ## Collection Membership ```swift // Swift -// Passes if all of the expected values are members of actual: +// Passes if all of the expected values are members of 'actual': expect(actual).to(contain(expected...)) -// Passes if actual is an empty collection (it contains no elements): +// Passes if 'actual' is empty (i.e. it contains no elements): expect(actual).to(beEmpty()) ``` ```objc // Objective-C -// Passes if expected is a member of actual: +// Passes if expected is a member of 'actual': expect(actual).to(contain(expected)); -// Passes if actual is an empty collection (it contains no elements): +// Passes if 'actual' is empty (i.e. it contains no elements): expect(actual).to(beEmpty()); ``` @@ -949,20 +1003,20 @@ an ordered collection, use `beginWith` and `endWith`: ```swift // Swift -// Passes if the elements in expected appear at the beginning of actual: +// Passes if the elements in expected appear at the beginning of 'actual': expect(actual).to(beginWith(expected...)) -// Passes if the the elements in expected come at the end of actual: +// Passes if the the elements in expected come at the end of 'actual': expect(actual).to(endWith(expected...)) ``` ```objc // Objective-C -// Passes if the elements in expected appear at the beginning of actual: +// Passes if the elements in expected appear at the beginning of 'actual': expect(actual).to(beginWith(expected)); -// Passes if the the elements in expected come at the end of actual: +// Passes if the the elements in expected come at the end of 'actual': expect(actual).to(endWith(expected)); ``` @@ -977,19 +1031,22 @@ For code that returns collections of complex objects without a strict ordering, there is the `containElementSatisfying` matcher: ```swift +// Swift + struct Turtle { - var color: String! + let color: String } -var turtles = functionThatReturnsSomeTurtlesInAnyOrder() +let turtles: [Turtle] = functionThatReturnsSomeTurtlesInAnyOrder() + +// This set of matchers passes regardless of whether the array is +// [{color: "blue"}, {color: "green"}] or [{color: "green"}, {color: "blue"}]: -// This set of matchers passes whether the array is [{color: "blue"}, {color: "green"}] -// or [{color: "green"}, {color: "blue"}] expect(turtles).to(containElementSatisfying({ turtle in - return turtle.color == "green" + return turtle.color == "green" })) expect(turtles).to(containElementSatisfying({ turtle in - return turtle.color == "blue" + return turtle.color == "blue" }, "that is a turtle with color 'blue'")) // The second matcher will incorporate the provided string in the error message @@ -997,20 +1054,25 @@ expect(turtles).to(containElementSatisfying({ turtle in ``` ```objc -@interface Turtle: NSObject -@property(nonatomic) NSString *color; +// Objective-C + +@interface Turtle : NSObject +@property (nonatomic, readonly, nonnull) NSString *color; +@end + +@implementation Turtle @end -@implementation Turtle @end -NSArray *turtles = functionThatReturnsSomeTurtlesInAnyOrder(); +NSArray * __nonnull turtles = functionThatReturnsSomeTurtlesInAnyOrder(); -// This set of matchers passes whether the array is [{color: "blue"}, {color: "green"}] -// or [{color: "green"}, {color: "blue"}] -expect(turtles).to(containElementSatisfying(^BOOL(id object) { - return [turtle.color isEqualToString:@"green"]; +// This set of matchers passes regardless of whether the array is +// [{color: "blue"}, {color: "green"}] or [{color: "green"}, {color: "blue"}]: + +expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { + return [[turtle color] isEqualToString:@"green"]; })); -expect(turtles).to(containElementSatisfying(^BOOL(id object) { - return [turtle.color isEqualToString:@"blue"]; +expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { + return [[turtle color] isEqualToString:@"blue"]; })); ``` @@ -1019,93 +1081,108 @@ expect(turtles).to(containElementSatisfying(^BOOL(id object) { ```swift // Swift -// Passes if actual contains substring expected: -expect(actual).to(contain(expected)) +// Passes if 'actual' contains 'substring': +expect(actual).to(contain(substring)) -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)) +// Passes if 'actual' begins with 'prefix': +expect(actual).to(beginWith(prefix)) -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)) +// Passes if 'actual' ends with 'suffix': +expect(actual).to(endWith(suffix)) -// Passes if actual is an empty string, "": +// Passes if 'actual' represents the empty string, "": expect(actual).to(beEmpty()) -// Passes if actual matches the regular expression defined in expected: +// Passes if 'actual' matches the regular expression defined in 'expected': expect(actual).to(match(expected)) ``` ```objc // Objective-C -// Passes if actual contains substring expected: +// Passes if 'actual' contains 'substring': expect(actual).to(contain(expected)); -// Passes if actual begins with substring: -expect(actual).to(beginWith(expected)); +// Passes if 'actual' begins with 'prefix': +expect(actual).to(beginWith(prefix)); -// Passes if actual ends with substring: -expect(actual).to(endWith(expected)); +// Passes if 'actual' ends with 'suffix': +expect(actual).to(endWith(suffix)); -// Passes if actual is an empty string, "": +// Passes if 'actual' represents the empty string, "": expect(actual).to(beEmpty()); -// Passes if actual matches the regular expression defined in expected: +// Passes if 'actual' matches the regular expression defined in 'expected': expect(actual).to(match(expected)) ``` -## Checking if all elements of a collection pass a condition +## Collection Elements + +Nimble provides a means to check that all elements of a collection pass a given expectation. + +### Swift + +In Swift, the collection must be an instance of a type conforming to +`Sequence`. ```swift // Swift -// with a custom function: -expect([1,2,3,4]).to(allPass({$0 < 5})) +// Providing a custom function: +expect([1, 2, 3, 4]).to(allPass { $0! < 5 }) -// with another matcher: -expect([1,2,3,4]).to(allPass(beLessThan(5))) +// Composing the expectation with another matcher: +expect([1, 2, 3, 4]).to(allPass(beLessThan(5))) ``` +### Objective-C + +In Objective-C, the collection must be an instance of a type which implements +the `NSFastEnumeration` protocol, and whose elements are instances of a type +which subclasses `NSObject`. + +Additionally, unlike in Swift, there is no override to specify a custom +matcher function. + ```objc // Objective-C -expect(@[@1, @2, @3,@4]).to(allPass(beLessThan(@5))); +expect(@[@1, @2, @3, @4]).to(allPass(beLessThan(@5))); ``` -For Swift the actual value has to be a Sequence, e.g. an array, a set or a custom seqence type. - -For Objective-C the actual value has to be a NSFastEnumeration, e.g. NSArray and NSSet, of NSObjects and only the variant which -uses another matcher is available here. - -## Verify collection count +## Collection Count ```swift // Swift -// passes if actual collection's count is equal to expected +// Passes if 'actual' contains the 'expected' number of elements: expect(actual).to(haveCount(expected)) -// passes if actual collection's count is not equal to expected +// Passes if 'actual' does _not_ contain the 'expected' number of elements: expect(actual).notTo(haveCount(expected)) ``` ```objc // Objective-C -// passes if actual collection's count is equal to expected +// Passes if 'actual' contains the 'expected' number of elements: expect(actual).to(haveCount(expected)) -// passes if actual collection's count is not equal to expected +// Passes if 'actual' does _not_ contain the 'expected' number of elements: expect(actual).notTo(haveCount(expected)) ``` -For Swift the actual value must be a `Collection` such as array, dictionary or set. +For Swift, the actual value must be an instance of a type conforming to `Collection`. +For example, instances of `Array`, `Dictionary`, or `Set`. -For Objective-C the actual value has to be one of the following classes `NSArray`, `NSDictionary`, `NSSet`, `NSHashTable` or one of their subclasses. +For Objective-C, the actual value must be one of the following classes, or their subclasses: -## Foundation + - `NSArray`, + - `NSDictionary`, + - `NSSet`, or + - `NSHashTable`. -### Verifying a Notification was posted +## Notifications ```swift // Swift @@ -1130,6 +1207,8 @@ expect { ## Matching a value to any of a group of matchers ```swift +// Swift + // passes if actual is either less than 10 or greater than 20 expect(actual).to(satisfyAnyOf(beLessThan(10), beGreaterThan(20))) @@ -1142,6 +1221,8 @@ expect(82).to(beLessThan(50) || beGreaterThan(80)) ``` ```objc +// Objective-C + // passes if actual is either less than 10 or greater than 20 expect(actual).to(satisfyAnyOf(beLessThan(@10), beGreaterThan(@20))) @@ -1155,33 +1236,70 @@ Note: This matcher allows you to chain any number of matchers together. This pro could instead refactor that single test into multiple, more precisely focused tests for better coverage. +## Custom Validation + +```swift +// Swift + +// passes if .succeeded is returned from the closure +expect({ + guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { + return .failed(reason: "wrong enum case") + } + + return .succeeded +}).to(succeed()) + +// passes if .failed is returned from the closure +expect({ + guard case .enumCaseWithAssociatedValueThatIDontCareAbout = actual else { + return .failed(reason: "wrong enum case") + } + + return .succeeded +}).notTo(succeed()) +``` + +The `String` provided with `.failed()` is shown when the test fails. + +When using `toEventually()` be careful not to make state changes or run process intensive code since this closure will be ran many times. + # Writing Your Own Matchers In Nimble, matchers are Swift functions that take an expected -value and return a `MatcherFunc` closure. Take `equal`, for example: +value and return a `Predicate` closure. Take `equal`, for example: ```swift // Swift -public func equal(expectedValue: T?) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(expectedValue)>" - if let actualValue = try actualExpression.evaluate() { - return actualValue == expectedValue - } else { - return false +public func equal(expectedValue: T?) -> Predicate { + // Can be shortened to: + // Predicate { actual in ... } + // + // But shown with types here for clarity. + return Predicate { (actual: Expression) throws -> PredicateResult in + let msg = ExpectationMessage.expectedActualValueTo("equal <\(expectedValue)>") + if let actualValue = try actualExpression.evaluate() { + return PredicateResult( + bool: actualValue == expectedValue!, + message: msg + ) + } else { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) + } } - } } ``` -The return value of a `MatcherFunc` closure is a `Bool` that indicates -whether the actual value matches the expectation: `true` if it does, or -`false` if it doesn't. +The return value of a `Predicate` closure is a `PredicateResult` that indicates +whether the actual value matches the expectation and what error message to +display on failure. -> The actual `equal` matcher function does not match when either - `actual` or `expected` are nil; the example above has been edited for - brevity. +> The actual `equal` matcher function does not match when + `expected` are nil; the example above has been edited for brevity. Since matchers are just Swift functions, you can define them anywhere: at the top of your test file, in a file shared by all of your tests, or @@ -1196,6 +1314,63 @@ For examples of how to write your own matchers, just check out the to see how Nimble's built-in set of matchers are implemented. You can also check out the tips below. +## PredicateResult + +`PredicateResult` is the return struct that `Predicate` return to indicate +success and failure. A `PredicateResult` is made up of two values: +`PredicateStatus` and `ExpectationMessage`. + +Instead of a boolean, `PredicateStatus` captures a trinary set of values: + +```swift +// Swift + +public enum PredicateStatus { +// The predicate "passes" with the given expression +// eg - expect(1).to(equal(1)) +case matches + +// The predicate "fails" with the given expression +// eg - expect(1).toNot(equal(1)) +case doesNotMatch + +// The predicate never "passes" with the given expression, even if negated +// eg - expect(nil as Int?).toNot(equal(1)) +case fail + +// ... +} +``` + +Meanwhile, `ExpectationMessage` provides messaging semantics for error reporting. + +```swift +// Swift + +public indirect enum ExpectationMessage { +// Emits standard error message: +// eg - "expected to , got " +case expectedActualValueTo(/* message: */ String) + +// Allows any free-form message +// eg - "" +case fail(/* message: */ String) + +// ... +} +``` + +Predicates should usually depend on either `.expectedActualValueTo(..)` or +`.fail(..)` when reporting errors. Special cases can be used for the other enum +cases. + +Finally, if your Predicate utilizes other Predicates, you can utilize +`.appended(details:)` and `.appended(message:)` methods to annotate an existing +error with more details. + +A common message to append is failing on nils. For that, `.appendedBeNilHint()` +can be used. + ## Lazy Evaluation `actualExpression` is a lazy, memoized closure around the value provided to the @@ -1206,22 +1381,24 @@ custom matchers should call `actualExpression.evaluate()`: ```swift // Swift -public func beNil() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be nil" - return actualExpression.evaluate() == nil - } +public func beNil() -> Predicate { + // Predicate.simpleNilable(..) automatically generates ExpectationMessage for + // us based on the string we provide to it. Also, the 'Nilable' postfix indicates + // that this Predicate supports matching against nil actualExpressions, instead of + // always resulting in a PredicateStatus.fail result -- which is true for + // Predicate.simple(..) + return Predicate.simpleNilable("be nil") { actualExpression in + let actualValue = try actualExpression.evaluate() + return PredicateStatus(bool: actualValue == nil) + } } ``` -In the above example, `actualExpression` is not `nil`--it is a closure +In the above example, `actualExpression` is not `nil` -- it is a closure that returns a value. The value it returns, which is accessed via the `evaluate()` method, may be `nil`. If that value is `nil`, the `beNil` matcher function returns `true`, indicating that the expectation passed. -Use `expression.isClosure` to determine if the expression will be invoking -a closure to produce its value. - ## Type Checking via Swift Generics Using Swift's generics, matchers can constrain the type of the actual value @@ -1234,43 +1411,108 @@ against the one provided to the matcher function, and passes if they are the sam ```swift // Swift -public func haveDescription(description: String) -> MatcherFunc { - return MatcherFunc { actual, failureMessage in - return actual.evaluate().description == description - } +public func haveDescription(description: String) -> Predicate { + return Predicate.simple("have description") { actual in + return PredicateStatus(bool: actual.evaluate().description == description) + } } ``` ## Customizing Failure Messages -By default, Nimble outputs the following failure message when an -expectation fails: +When using `Predicate.simple(..)` or `Predicate.simpleNilable(..)`, Nimble +outputs the following failure message when an expectation fails: -``` -expected to match, got <\(actual)> +```swift +// where `message` is the first string argument and +// `actual` is the actual value received in `expect(..)` +"expected to \(message), got <\(actual)>" ``` -You can customize this message by modifying the `failureMessage` struct -from within your `MatcherFunc` closure. To change the verb "match" to -something else, update the `postfixMessage` property: +You can customize this message by modifying the way you create a `Predicate`. + +### Basic Customization + +For slightly more complex error messaging, receive the created failure message +with `Predicate.define(..)`: ```swift // Swift -// Outputs: expected to be under the sea, got <\(actual)> -failureMessage.postfixMessage = "be under the sea" +public func equal(_ expectedValue: T?) -> Predicate { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in + let actualValue = try actualExpression.evaluate() + let matches = actualValue == expectedValue && expectedValue != nil + if expectedValue == nil || actualValue == nil { + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) + } + return PredicateResult(status: .fail, message: msg) + } + return PredicateResult(bool: matches, message: msg) + } +} ``` -You can change how the `actual` value is displayed by updating -`failureMessage.actualValue`. Or, to remove it altogether, set it to -`nil`: +In the example above, `msg` is defined based on the string given to +`Predicate.define`. The code looks akin to: ```swift // Swift -// Outputs: expected to be under the sea -failureMessage.actualValue = nil -failureMessage.postfixMessage = "be under the sea" +let msg = ExpectationMessage.expectedActualValueTo("equal <\(stringify(expectedValue))>") +``` + +### Full Customization + +To fully customize the behavior of the Predicate, use the overload that expects +a `PredicateResult` to be returned. + +Along with `PredicateResult`, there are other `ExpectationMessage` enum values you can use: + +```swift +public indirect enum ExpectationMessage { +// Emits standard error message: +// eg - "expected to , got " +case expectedActualValueTo(/* message: */ String) + +// Allows any free-form message +// eg - "" +case fail(/* message: */ String) + +// Emits standard error message with a custom actual value instead of the default. +// eg - "expected to , got " +case expectedCustomValueTo(/* message: */ String, /* actual: */ String) + +// Emits standard error message without mentioning the actual value +// eg - "expected to " +case expectedTo(/* message: */ String) + +// ... +} +``` + +For matchers that compose other matchers, there are a handful of helper +functions to annotate messages. + +`appended(message: String)` is used to append to the original failure message: + +```swift +// produces "expected to be true, got (use beFalse() for inverse)" +// appended message do show up inline in Xcode. +.expectedActualValueTo("be true").appended(message: " (use beFalse() for inverse)") +``` + +For a more comprehensive message that spans multiple lines, use +`appended(details: String)` instead: + +```swift +// produces "expected to be true, got \n\nuse beFalse() for inverse\nor use beNil()" +// details do not show inline in Xcode, but do show up in test logs. +.expectedActualValueTo("be true").appended(details: "use beFalse() for inverse\nor use beNil()") ``` ## Supporting Objective-C @@ -1284,13 +1526,13 @@ custom matcher. The example below defines the class method // Swift extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) + public class func beNilMatcher() -> NMBObjCMatcher { + return NMBObjCMatcher { actualBlock, failureMessage, location in + let block = ({ actualBlock() as NSObject? }) + let expr = Expression(expression: block, location: location) + return beNil().matches(expr, failureMessage: failureMessage) + } } - } } ``` @@ -1309,7 +1551,7 @@ class method: // Objective-C FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; + return [NMBObjCMatcher beNilMatcher]; } ``` @@ -1359,6 +1601,85 @@ extension NMBObjCMatcher { } ``` +## Migrating from the Old Matcher API + +Previously (`<7.0.0`), Nimble supported matchers via the following types: + +- `Matcher` +- `NonNilMatcherFunc` +- `MatcherFunc` + +All of those types have been replaced by `Predicate`. While migrating can be a +lot of work, Nimble currently provides several steps to aid migration of your +custom matchers: + +### Minimal Step - Use `.predicate` + +Nimble provides an extension to the old types that automatically naively +converts those types to the newer `Predicate`. + +```swift +// Swift +public func beginWith(startingElement: T) -> Predicate { + return NonNilMatcherFunc { actualExpression, failureMessage in + failureMessage.postfixMessage = "begin with <\(startingElement)>" + if let actualValue = actualExpression.evaluate() { + var actualGenerator = actualValue.makeIterator() + return actualGenerator.next() == startingElement + } + return false + }.predicate +} +``` + +This is the simpliest way to externally support `Predicate` which allows easier +composition than the old Nimble matcher interface, with minimal effort to change. + +### Convert to use `Predicate` Type with Old Matcher Constructor + +The second most convenient step is to utilize special constructors that +`Predicate` supports that closely align to the constructors of the old Nimble +matcher types. + +```swift +// Swift +public func beginWith(startingElement: T) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + failureMessage.postfixMessage = "begin with <\(startingElement)>" + if let actualValue = actualExpression.evaluate() { + var actualGenerator = actualValue.makeIterator() + return actualGenerator.next() == startingElement + } + return false + } +} +``` + +This allows you to completely drop the old types from your code, although the +intended behavior may alter slightly to what is desired. + +### Convert to `Predicate` Type with Preferred Constructor + +Finally, you can convert to the native `Predicate` format using one of the +constructors not used to assist in the migration. + +### Deprecation Roadmap + +Nimble 7 introduces `Predicate` but will support the old types with warning +deprecations. A couple major releases of Nimble will remain backwards +compatible with the old matcher api, although new features may not be +backported. + +The deprecating plan is a 3 major versions removal. Which is as follows: + + 1. Introduce new `Predicate` API, deprecation warning for old matcher APIs. + (Nimble `v7.x.x`) + 2. Introduce warnings on migration-path features (`.predicate`, + `Predicate`-constructors with similar arguments to old API). (Nimble + `v8.x.x`) + 3. Remove old API. (Nimble `v9.x.x`) + + # Installing Nimble > Nimble can be used on its own, or in conjunction with its sister @@ -1399,7 +1720,7 @@ source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APP_NAME_HERE_Tests', :exclusive => true do use_frameworks! - pod 'Nimble', '~> 5.0.0' + pod 'Nimble', '~> 6.0.0' end ``` diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h deleted file mode 100644 index 6ec6a29..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// CwlCatchException.h -// CwlCatchException -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -#import - -//! Project version number for CwlCatchException. -FOUNDATION_EXPORT double CwlCatchExceptionVersionNumber; - -//! Project version string for CwlCatchException. -FOUNDATION_EXPORT const unsigned char CwlCatchExceptionVersionString[]; - -__attribute__((visibility("hidden"))) -NSException* __nullable catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)()); diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m deleted file mode 100644 index 4f9772c..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// CwlCatchException.m -// CwlAssertionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -#import "CwlCatchException.h" - -__attribute__((visibility("hidden"))) -NSException* catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)()) { - @try { - inBlock(); - } @catch (NSException *exception) { - if ([exception isKindOfClass:type]) { - return exception; - } else { - @throw; - } - } - return nil; -} diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift deleted file mode 100644 index b44a232..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// CwlCatchException.swift -// CwlAssertionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -import Foundation - -// We can't simply cast to Self? in the catchInBlock method so we need this generic function wrapper to do the conversion for us. Mildly annoying. -private func catchReturnTypeConverter(_ type: T.Type, block: () -> Void) -> T? { - return catchExceptionOfKind(type, block) as? T -} - -extension NSException { - public static func catchException(in block: () -> Void) -> Self? { - return catchReturnTypeConverter(self, block: block) - } -} diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift deleted file mode 100644 index 5bf2794..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// CwlBadInstructionException.swift -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -import Foundation - -private func raiseBadInstructionException() { - BadInstructionException().raise() -} - -/// A simple NSException subclass. It's not required to subclass NSException (since the exception type is represented in the name) but this helps for identifying the exception through runtime type. -@objc public class BadInstructionException: NSException { - static var name: String = "com.cocoawithlove.BadInstruction" - - init() { - super.init(name: NSExceptionName(rawValue: BadInstructionException.name), reason: nil, userInfo: nil) - } - - required public init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - } - - /// An Objective-C callable function, invoked from the `mach_exc_server` callback function `catch_mach_exception_raise_state` to push the `raiseBadInstructionException` function onto the stack. - public class func catch_mach_exception_raise_state(_ exception_port: mach_port_t, exception: exception_type_t, code: UnsafePointer, codeCnt: mach_msg_type_number_t, flavor: UnsafeMutablePointer, old_state: UnsafePointer, old_stateCnt: mach_msg_type_number_t, new_state: thread_state_t, new_stateCnt: UnsafeMutablePointer) -> kern_return_t { - - #if arch(x86_64) - // Make sure we've been given enough memory - if old_stateCnt != x86_THREAD_STATE64_COUNT || new_stateCnt.pointee < x86_THREAD_STATE64_COUNT { - return KERN_INVALID_ARGUMENT - } - - // Read the old thread state - var state = old_state.withMemoryRebound(to: x86_thread_state64_t.self, capacity: 1) { return $0.pointee } - - // 1. Decrement the stack pointer - state.__rsp -= __uint64_t(MemoryLayout.size) - - // 2. Save the old Instruction Pointer to the stack. - if let pointer = UnsafeMutablePointer<__uint64_t>(bitPattern: UInt(state.__rsp)) { - pointer.pointee = state.__rip - } else { - return KERN_INVALID_ARGUMENT - } - - // 3. Set the Instruction Pointer to the new function's address - var f: @convention(c) () -> Void = raiseBadInstructionException - withUnsafePointer(to: &f) { - state.__rip = $0.withMemoryRebound(to: __uint64_t.self, capacity: 1) { return $0.pointee } - } - - // Write the new thread state - new_state.withMemoryRebound(to: x86_thread_state64_t.self, capacity: 1) { $0.pointee = state } - new_stateCnt.pointee = x86_THREAD_STATE64_COUNT - - return KERN_SUCCESS - #else - fatalError("Unavailable for this CPU architecture") - #endif - } -} diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h deleted file mode 100644 index 0333ed2..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h +++ /dev/null @@ -1,61 +0,0 @@ -// -// CwlCatchBadInstruction.h -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -#if defined(__x86_64__) - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -// The request_mach_exception_raise_t struct is passed to mach_msg which assumes its exact layout. To avoid problems with different layouts, we keep the definition in C rather than Swift. -typedef struct -{ - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t thread; - mach_msg_port_descriptor_t task; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_type_t exception; - mach_msg_type_number_t codeCnt; - int64_t code[2]; - int flavor; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[224]; -} request_mach_exception_raise_t; - -// The reply_mach_exception_raise_state_t struct is passed to mach_msg which assumes its exact layout. To avoid problems with different layouts, we keep the definition in C rather than Swift. -typedef struct -{ - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - int flavor; - mach_msg_type_number_t new_stateCnt; - natural_t new_state[224]; -} reply_mach_exception_raise_state_t; - -extern boolean_t mach_exc_server(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); - -NS_ASSUME_NONNULL_END - -#endif diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m deleted file mode 100644 index 22c1377..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// CwlCatchBadInstruction.m -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -#if defined(__x86_64__) - -#import "CwlCatchBadInstruction.h" - -// Assuming the "PRODUCT_NAME" macro is defined, this will create the name of the Swift generated header file -#define STRINGIZE_NO_EXPANSION(A) #A -#define STRINGIZE_WITH_EXPANSION(A) STRINGIZE_NO_EXPANSION(A) -#define SWIFT_INCLUDE STRINGIZE_WITH_EXPANSION(PRODUCT_NAME-Swift.h) - -// Include the Swift generated header file -#import SWIFT_INCLUDE - -/// A basic function that receives callbacks from mach_exc_server and relays them to the Swift implemented BadInstructionException.catch_mach_exception_raise_state. -kern_return_t catch_mach_exception_raise_state(mach_port_t exception_port, exception_type_t exception, const mach_exception_data_t code, mach_msg_type_number_t codeCnt, int *flavor, const thread_state_t old_state, mach_msg_type_number_t old_stateCnt, thread_state_t new_state, mach_msg_type_number_t *new_stateCnt) { - return [BadInstructionException catch_mach_exception_raise_state:exception_port exception:exception code:code codeCnt:codeCnt flavor:flavor old_state:old_state old_stateCnt:old_stateCnt new_state:new_state new_stateCnt:new_stateCnt]; -} - -// The mach port should be configured so that this function is never used. -kern_return_t catch_mach_exception_raise(mach_port_t exception_port, mach_port_t thread, mach_port_t task, exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt) { - assert(false); - return KERN_FAILURE; -} - -// The mach port should be configured so that this function is never used. -kern_return_t catch_mach_exception_raise_state_identity(mach_port_t exception_port, mach_port_t thread, mach_port_t task, exception_type_t exception, mach_exception_data_t code, mach_msg_type_number_t codeCnt, int *flavor, thread_state_t old_state, mach_msg_type_number_t old_stateCnt, thread_state_t new_state, mach_msg_type_number_t *new_stateCnt) { - assert(false); - return KERN_FAILURE; -} - -#endif diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift deleted file mode 100644 index 4d82f7a..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift +++ /dev/null @@ -1,193 +0,0 @@ -// -// CwlCatchBadInstruction.swift -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -import Foundation - -#if arch(x86_64) - - private enum PthreadError: Error { case code(Int32) } - private enum MachExcServer: Error { case code(kern_return_t) } - - /// A quick function for converting Mach error results into Swift errors - private func kernCheck(_ f: () -> Int32) throws { - let r = f() - guard r == KERN_SUCCESS else { - throw NSError(domain: NSMachErrorDomain, code: Int(r), userInfo: nil) - } - } - - extension execTypesCountTuple { - mutating func pointer(in block: (UnsafeMutablePointer) -> R) -> R { - return withUnsafeMutablePointer(to: &self) { p -> R in - return p.withMemoryRebound(to: T.self, capacity: EXC_TYPES_COUNT) { ptr -> R in - return block(ptr) - } - } - } - } - - extension request_mach_exception_raise_t { - mutating func withMsgHeaderPointer(in block: (UnsafeMutablePointer) -> R) -> R { - return withUnsafeMutablePointer(to: &self) { p -> R in - return p.withMemoryRebound(to: mach_msg_header_t.self, capacity: 1) { ptr -> R in - return block(ptr) - } - } - } - } - - extension reply_mach_exception_raise_state_t { - mutating func withMsgHeaderPointer(in block: (UnsafeMutablePointer) -> R) -> R { - return withUnsafeMutablePointer(to: &self) { p -> R in - return p.withMemoryRebound(to: mach_msg_header_t.self, capacity: 1) { ptr -> R in - return block(ptr) - } - } - } - } - - /// A structure used to store context associated with the Mach message port - private struct MachContext { - var masks = execTypesCountTuple() - var count: mach_msg_type_number_t = 0 - var ports = execTypesCountTuple() - var behaviors = execTypesCountTuple() - var flavors = execTypesCountTuple() - var currentExceptionPort: mach_port_t = 0 - var handlerThread: pthread_t? = nil - - mutating func withUnsafeMutablePointers(in block: (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> R) -> R { - return masks.pointer { masksPtr in - return ports.pointer { portsPtr in - return behaviors.pointer { behaviorsPtr in - return flavors.pointer { flavorsPtr in - return block(masksPtr, portsPtr, behaviorsPtr, flavorsPtr) - } - } - } - } - } - } - - /// A function for receiving mach messages and parsing the first with mach_exc_server (and if any others are received, throwing them away). - private func machMessageHandler(_ arg: UnsafeMutableRawPointer) -> UnsafeMutableRawPointer? { - let context = arg.assumingMemoryBound(to: MachContext.self).pointee - var request = request_mach_exception_raise_t() - var reply = reply_mach_exception_raise_state_t() - - var handledfirstException = false - repeat { do { - // Request the next mach message from the port - request.Head.msgh_local_port = context.currentExceptionPort - request.Head.msgh_size = UInt32(MemoryLayout.size) - try kernCheck { request.withMsgHeaderPointer { requestPtr in - mach_msg(requestPtr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0, request.Head.msgh_size, context.currentExceptionPort, 0, UInt32(MACH_PORT_NULL)) - } } - - // Prepare the reply structure - reply.Head.msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(request.Head.msgh_bits), 0) - reply.Head.msgh_local_port = UInt32(MACH_PORT_NULL) - reply.Head.msgh_remote_port = request.Head.msgh_remote_port - reply.Head.msgh_size = UInt32(MemoryLayout.size) - reply.NDR = NDR_record - - if !handledfirstException { - // Use the MiG generated server to invoke our handler for the request and fill in the rest of the reply structure - guard request.withMsgHeaderPointer(in: { requestPtr in reply.withMsgHeaderPointer { replyPtr in - mach_exc_server(requestPtr, replyPtr) - } }) != 0 else { throw MachExcServer.code(reply.RetCode) } - - handledfirstException = true - } else { - // If multiple fatal errors occur, don't handle subsquent errors (let the program crash) - reply.RetCode = KERN_FAILURE - } - - // Send the reply - try kernCheck { reply.withMsgHeaderPointer { replyPtr in - mach_msg(replyPtr, MACH_SEND_MSG, reply.Head.msgh_size, 0, UInt32(MACH_PORT_NULL), 0, UInt32(MACH_PORT_NULL)) - } } - } catch let error as NSError where (error.domain == NSMachErrorDomain && (error.code == Int(MACH_RCV_PORT_CHANGED) || error.code == Int(MACH_RCV_INVALID_NAME))) { - // Port was already closed before we started or closed while we were listening. - // This means the controlling thread shut down. - return nil - } catch { - // Should never be reached but this is testing code, don't try to recover, just abort - fatalError("Mach message error: \(error)") - } } while true - } - - /// Run the provided block. If a mach "BAD_INSTRUCTION" exception is raised, catch it and return a BadInstructionException (which captures stack information about the throw site, if desired). Otherwise return nil. - /// NOTE: This function is only intended for use in test harnesses – use in a distributed build is almost certainly a bad choice. If a "BAD_INSTRUCTION" exception is raised, the block will be exited before completion via Objective-C exception. The risks associated with an Objective-C exception apply here: most Swift/Objective-C functions are *not* exception-safe. Memory may be leaked and the program will not necessarily be left in a safe state. - /// - parameter block: a function without parameters that will be run - /// - returns: if an EXC_BAD_INSTRUCTION is raised during the execution of `block` then a BadInstructionException will be returned, otherwise `nil`. - public func catchBadInstruction(in block: () -> Void) -> BadInstructionException? { - var context = MachContext() - var result: BadInstructionException? = nil - do { - var handlerThread: pthread_t? = nil - defer { - // 8. Wait for the thread to terminate *if* we actually made it to the creation point - // The mach port should be destroyed *before* calling pthread_join to avoid a deadlock. - if handlerThread != nil { - pthread_join(handlerThread!, nil) - } - } - - try kernCheck { - // 1. Create the mach port - mach_port_allocate(mach_task_self_, MACH_PORT_RIGHT_RECEIVE, &context.currentExceptionPort) - } - defer { - // 7. Cleanup the mach port - mach_port_destroy(mach_task_self_, context.currentExceptionPort) - } - - try kernCheck { - // 2. Configure the mach port - mach_port_insert_right(mach_task_self_, context.currentExceptionPort, context.currentExceptionPort, MACH_MSG_TYPE_MAKE_SEND) - } - - try kernCheck { context.withUnsafeMutablePointers { masksPtr, portsPtr, behaviorsPtr, flavorsPtr in - // 3. Apply the mach port as the handler for this thread - thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, context.currentExceptionPort, Int32(bitPattern: UInt32(EXCEPTION_STATE) | MACH_EXCEPTION_CODES), x86_THREAD_STATE64, masksPtr, &context.count, portsPtr, behaviorsPtr, flavorsPtr) - } } - - defer { context.withUnsafeMutablePointers { masksPtr, portsPtr, behaviorsPtr, flavorsPtr in - // 6. Unapply the mach port - _ = thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, 0, EXCEPTION_DEFAULT, THREAD_STATE_NONE, masksPtr, &context.count, portsPtr, behaviorsPtr, flavorsPtr) - } } - - try withUnsafeMutablePointer(to: &context) { c throws in - // 4. Create the thread - let e = pthread_create(&handlerThread, nil, machMessageHandler, c) - guard e == 0 else { throw PthreadError.code(e) } - - // 5. Run the block - result = BadInstructionException.catchException(in: block) - } - } catch { - // Should never be reached but this is testing code, don't try to recover, just abort - fatalError("Mach port error: \(error)") - } - return result - } - -#endif diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift deleted file mode 100644 index 35e1ad5..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift +++ /dev/null @@ -1,63 +0,0 @@ -// -// CwlDarwinDefinitions.swift -// CwlPreconditionTesting -// -// Created by Matt Gallagher on 2016/01/10. -// Copyright © 2016 Matt Gallagher ( http://cocoawithlove.com ). All rights reserved. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -// - -import Darwin - -#if arch(x86_64) - -// From /usr/include/mach/port.h -// #define MACH_PORT_RIGHT_RECEIVE ((mach_port_right_t) 1) -let MACH_PORT_RIGHT_RECEIVE: mach_port_right_t = 1 - -// From /usr/include/mach/message.h -// #define MACH_MSG_TYPE_MAKE_SEND 20 /* Must hold receive right */ -// #define MACH_MSGH_BITS_REMOTE(bits) \ -// ((bits) & MACH_MSGH_BITS_REMOTE_MASK) -// #define MACH_MSGH_BITS(remote, local) /* legacy */ \ -// ((remote) | ((local) << 8)) -let MACH_MSG_TYPE_MAKE_SEND: UInt32 = 20 -func MACH_MSGH_BITS_REMOTE(_ bits: UInt32) -> UInt32 { return bits & UInt32(MACH_MSGH_BITS_REMOTE_MASK) } -func MACH_MSGH_BITS(_ remote: UInt32, _ local: UInt32) -> UInt32 { return ((remote) | ((local) << 8)) } - -// From /usr/include/mach/exception_types.h -// #define EXC_BAD_INSTRUCTION 2 /* Instruction failed */ -// #define EXC_MASK_BAD_INSTRUCTION (1 << EXC_BAD_INSTRUCTION) -// #define EXCEPTION_DEFAULT 1 -let EXC_BAD_INSTRUCTION: UInt32 = 2 -let EXC_MASK_BAD_INSTRUCTION: UInt32 = 1 << EXC_BAD_INSTRUCTION -let EXCEPTION_DEFAULT: Int32 = 1 - -// From /usr/include/mach/i386/thread_status.h -// #define THREAD_STATE_NONE 13 -// #define x86_THREAD_STATE64_COUNT ((mach_msg_type_number_t) \ -// ( sizeof (x86_thread_state64_t) / sizeof (int) )) -let THREAD_STATE_NONE: Int32 = 13 -let x86_THREAD_STATE64_COUNT = UInt32(MemoryLayout.size / MemoryLayout.size) - -let EXC_TYPES_COUNT = 14 -struct execTypesCountTuple { - // From /usr/include/mach/i386/exception.h - // #define EXC_TYPES_COUNT 14 /* incl. illegal exception 0 */ - var value: (T, T, T, T, T, T, T, T, T, T, T, T, T, T) = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) - init() { - } -} - -#endif diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c deleted file mode 100644 index 2334538..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c +++ /dev/null @@ -1,537 +0,0 @@ -/* - * IDENTIFICATION: - * stub generated Mon Jan 11 00:24:26 2016 - * with a MiG generated by bootstrap_cmds-93 - * OPTIONS: - */ - -/* Module mach_exc */ - -#if defined(__x86_64__) - -#define __MIG_check__Request__mach_exc_subsystem__ 1 - -#include "mach_excServer.h" - -#ifndef mig_internal -#define mig_internal static __inline__ -#endif /* mig_internal */ - -#ifndef mig_external -#define mig_external -#endif /* mig_external */ - -#if !defined(__MigTypeCheck) && defined(TypeCheck) -#define __MigTypeCheck TypeCheck /* Legacy setting */ -#endif /* !defined(__MigTypeCheck) */ - -#if !defined(__MigKernelSpecificCode) && defined(_MIG_KERNEL_SPECIFIC_CODE_) -#define __MigKernelSpecificCode _MIG_KERNEL_SPECIFIC_CODE_ /* Legacy setting */ -#endif /* !defined(__MigKernelSpecificCode) */ - -#ifndef LimitCheck -#define LimitCheck 0 -#endif /* LimitCheck */ - -#ifndef min -#define min(a,b) ( ((a) < (b))? (a): (b) ) -#endif /* min */ - -#if !defined(_WALIGN_) -#define _WALIGN_(x) (((x) + 3) & ~3) -#endif /* !defined(_WALIGN_) */ - -#if !defined(_WALIGNSZ_) -#define _WALIGNSZ_(x) _WALIGN_(sizeof(x)) -#endif /* !defined(_WALIGNSZ_) */ - -#ifndef UseStaticTemplates -#define UseStaticTemplates 0 -#endif /* UseStaticTemplates */ - -#ifndef __DeclareRcvRpc -#define __DeclareRcvRpc(_NUM_, _NAME_) -#endif /* __DeclareRcvRpc */ - -#ifndef __BeforeRcvRpc -#define __BeforeRcvRpc(_NUM_, _NAME_) -#endif /* __BeforeRcvRpc */ - -#ifndef __AfterRcvRpc -#define __AfterRcvRpc(_NUM_, _NAME_) -#endif /* __AfterRcvRpc */ - -#ifndef __DeclareRcvSimple -#define __DeclareRcvSimple(_NUM_, _NAME_) -#endif /* __DeclareRcvSimple */ - -#ifndef __BeforeRcvSimple -#define __BeforeRcvSimple(_NUM_, _NAME_) -#endif /* __BeforeRcvSimple */ - -#ifndef __AfterRcvSimple -#define __AfterRcvSimple(_NUM_, _NAME_) -#endif /* __AfterRcvSimple */ - -#define novalue void - -#define msgh_request_port msgh_local_port -#define MACH_MSGH_BITS_REQUEST(bits) MACH_MSGH_BITS_LOCAL(bits) -#define msgh_reply_port msgh_remote_port -#define MACH_MSGH_BITS_REPLY(bits) MACH_MSGH_BITS_REMOTE(bits) - -#define MIG_RETURN_ERROR(X, code) {\ - ((mig_reply_error_t *)X)->RetCode = code;\ - ((mig_reply_error_t *)X)->NDR = NDR_record;\ - return;\ - } - -/* Forward Declarations */ - - -mig_internal novalue _Xmach_exception_raise - (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); - -mig_internal novalue _Xmach_exception_raise_state - (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); - -mig_internal novalue _Xmach_exception_raise_state_identity - (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP); - - -#if ( __MigTypeCheck ) -#if __MIG_check__Request__mach_exc_subsystem__ -#if !defined(__MIG_check__Request__mach_exception_raise_t__defined) -#define __MIG_check__Request__mach_exception_raise_t__defined - -mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_t(__attribute__((__unused__)) __Request__mach_exception_raise_t *In0P) -{ - - typedef __Request__mach_exception_raise_t __Request; -#if __MigTypeCheck - unsigned int msgh_size; -#endif /* __MigTypeCheck */ - -#if __MigTypeCheck - msgh_size = In0P->Head.msgh_size; - if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || - (In0P->msgh_body.msgh_descriptor_count != 2) || - (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 16)) || (msgh_size > (mach_msg_size_t)sizeof(__Request))) - return MIG_BAD_ARGUMENTS; -#endif /* __MigTypeCheck */ - -#if __MigTypeCheck - if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR || - In0P->thread.disposition != 17) - return MIG_TYPE_ERROR; -#endif /* __MigTypeCheck */ - -#if __MigTypeCheck - if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR || - In0P->task.disposition != 17) - return MIG_TYPE_ERROR; -#endif /* __MigTypeCheck */ - -#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined) - if (In0P->NDR.int_rep != NDR_record.int_rep) - __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); -#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined */ -#if __MigTypeCheck - if ( In0P->codeCnt > 2 ) - return MIG_BAD_ARGUMENTS; - if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 16)) / 8 < In0P->codeCnt) || - (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 16) + (8 * In0P->codeCnt))) - return MIG_BAD_ARGUMENTS; -#endif /* __MigTypeCheck */ - - return MACH_MSG_SUCCESS; -} -#endif /* !defined(__MIG_check__Request__mach_exception_raise_t__defined) */ -#endif /* __MIG_check__Request__mach_exc_subsystem__ */ -#endif /* ( __MigTypeCheck ) */ - - -/* Routine mach_exception_raise */ -mig_internal novalue _Xmach_exception_raise - (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) -{ - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t thread; - mach_msg_port_descriptor_t task; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_type_t exception; - mach_msg_type_number_t codeCnt; - int64_t code[2]; - mach_msg_trailer_t trailer; - } Request __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif - typedef __Request__mach_exception_raise_t __Request; - typedef __Reply__mach_exception_raise_t Reply __attribute__((unused)); - - /* - * typedef struct { - * mach_msg_header_t Head; - * NDR_record_t NDR; - * kern_return_t RetCode; - * } mig_reply_error_t; - */ - - Request *In0P = (Request *) InHeadP; - Reply *OutP = (Reply *) OutHeadP; -#ifdef __MIG_check__Request__mach_exception_raise_t__defined - kern_return_t check_result; -#endif /* __MIG_check__Request__mach_exception_raise_t__defined */ - - __DeclareRcvRpc(2405, "mach_exception_raise") - __BeforeRcvRpc(2405, "mach_exception_raise") - -#if defined(__MIG_check__Request__mach_exception_raise_t__defined) - check_result = __MIG_check__Request__mach_exception_raise_t((__Request *)In0P); - if (check_result != MACH_MSG_SUCCESS) - { MIG_RETURN_ERROR(OutP, check_result); } -#endif /* defined(__MIG_check__Request__mach_exception_raise_t__defined) */ - - OutP->RetCode = catch_mach_exception_raise(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt); - - OutP->NDR = NDR_record; - - - __AfterRcvRpc(2405, "mach_exception_raise") -} - -#if ( __MigTypeCheck ) -#if __MIG_check__Request__mach_exc_subsystem__ -#if !defined(__MIG_check__Request__mach_exception_raise_state_t__defined) -#define __MIG_check__Request__mach_exception_raise_state_t__defined - -mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_t(__attribute__((__unused__)) __Request__mach_exception_raise_state_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_t **In1PP) -{ - - typedef __Request__mach_exception_raise_state_t __Request; - __Request *In1P; -#if __MigTypeCheck - unsigned int msgh_size; -#endif /* __MigTypeCheck */ - unsigned int msgh_size_delta; - -#if __MigTypeCheck - msgh_size = In0P->Head.msgh_size; - if ((In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || - (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912)) || (msgh_size > (mach_msg_size_t)sizeof(__Request))) - return MIG_BAD_ARGUMENTS; -#endif /* __MigTypeCheck */ - -#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined) - if (In0P->NDR.int_rep != NDR_record.int_rep) - __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); -#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined */ - msgh_size_delta = (8 * In0P->codeCnt); -#if __MigTypeCheck - if ( In0P->codeCnt > 2 ) - return MIG_BAD_ARGUMENTS; - if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 8 < In0P->codeCnt) || - (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912) + (8 * In0P->codeCnt))) - return MIG_BAD_ARGUMENTS; - msgh_size -= msgh_size_delta; -#endif /* __MigTypeCheck */ - - *In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16); - -#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined) - if (In0P->NDR.int_rep != NDR_record.int_rep) - __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep); -#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined */ -#if __MigTypeCheck - if ( In1P->old_stateCnt > 224 ) - return MIG_BAD_ARGUMENTS; - if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 4 < In1P->old_stateCnt) || - (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 912) + (4 * In1P->old_stateCnt))) - return MIG_BAD_ARGUMENTS; -#endif /* __MigTypeCheck */ - - return MACH_MSG_SUCCESS; -} -#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */ -#endif /* __MIG_check__Request__mach_exc_subsystem__ */ -#endif /* ( __MigTypeCheck ) */ - - -/* Routine mach_exception_raise_state */ -mig_internal novalue _Xmach_exception_raise_state - (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) -{ - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - exception_type_t exception; - mach_msg_type_number_t codeCnt; - int64_t code[2]; - int flavor; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[224]; - mach_msg_trailer_t trailer; - } Request __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif - typedef __Request__mach_exception_raise_state_t __Request; - typedef __Reply__mach_exception_raise_state_t Reply __attribute__((unused)); - - /* - * typedef struct { - * mach_msg_header_t Head; - * NDR_record_t NDR; - * kern_return_t RetCode; - * } mig_reply_error_t; - */ - - Request *In0P = (Request *) InHeadP; - Request *In1P; - Reply *OutP = (Reply *) OutHeadP; -#ifdef __MIG_check__Request__mach_exception_raise_state_t__defined - kern_return_t check_result; -#endif /* __MIG_check__Request__mach_exception_raise_state_t__defined */ - - __DeclareRcvRpc(2406, "mach_exception_raise_state") - __BeforeRcvRpc(2406, "mach_exception_raise_state") - -#if defined(__MIG_check__Request__mach_exception_raise_state_t__defined) - check_result = __MIG_check__Request__mach_exception_raise_state_t((__Request *)In0P, (__Request **)&In1P); - if (check_result != MACH_MSG_SUCCESS) - { MIG_RETURN_ERROR(OutP, check_result); } -#endif /* defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */ - - OutP->new_stateCnt = 224; - - OutP->RetCode = catch_mach_exception_raise_state(In0P->Head.msgh_request_port, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt); - if (OutP->RetCode != KERN_SUCCESS) { - MIG_RETURN_ERROR(OutP, OutP->RetCode); - } - - OutP->NDR = NDR_record; - - - OutP->flavor = In1P->flavor; - OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt))); - - __AfterRcvRpc(2406, "mach_exception_raise_state") -} - -#if ( __MigTypeCheck ) -#if __MIG_check__Request__mach_exc_subsystem__ -#if !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) -#define __MIG_check__Request__mach_exception_raise_state_identity_t__defined - -mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_identity_t(__attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t **In1PP) -{ - - typedef __Request__mach_exception_raise_state_identity_t __Request; - __Request *In1P; -#if __MigTypeCheck - unsigned int msgh_size; -#endif /* __MigTypeCheck */ - unsigned int msgh_size_delta; - -#if __MigTypeCheck - msgh_size = In0P->Head.msgh_size; - if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || - (In0P->msgh_body.msgh_descriptor_count != 2) || - (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912)) || (msgh_size > (mach_msg_size_t)sizeof(__Request))) - return MIG_BAD_ARGUMENTS; -#endif /* __MigTypeCheck */ - -#if __MigTypeCheck - if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR || - In0P->thread.disposition != 17) - return MIG_TYPE_ERROR; -#endif /* __MigTypeCheck */ - -#if __MigTypeCheck - if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR || - In0P->task.disposition != 17) - return MIG_TYPE_ERROR; -#endif /* __MigTypeCheck */ - -#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined) - if (In0P->NDR.int_rep != NDR_record.int_rep) - __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep); -#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined */ - msgh_size_delta = (8 * In0P->codeCnt); -#if __MigTypeCheck - if ( In0P->codeCnt > 2 ) - return MIG_BAD_ARGUMENTS; - if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 8 < In0P->codeCnt) || - (msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912) + (8 * In0P->codeCnt))) - return MIG_BAD_ARGUMENTS; - msgh_size -= msgh_size_delta; -#endif /* __MigTypeCheck */ - - *In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16); - -#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined) - if (In0P->NDR.int_rep != NDR_record.int_rep) - __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep); -#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined */ -#if __MigTypeCheck - if ( In1P->old_stateCnt > 224 ) - return MIG_BAD_ARGUMENTS; - if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 4 < In1P->old_stateCnt) || - (msgh_size != (mach_msg_size_t)(sizeof(__Request) - 912) + (4 * In1P->old_stateCnt))) - return MIG_BAD_ARGUMENTS; -#endif /* __MigTypeCheck */ - - return MACH_MSG_SUCCESS; -} -#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */ -#endif /* __MIG_check__Request__mach_exc_subsystem__ */ -#endif /* ( __MigTypeCheck ) */ - - -/* Routine mach_exception_raise_state_identity */ -mig_internal novalue _Xmach_exception_raise_state_identity - (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) -{ - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t thread; - mach_msg_port_descriptor_t task; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_type_t exception; - mach_msg_type_number_t codeCnt; - int64_t code[2]; - int flavor; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[224]; - mach_msg_trailer_t trailer; - } Request __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif - typedef __Request__mach_exception_raise_state_identity_t __Request; - typedef __Reply__mach_exception_raise_state_identity_t Reply __attribute__((unused)); - - /* - * typedef struct { - * mach_msg_header_t Head; - * NDR_record_t NDR; - * kern_return_t RetCode; - * } mig_reply_error_t; - */ - - Request *In0P = (Request *) InHeadP; - Request *In1P; - Reply *OutP = (Reply *) OutHeadP; -#ifdef __MIG_check__Request__mach_exception_raise_state_identity_t__defined - kern_return_t check_result; -#endif /* __MIG_check__Request__mach_exception_raise_state_identity_t__defined */ - - __DeclareRcvRpc(2407, "mach_exception_raise_state_identity") - __BeforeRcvRpc(2407, "mach_exception_raise_state_identity") - -#if defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) - check_result = __MIG_check__Request__mach_exception_raise_state_identity_t((__Request *)In0P, (__Request **)&In1P); - if (check_result != MACH_MSG_SUCCESS) - { MIG_RETURN_ERROR(OutP, check_result); } -#endif /* defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */ - - OutP->new_stateCnt = 224; - - OutP->RetCode = catch_mach_exception_raise_state_identity(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt); - if (OutP->RetCode != KERN_SUCCESS) { - MIG_RETURN_ERROR(OutP, OutP->RetCode); - } - - OutP->NDR = NDR_record; - - - OutP->flavor = In1P->flavor; - OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt))); - - __AfterRcvRpc(2407, "mach_exception_raise_state_identity") -} - - - -/* Description of this subsystem, for use in direct RPC */ -const struct catch_mach_exc_subsystem catch_mach_exc_subsystem = { - mach_exc_server_routine, - 2405, - 2408, - (mach_msg_size_t)sizeof(union __ReplyUnion__catch_mach_exc_subsystem), - (vm_address_t)0, - { - { (mig_impl_routine_t) 0, - (mig_stub_routine_t) _Xmach_exception_raise, 6, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_t)}, - { (mig_impl_routine_t) 0, - (mig_stub_routine_t) _Xmach_exception_raise_state, 9, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_t)}, - { (mig_impl_routine_t) 0, - (mig_stub_routine_t) _Xmach_exception_raise_state_identity, 11, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_identity_t)}, - } -}; - -mig_external boolean_t mach_exc_server - (mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP) -{ - /* - * typedef struct { - * mach_msg_header_t Head; - * NDR_record_t NDR; - * kern_return_t RetCode; - * } mig_reply_error_t; - */ - - register mig_routine_t routine; - - OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0); - OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port; - /* Minimal size: routine() will update it if different */ - OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t); - OutHeadP->msgh_local_port = MACH_PORT_NULL; - OutHeadP->msgh_id = InHeadP->msgh_id + 100; - - if ((InHeadP->msgh_id > 2407) || (InHeadP->msgh_id < 2405) || - ((routine = catch_mach_exc_subsystem.routine[InHeadP->msgh_id - 2405].stub_routine) == 0)) { - ((mig_reply_error_t *)OutHeadP)->NDR = NDR_record; - ((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID; - return FALSE; - } - (*routine) (InHeadP, OutHeadP); - return TRUE; -} - -mig_external mig_routine_t mach_exc_server_routine - (mach_msg_header_t *InHeadP) -{ - register int msgh_id; - - msgh_id = InHeadP->msgh_id - 2405; - - if ((msgh_id > 2) || (msgh_id < 0)) - return 0; - - return catch_mach_exc_subsystem.routine[msgh_id].stub_routine; -} - -#endif - diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h b/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h deleted file mode 100644 index 766ba11..0000000 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h +++ /dev/null @@ -1,298 +0,0 @@ -#ifndef _mach_exc_server_ -#define _mach_exc_server_ - -/* Module mach_exc */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* BEGIN VOUCHER CODE */ - -#ifndef KERNEL -#if defined(__has_include) -#if __has_include() -#ifndef USING_VOUCHERS -#define USING_VOUCHERS -#endif -#ifndef __VOUCHER_FORWARD_TYPE_DECLS__ -#define __VOUCHER_FORWARD_TYPE_DECLS__ -#ifdef __cplusplus -extern "C" { -#endif - extern boolean_t voucher_mach_msg_set(mach_msg_header_t *msg) __attribute__((weak_import)); -#ifdef __cplusplus -} -#endif -#endif // __VOUCHER_FORWARD_TYPE_DECLS__ -#endif // __has_include() -#endif // __has_include -#endif // !KERNEL - -/* END VOUCHER CODE */ - - -#ifdef AUTOTEST -#ifndef FUNCTION_PTR_T -#define FUNCTION_PTR_T -typedef void (*function_ptr_t)(mach_port_t, char *, mach_msg_type_number_t); -typedef struct { - char *name; - function_ptr_t function; -} function_table_entry; -typedef function_table_entry *function_table_t; -#endif /* FUNCTION_PTR_T */ -#endif /* AUTOTEST */ - -#ifndef mach_exc_MSG_COUNT -#define mach_exc_MSG_COUNT 3 -#endif /* mach_exc_MSG_COUNT */ - -#include -#include -#include -#include - -#ifdef __BeforeMigServerHeader -__BeforeMigServerHeader -#endif /* __BeforeMigServerHeader */ - - -/* Routine mach_exception_raise */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t catch_mach_exception_raise -( - mach_port_t exception_port, - mach_port_t thread, - mach_port_t task, - exception_type_t exception, - mach_exception_data_t code, - mach_msg_type_number_t codeCnt -); - -/* Routine mach_exception_raise_state */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t catch_mach_exception_raise_state -( - mach_port_t exception_port, - exception_type_t exception, - const mach_exception_data_t code, - mach_msg_type_number_t codeCnt, - int *flavor, - const thread_state_t old_state, - mach_msg_type_number_t old_stateCnt, - thread_state_t new_state, - mach_msg_type_number_t *new_stateCnt -); - -/* Routine mach_exception_raise_state_identity */ -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -kern_return_t catch_mach_exception_raise_state_identity -( - mach_port_t exception_port, - mach_port_t thread, - mach_port_t task, - exception_type_t exception, - mach_exception_data_t code, - mach_msg_type_number_t codeCnt, - int *flavor, - thread_state_t old_state, - mach_msg_type_number_t old_stateCnt, - thread_state_t new_state, - mach_msg_type_number_t *new_stateCnt -); - -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -boolean_t mach_exc_server( - mach_msg_header_t *InHeadP, - mach_msg_header_t *OutHeadP); - -#ifdef mig_external -mig_external -#else -extern -#endif /* mig_external */ -mig_routine_t mach_exc_server_routine( - mach_msg_header_t *InHeadP); - - -/* Description of this subsystem, for use in direct RPC */ -extern const struct catch_mach_exc_subsystem { - mig_server_routine_t server; /* Server routine */ - mach_msg_id_t start; /* Min routine number */ - mach_msg_id_t end; /* Max routine number + 1 */ - unsigned int maxsize; /* Max msg size */ - vm_address_t reserved; /* Reserved */ - struct routine_descriptor /*Array of routine descriptors */ - routine[3]; -} catch_mach_exc_subsystem; - -/* typedefs for all requests */ - -#ifndef __Request__mach_exc_subsystem__defined -#define __Request__mach_exc_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t thread; - mach_msg_port_descriptor_t task; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_type_t exception; - mach_msg_type_number_t codeCnt; - int64_t code[2]; - } __Request__mach_exception_raise_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - exception_type_t exception; - mach_msg_type_number_t codeCnt; - int64_t code[2]; - int flavor; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[224]; - } __Request__mach_exception_raise_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - /* start of the kernel processed data */ - mach_msg_body_t msgh_body; - mach_msg_port_descriptor_t thread; - mach_msg_port_descriptor_t task; - /* end of the kernel processed data */ - NDR_record_t NDR; - exception_type_t exception; - mach_msg_type_number_t codeCnt; - int64_t code[2]; - int flavor; - mach_msg_type_number_t old_stateCnt; - natural_t old_state[224]; - } __Request__mach_exception_raise_state_identity_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif -#endif /* !__Request__mach_exc_subsystem__defined */ - - -/* union of all requests */ - -#ifndef __RequestUnion__catch_mach_exc_subsystem__defined -#define __RequestUnion__catch_mach_exc_subsystem__defined -union __RequestUnion__catch_mach_exc_subsystem { - __Request__mach_exception_raise_t Request_mach_exception_raise; - __Request__mach_exception_raise_state_t Request_mach_exception_raise_state; - __Request__mach_exception_raise_state_identity_t Request_mach_exception_raise_state_identity; -}; -#endif /* __RequestUnion__catch_mach_exc_subsystem__defined */ -/* typedefs for all replies */ - -#ifndef __Reply__mach_exc_subsystem__defined -#define __Reply__mach_exc_subsystem__defined - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - } __Reply__mach_exception_raise_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - int flavor; - mach_msg_type_number_t new_stateCnt; - natural_t new_state[224]; - } __Reply__mach_exception_raise_state_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif - -#ifdef __MigPackStructs -#pragma pack(4) -#endif - typedef struct { - mach_msg_header_t Head; - NDR_record_t NDR; - kern_return_t RetCode; - int flavor; - mach_msg_type_number_t new_stateCnt; - natural_t new_state[224]; - } __Reply__mach_exception_raise_state_identity_t __attribute__((unused)); -#ifdef __MigPackStructs -#pragma pack() -#endif -#endif /* !__Reply__mach_exc_subsystem__defined */ - - -/* union of all replies */ - -#ifndef __ReplyUnion__catch_mach_exc_subsystem__defined -#define __ReplyUnion__catch_mach_exc_subsystem__defined -union __ReplyUnion__catch_mach_exc_subsystem { - __Reply__mach_exception_raise_t Reply_mach_exception_raise; - __Reply__mach_exception_raise_state_t Reply_mach_exception_raise_state; - __Reply__mach_exception_raise_state_identity_t Reply_mach_exception_raise_state_identity; -}; -#endif /* __RequestUnion__catch_mach_exc_subsystem__defined */ - -#ifndef subsystem_to_name_map_mach_exc -#define subsystem_to_name_map_mach_exc \ - { "mach_exception_raise", 2405 },\ - { "mach_exception_raise_state", 2406 },\ - { "mach_exception_raise_state_identity", 2407 } -#endif - -#ifdef __AfterMigServerHeader -__AfterMigServerHeader -#endif /* __AfterMigServerHeader */ - -#endif /* _mach_exc_server_ */ diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift index f4d933c..740c392 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift @@ -61,7 +61,7 @@ public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closu /// This can be useful if you want to gather information about expectations /// that occur within a closure. /// -/// @param silently expectations are no longer send to the default Nimble +/// @param silently expectations are no longer send to the default Nimble /// assertion handler when this is true. Defaults to false. /// /// @see gatherFailingExpectations diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift index 1c51cd7..5e1afd5 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift @@ -1,6 +1,14 @@ import Foundation -#if _runtime(_ObjC) +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + +private func from(objcPredicate: NMBPredicate) -> Predicate { + return Predicate { actualExpression in + let result = objcPredicate.satisfies(({ try! actualExpression.evaluate() }), + location: actualExpression.location) + return result.toSwift() + } +} internal struct ObjCMatcherWrapper: Matcher { let matcher: NMBMatcher @@ -22,13 +30,13 @@ internal struct ObjCMatcherWrapper: Matcher { // Equivalent to Expectation, but for Nimble's Objective-C interface public class NMBExpectation: NSObject { - internal let _actualBlock: () -> NSObject! + internal let _actualBlock: () -> NSObject? internal var _negative: Bool internal let _file: FileString internal let _line: UInt internal var _timeout: TimeInterval = 1.0 - public init(actualBlock: @escaping () -> NSObject!, negative: Bool, file: FileString, line: UInt) { + @objc public init(actualBlock: @escaping () -> NSObject?, negative: Bool, file: FileString, line: UInt) { self._actualBlock = actualBlock self._negative = negative self._file = file @@ -41,89 +49,137 @@ public class NMBExpectation: NSObject { } } - public var withTimeout: (TimeInterval) -> NMBExpectation { + @objc public var withTimeout: (TimeInterval) -> NMBExpectation { return ({ timeout in self._timeout = timeout return self }) } - public var to: (NMBMatcher) -> Void { + @objc public var to: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) + if let pred = matcher as? NMBPredicate { + self.expectValue.to(from(objcPredicate: pred)) + } else { + self.expectValue.to(ObjCMatcherWrapper(matcher: matcher)) + } }) } - public var toWithDescription: (NMBMatcher, String) -> Void { + @objc public var toWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) + if let pred = matcher as? NMBPredicate { + self.expectValue.to(from(objcPredicate: pred), description: description) + } else { + self.expectValue.to(ObjCMatcherWrapper(matcher: matcher), description: description) + } }) } - public var toNot: (NMBMatcher) -> Void { + @objc public var toNot: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher) - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toNot(from(objcPredicate: pred)) + } else { + self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher)) + } }) } - public var toNotWithDescription: (NMBMatcher, String) -> Void { + @objc public var toNotWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.toNot( - ObjCMatcherWrapper(matcher: matcher), description: description - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toNot(from(objcPredicate: pred), description: description) + } else { + self.expectValue.toNot(ObjCMatcherWrapper(matcher: matcher), description: description) + } }) } - public var notTo: (NMBMatcher) -> Void { return toNot } + @objc public var notTo: (NMBMatcher) -> Void { return toNot } - public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } + @objc public var notToWithDescription: (NMBMatcher, String) -> Void { return toNotWithDescription } - public var toEventually: (NMBMatcher) -> Void { + @objc public var toEventually: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.toEventually( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: nil - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventually( + from(objcPredicate: pred), + timeout: self._timeout, + description: nil + ) + } else { + self.expectValue.toEventually( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: nil + ) + } }) } - public var toEventuallyWithDescription: (NMBMatcher, String) -> Void { + @objc public var toEventuallyWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.toEventually( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: description - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventually( + from(objcPredicate: pred), + timeout: self._timeout, + description: description + ) + } else { + self.expectValue.toEventually( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: description + ) + } }) } - public var toEventuallyNot: (NMBMatcher) -> Void { + @objc public var toEventuallyNot: (NMBMatcher) -> Void { return ({ matcher in - self.expectValue.toEventuallyNot( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: nil - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventuallyNot( + from(objcPredicate: pred), + timeout: self._timeout, + description: nil + ) + } else { + self.expectValue.toEventuallyNot( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: nil + ) + } }) } - public var toEventuallyNotWithDescription: (NMBMatcher, String) -> Void { + @objc public var toEventuallyNotWithDescription: (NMBMatcher, String) -> Void { return ({ matcher, description in - self.expectValue.toEventuallyNot( - ObjCMatcherWrapper(matcher: matcher), - timeout: self._timeout, - description: description - ) + if let pred = matcher as? NMBPredicate { + self.expectValue.toEventuallyNot( + from(objcPredicate: pred), + timeout: self._timeout, + description: description + ) + } else { + self.expectValue.toEventuallyNot( + ObjCMatcherWrapper(matcher: matcher), + timeout: self._timeout, + description: description + ) + } }) } - public var toNotEventually: (NMBMatcher) -> Void { return toEventuallyNot } + @objc public var toNotEventually: (NMBMatcher) -> Void { + return toEventuallyNot + } - public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { return toEventuallyNotWithDescription } + @objc public var toNotEventuallyWithDescription: (NMBMatcher, String) -> Void { + return toEventuallyNotWithDescription + } - public class func failWithMessage(_ message: String, file: FileString, line: UInt) { + @objc public class func failWithMessage(_ message: String, file: FileString, line: UInt) { fail(message, location: SourceLocation(file: file, line: line)) } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift index 19a4567..0288b75 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift @@ -1,9 +1,11 @@ import Foundation -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +// swiftlint:disable line_length public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool +// swiftlint:enable line_length public class NMBObjCMatcher: NSObject, NMBMatcher { let _match: MatcherBlock @@ -53,7 +55,7 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { return true } - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let expr = Expression(expression: actualBlock, location: location) let result = _match( expr, @@ -65,7 +67,7 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { } } - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let expr = Expression(expression: actualBlock, location: location) let result = _doesNotMatch( expr, diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift index a55cb27..e1b5432 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleEnvironment.swift @@ -2,7 +2,7 @@ import Dispatch import Foundation /// "Global" state of Nimble is stored here. Only DSL functions should access / be aware of this -/// class' existance +/// class' existence internal class NimbleEnvironment { static var activeInstance: NimbleEnvironment { get { diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift index 78e6dd9..c8d32ad 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift @@ -42,18 +42,29 @@ class NimbleXCTestUnavailableHandler: AssertionHandler { private(set) var currentTestCase: XCTestCase? + private var stashed_swift_reportFatalErrorsToDebugger: Bool = false + @objc func testCaseWillStart(_ testCase: XCTestCase) { + #if swift(>=3.2) + stashed_swift_reportFatalErrorsToDebugger = _swift_reportFatalErrorsToDebugger + _swift_reportFatalErrorsToDebugger = false + #endif + currentTestCase = testCase } @objc func testCaseDidFinish(_ testCase: XCTestCase) { currentTestCase = nil + + #if swift(>=3.2) + _swift_reportFatalErrorsToDebugger = stashed_swift_reportFatalErrorsToDebugger + #endif } } #endif func isXCTestAvailable() -> Bool { -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) // XCTest is weakly linked and so may not be present return NSClassFromString("XCTestCase") != nil #else @@ -66,7 +77,12 @@ private func recordFailure(_ message: String, location: SourceLocation) { XCTFail("\(message)", file: location.file, line: location.line) #else if let testCase = CurrentTestCaseTracker.sharedInstance.currentTestCase { - testCase.recordFailure(withDescription: message, inFile: location.file, atLine: location.line, expected: true) + #if swift(>=4) + let line = Int(location.line) + #else + let line = location.line + #endif + testCase.recordFailure(withDescription: message, inFile: location.file, atLine: line, expected: true) } else { let msg = "Attempted to report a test failure to XCTest while no test case was running. " + "The failure was:\n\"\(message)\"\nIt occurred at: \(location.file):\(location.line)" diff --git a/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift b/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift index 1930dcc..e874136 100644 --- a/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift +++ b/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift @@ -11,25 +11,42 @@ private enum ErrorResult { /// bridges to Objective-C via the @objc keyword. This class encapsulates callback-style /// asynchronous waiting logic so that it may be called from Objective-C and Swift. internal class NMBWait: NSObject { +// About these kind of lines, `@objc` attributes are only required for Objective-C +// support, so that should be conditional on Darwin platforms and normal Xcode builds +// (non-SwiftPM builds). +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objc internal class func until( timeout: TimeInterval, file: FileString = #file, line: UInt = #line, - action: @escaping (@escaping () -> Void) -> Void) -> Void { + action: @escaping (@escaping () -> Void) -> Void) { return throwableUntil(timeout: timeout, file: file, line: line) { done in action(done) } } +#else + internal class func until( + timeout: TimeInterval, + file: FileString = #file, + line: UInt = #line, + action: @escaping (@escaping () -> Void) -> Void) { + return throwableUntil(timeout: timeout, file: file, line: line) { done in + action(done) + } + } +#endif // Using a throwable closure makes this method not objc compatible. internal class func throwableUntil( timeout: TimeInterval, file: FileString = #file, line: UInt = #line, - action: @escaping (@escaping () -> Void) throws -> Void) -> Void { + action: @escaping (@escaping () -> Void) throws -> Void) { let awaiter = NimbleEnvironment.activeInstance.awaiter let leeway = timeout / 2.0 - let result = awaiter.performBlock { (done: @escaping (ErrorResult) -> Void) throws -> Void in + // swiftlint:disable:next line_length + let result = awaiter.performBlock(file: file, line: line) { (done: @escaping (ErrorResult) -> Void) throws -> Void in DispatchQueue.main.async { let capture = NMBExceptionCapture( handler: ({ exception in @@ -70,19 +87,20 @@ internal class NMBWait: NSObject { } } - #if SWIFT_PACKAGE - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) -> Void { +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objc(untilFile:line:action:) + internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) { until(timeout: 1, file: file, line: line, action: action) } - #else - @objc(untilFile:line:action:) - internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) -> Void { +#else + internal class func until(_ file: FileString = #file, line: UInt = #line, action: @escaping (() -> Void) -> Void) { until(timeout: 1, file: file, line: line, action: action) } - #endif +#endif } internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterval) -> String { + // swiftlint:disable:next line_length return "\(fnName) timed out but was unable to run the timeout handler because the main thread is unresponsive (\(leeway) seconds is allow after the wait times out). Conditions that may cause this include processing blocking IO on the main thread, calls to sleep(), deadlocks, and synchronous IPC. Nimble forcefully stopped run loop which may cause future failures in test run." } @@ -90,9 +108,9 @@ internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterv /// /// @discussion /// Call the done() closure to indicate the waiting has completed. -/// +/// /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. -public func waitUntil(timeout: TimeInterval = 1, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) -> Void { +public func waitUntil(timeout: TimeInterval = AsyncDefaults.Timeout, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { NMBWait.until(timeout: timeout, file: file, line: line, action: action) } diff --git a/Example/Pods/Nimble/Sources/Nimble/DSL.swift b/Example/Pods/Nimble/Sources/Nimble/DSL.swift index 7ebd684..e49bb0c 100644 --- a/Example/Pods/Nimble/Sources/Nimble/DSL.swift +++ b/Example/Pods/Nimble/Sources/Nimble/DSL.swift @@ -43,7 +43,7 @@ internal func nimblePrecondition( line: UInt = #line) { let result = expr() if !result { -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) let e = NSException( name: NSExceptionName(name()), reason: message(), diff --git a/Example/Pods/Nimble/Sources/Nimble/Expectation.swift b/Example/Pods/Nimble/Sources/Nimble/Expectation.swift index c5978f4..e3f616a 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Expectation.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Expectation.swift @@ -1,5 +1,6 @@ import Foundation +// Deprecated internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) where U: Matcher, U.ValueType == T { let msg = FailureMessage() @@ -12,11 +13,12 @@ internal func expressionMatches(_ expression: Expression, matcher: U, t } return (pass, msg) } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" + msg.stringValue = "unexpected error thrown: <\(error)>" return (false, msg) } } +// Deprecated internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) where U: Matcher, U.ValueType == T { let msg = FailureMessage() @@ -29,11 +31,46 @@ internal func expressionDoesNotMatch(_ expression: Expression, matcher: } return (pass, msg) } catch let error { - msg.actualValue = "an unexpected error thrown: <\(error)>" + msg.stringValue = "unexpected error thrown: <\(error)>" return (false, msg) } } +internal func execute(_ expression: Expression, _ style: ExpectationStyle, _ predicate: Predicate, to: String, description: String?, captureExceptions: Bool = true) -> (Bool, FailureMessage) { + func run() -> (Bool, FailureMessage) { + let msg = FailureMessage() + msg.userDescription = description + msg.to = to + do { + let result = try predicate.satisfies(expression) + result.message.update(failureMessage: msg) + if msg.actualValue == "" { + msg.actualValue = "<\(stringify(try expression.evaluate()))>" + } + return (result.toBoolean(expectation: style), msg) + } catch let error { + msg.stringValue = "unexpected error thrown: <\(error)>" + return (false, msg) + } + } + + var result: (Bool, FailureMessage) = (false, FailureMessage()) + if captureExceptions { + let capture = NMBExceptionCapture(handler: ({ exception -> Void in + let msg = FailureMessage() + msg.stringValue = "unexpected exception raised: \(exception)" + result = (false, msg) + }), finally: nil) + capture.tryBlock { + result = run() + } + } else { + result = run() + } + + return result +} + public struct Expectation { public let expression: Expression @@ -43,21 +80,24 @@ public struct Expectation { handler.assert(pass, message: message, location: expression.location) } - /// Tests the actual value using a matcher to match. + ////////////////// OLD API ///////////////////// + + /// DEPRECATED: Tests the actual value using a matcher to match. public func to(_ matcher: U, description: String? = nil) where U: Matcher, U.ValueType == T { let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description) verify(pass, msg) } - /// Tests the actual value using a matcher to not match. + /// DEPRECATED: Tests the actual value using a matcher to not match. public func toNot(_ matcher: U, description: String? = nil) where U: Matcher, U.ValueType == T { + // swiftlint:disable:next line_length let (pass, msg) = expressionDoesNotMatch(expression, matcher: matcher, toNot: "to not", description: description) verify(pass, msg) } - /// Tests the actual value using a matcher to not match. + /// DEPRECATED: Tests the actual value using a matcher to not match. /// /// Alias to toNot(). public func notTo(_ matcher: U, description: String? = nil) @@ -65,6 +105,27 @@ public struct Expectation { toNot(matcher, description: description) } + ////////////////// NEW API ///////////////////// + + /// Tests the actual value using a matcher to match. + public func to(_ predicate: Predicate, description: String? = nil) { + let (pass, msg) = execute(expression, .toMatch, predicate, to: "to", description: description) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match. + public func toNot(_ predicate: Predicate, description: String? = nil) { + let (pass, msg) = execute(expression, .toNotMatch, predicate, to: "to not", description: description) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match. + /// + /// Alias to toNot(). + public func notTo(_ predicate: Predicate, description: String? = nil) { + toNot(predicate, description: description) + } + // see: // - AsyncMatcherWrapper for extension // - NMBExpectation for Objective-C interface diff --git a/Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift b/Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift new file mode 100644 index 0000000..992ee0e --- /dev/null +++ b/Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift @@ -0,0 +1,262 @@ +import Foundation + +public indirect enum ExpectationMessage { + // --- Primary Expectations --- + /// includes actual value in output ("expected to , got ") + case expectedActualValueTo(/* message: */ String) + /// uses a custom actual value string in output ("expected to , got ") + case expectedCustomValueTo(/* message: */ String, /* actual: */ String) + /// excludes actual value in output ("expected to ") + case expectedTo(/* message: */ String) + /// allows any free-form message ("") + case fail(/* message: */ String) + + // --- Composite Expectations --- + // Generally, you'll want the methods, appended(message:) and appended(details:) instead. + + /// Not Fully Implemented Yet. + case prepends(/* Prepended Message */ String, ExpectationMessage) + + /// appends after an existing message (" (use beNil() to match nils)") + case appends(ExpectationMessage, /* Appended Message */ String) + + /// provides long-form multi-line explainations ("\n\n") + case details(ExpectationMessage, String) + + internal var sampleMessage: String { + let asStr = toString(actual: "", expected: "expected", to: "to") + let asFailureMessage = FailureMessage() + update(failureMessage: asFailureMessage) + // swiftlint:disable:next line_length + return "(toString(actual:expected:to:) -> \(asStr) || update(failureMessage:) -> \(asFailureMessage.stringValue))" + } + + /// Returns the smallest message after the "expected to" string that summarizes the error. + /// + /// Returns the message part from ExpectationMessage, ignoring all .appends and .details. + public var expectedMessage: String { + switch self { + case let .fail(msg): + return msg + case let .expectedTo(msg): + return msg + case let .expectedActualValueTo(msg): + return msg + case let .expectedCustomValueTo(msg, _): + return msg + case let .prepends(_, expectation): + return expectation.expectedMessage + case let .appends(expectation, msg): + return "\(expectation.expectedMessage)\(msg)" + case let .details(expectation, _): + return expectation.expectedMessage + } + } + + /// Appends a message after the primary expectation message + public func appended(message: String) -> ExpectationMessage { + switch self { + case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo, .appends, .prepends: + return .appends(self, message) + case let .details(expectation, msg): + return .details(expectation.appended(message: message), msg) + } + } + + /// Appends a message hinting to use beNil() for when the actual value given was nil. + public func appendedBeNilHint() -> ExpectationMessage { + return appended(message: " (use beNil() to match nils)") + } + + /// Appends a detailed (aka - multiline) message after the primary expectation message + /// Detailed messages will be placed after .appended(message:) calls. + public func appended(details: String) -> ExpectationMessage { + return .details(self, details) + } + + internal func visitLeafs(_ f: (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { + switch self { + case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: + return f(self) + case let .prepends(msg, expectation): + return .prepends(msg, expectation.visitLeafs(f)) + case let .appends(expectation, msg): + return .appends(expectation.visitLeafs(f), msg) + case let .details(expectation, msg): + return .details(expectation.visitLeafs(f), msg) + } + } + + /// Replaces a primary expectation with one returned by f. Preserves all composite expectations + /// that were built upon it (aka - all appended(message:) and appended(details:). + public func replacedExpectation(_ f: @escaping (ExpectationMessage) -> ExpectationMessage) -> ExpectationMessage { + func walk(_ msg: ExpectationMessage) -> ExpectationMessage { + switch msg { + case .fail, .expectedTo, .expectedActualValueTo, .expectedCustomValueTo: + return f(msg) + default: + return msg + } + } + return visitLeafs(walk) + } + + /// Wraps a primary expectation with text before and after it. + /// Alias to prepended(message: before).appended(message: after) + public func wrappedExpectation(before: String, after: String) -> ExpectationMessage { + return prepended(expectation: before).appended(message: after) + } + + /// Prepends a message by modifying the primary expectation + public func prepended(expectation message: String) -> ExpectationMessage { + func walk(_ msg: ExpectationMessage) -> ExpectationMessage { + switch msg { + case let .expectedTo(msg): + return .expectedTo(message + msg) + case let .expectedActualValueTo(msg): + return .expectedActualValueTo(message + msg) + case let .expectedCustomValueTo(msg, actual): + return .expectedCustomValueTo(message + msg, actual) + default: + return msg.visitLeafs(walk) + } + } + return visitLeafs(walk) + } + + // TODO: test & verify correct behavior + internal func prepended(message: String) -> ExpectationMessage { + return .prepends(message, self) + } + + /// Converts the tree of ExpectationMessages into a final built string. + public func toString(actual: String, expected: String = "expected", to: String = "to") -> String { + switch self { + case let .fail(msg): + return msg + case let .expectedTo(msg): + return "\(expected) \(to) \(msg)" + case let .expectedActualValueTo(msg): + return "\(expected) \(to) \(msg), got \(actual)" + case let .expectedCustomValueTo(msg, actual): + return "\(expected) \(to) \(msg), got \(actual)" + case let .prepends(msg, expectation): + return "\(msg)\(expectation.toString(actual: actual, expected: expected, to: to))" + case let .appends(expectation, msg): + return "\(expectation.toString(actual: actual, expected: expected, to: to))\(msg)" + case let .details(expectation, msg): + return "\(expectation.toString(actual: actual, expected: expected, to: to))\n\n\(msg)" + } + } + + // Backwards compatibility: converts ExpectationMessage tree to FailureMessage + internal func update(failureMessage: FailureMessage) { + switch self { + case let .fail(msg): + failureMessage.stringValue = msg + case let .expectedTo(msg): + failureMessage.actualValue = nil + failureMessage.postfixMessage = msg + case let .expectedActualValueTo(msg): + failureMessage.postfixMessage = msg + case let .expectedCustomValueTo(msg, actual): + failureMessage.postfixMessage = msg + failureMessage.actualValue = actual + case let .prepends(msg, expectation): + expectation.update(failureMessage: failureMessage) + if let desc = failureMessage.userDescription { + failureMessage.userDescription = "\(msg)\(desc)" + } else { + failureMessage.userDescription = msg + } + case let .appends(expectation, msg): + expectation.update(failureMessage: failureMessage) + failureMessage.appendMessage(msg) + case let .details(expectation, msg): + expectation.update(failureMessage: failureMessage) + failureMessage.appendDetails(msg) + } + } +} + +extension FailureMessage { + internal func toExpectationMessage() -> ExpectationMessage { + let defaultMsg = FailureMessage() + if expected != defaultMsg.expected || _stringValueOverride != nil { + return .fail(stringValue) + } + + var msg: ExpectationMessage = .fail(userDescription ?? "") + if actualValue != "" && actualValue != nil { + msg = .expectedCustomValueTo(postfixMessage, actualValue ?? "") + } else if postfixMessage != defaultMsg.postfixMessage { + if actualValue == nil { + msg = .expectedTo(postfixMessage) + } else { + msg = .expectedActualValueTo(postfixMessage) + } + } + if postfixActual != defaultMsg.postfixActual { + msg = .appends(msg, postfixActual) + } + if let m = extendedMessage { + msg = .details(msg, m) + } + return msg + } +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) + +public class NMBExpectationMessage: NSObject { + private let msg: ExpectationMessage + + internal init(swift msg: ExpectationMessage) { + self.msg = msg + } + + public init(expectedTo message: String) { + self.msg = .expectedTo(message) + } + public init(expectedActualValueTo message: String) { + self.msg = .expectedActualValueTo(message) + } + + public init(expectedActualValueTo message: String, customActualValue actual: String) { + self.msg = .expectedCustomValueTo(message, actual) + } + + public init(fail message: String) { + self.msg = .fail(message) + } + + public init(prepend message: String, child: NMBExpectationMessage) { + self.msg = .prepends(message, child.msg) + } + + public init(appendedMessage message: String, child: NMBExpectationMessage) { + self.msg = .appends(child.msg, message) + } + + public init(prependedMessage message: String, child: NMBExpectationMessage) { + self.msg = .prepends(message, child.msg) + } + + public init(details message: String, child: NMBExpectationMessage) { + self.msg = .details(child.msg, message) + } + + public func appendedBeNilHint() -> NMBExpectationMessage { + return NMBExpectationMessage(swift: msg.appendedBeNilHint()) + } + + public func toSwift() -> ExpectationMessage { return self.msg } +} + +extension ExpectationMessage { + func toObjectiveC() -> NMBExpectationMessage { + return NMBExpectationMessage(swift: self) + } +} + +#endif diff --git a/Example/Pods/Nimble/Sources/Nimble/Expression.swift b/Example/Pods/Nimble/Sources/Nimble/Expression.swift index f7afffe..5a233fd 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Expression.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Expression.swift @@ -77,7 +77,11 @@ public struct Expression { /// @param block The block that can cast the current Expression value to a /// new type. public func cast(_ block: @escaping (T?) throws -> U?) -> Expression { - return Expression(expression: ({ try block(self.evaluate()) }), location: self.location, isClosure: self.isClosure) + return Expression( + expression: ({ try block(self.evaluate()) }), + location: self.location, + isClosure: self.isClosure + ) } public func evaluate() throws -> T? { @@ -85,6 +89,11 @@ public struct Expression { } public func withoutCaching() -> Expression { - return Expression(memoizedExpression: self._expression, location: location, withoutCaching: true, isClosure: isClosure) + return Expression( + memoizedExpression: self._expression, + location: location, + withoutCaching: true, + isClosure: isClosure + ) } } diff --git a/Example/Pods/Nimble/Sources/Nimble/FailureMessage.swift b/Example/Pods/Nimble/Sources/Nimble/FailureMessage.swift index 24b6c8f..2bc57eb 100644 --- a/Example/Pods/Nimble/Sources/Nimble/FailureMessage.swift +++ b/Example/Pods/Nimble/Sources/Nimble/FailureMessage.swift @@ -12,8 +12,8 @@ public class FailureMessage: NSObject { /// An optional message that will be appended as a new line and provides additional details /// about the failure. This message will only be visible in the issue navigator / in logs but /// not directly in the source editor since only a single line is presented there. - public var extendedMessage: String? = nil - public var userDescription: String? = nil + public var extendedMessage: String? + public var userDescription: String? public var stringValue: String { get { @@ -29,6 +29,9 @@ public class FailureMessage: NSObject { } internal var _stringValueOverride: String? + internal var hasOverriddenStringValue: Bool { + return _stringValueOverride != nil + } public override init() { } @@ -62,4 +65,28 @@ public class FailureMessage: NSObject { return value } + + internal func appendMessage(_ msg: String) { + if hasOverriddenStringValue { + stringValue += "\(msg)" + } else if actualValue != nil { + postfixActual += msg + } else { + postfixMessage += msg + } + } + + internal func appendDetails(_ msg: String) { + if hasOverriddenStringValue { + if let desc = userDescription { + stringValue = "\(desc)\n\(stringValue)" + } + stringValue += "\n\(msg)" + } else { + if let desc = userDescription { + userDescription = desc + } + extendedMessage = msg + } + } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift index 73e79d3..8affa62 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift @@ -1,66 +1,79 @@ import Foundation public func allPass - (_ passFunc: @escaping (T?) -> Bool) -> NonNilMatcherFunc - where U: Sequence, U.Iterator.Element == T { - return allPass("pass a condition", passFunc) + (_ passFunc: @escaping (T?) throws -> Bool) -> Predicate + where U: Sequence, T == U.Iterator.Element { + let matcher = Predicate.simpleNilable("pass a condition") { actualExpression in + return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) + } + return createPredicate(matcher) } public func allPass - (_ passName: String, _ passFunc: @escaping (T?) -> Bool) -> NonNilMatcherFunc - where U: Sequence, U.Iterator.Element == T { - return createAllPassMatcher { expression, failureMessage in - failureMessage.postfixMessage = passName - return passFunc(try expression.evaluate()) - } + (_ passName: String, _ passFunc: @escaping (T?) throws -> Bool) -> Predicate + where U: Sequence, T == U.Iterator.Element { + let matcher = Predicate.simpleNilable(passName) { actualExpression in + return PredicateStatus(bool: try passFunc(try actualExpression.evaluate())) + } + return createPredicate(matcher) } -public func allPass - (_ matcher: V) -> NonNilMatcherFunc - where U: Sequence, V: Matcher, U.Iterator.Element == V.ValueType { - return createAllPassMatcher { - try matcher.matches($0, failureMessage: $1) - } +public func allPass(_ elementMatcher: M) -> Predicate + where S: Sequence, M: Matcher, S.Iterator.Element == M.ValueType { + return createPredicate(elementMatcher.predicate) +} + +public func allPass(_ elementPredicate: Predicate) -> Predicate + where S: Sequence { + return createPredicate(elementPredicate) } -private func createAllPassMatcher - (_ elementEvaluator: @escaping (Expression, FailureMessage) throws -> Bool) -> NonNilMatcherFunc - where U: Sequence, U.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.actualValue = nil - if let actualValue = try actualExpression.evaluate() { +private func createPredicate(_ elementMatcher: Predicate) -> Predicate + where S: Sequence { + return Predicate { actualExpression in + guard let actualValue = try actualExpression.evaluate() else { + return PredicateResult( + status: .fail, + message: .appends(.expectedTo("all pass"), " (use beNil() to match nils)") + ) + } + + var failure: ExpectationMessage = .expectedTo("all pass") for currentElement in actualValue { let exp = Expression( expression: {currentElement}, location: actualExpression.location) - if try !elementEvaluator(exp, failureMessage) { - failureMessage.postfixMessage = - "all \(failureMessage.postfixMessage)," - + " but failed first at element <\(stringify(currentElement))>" - + " in <\(stringify(actualValue))>" - return false + let predicateResult = try elementMatcher.satisfies(exp) + if predicateResult.status == .matches { + failure = predicateResult.message.prepended(expectation: "all ") + } else { + failure = predicateResult.message + .replacedExpectation({ .expectedTo($0.expectedMessage) }) + .wrappedExpectation( + before: "all ", + after: ", but failed first at element <\(stringify(currentElement))>" + + " in <\(stringify(actualValue))>" + ) + return PredicateResult(status: .doesNotMatch, message: failure) } } - failureMessage.postfixMessage = "all \(failureMessage.postfixMessage)" - } else { - failureMessage.postfixMessage = "all pass (use beNil() to match nils)" - return false + failure = failure.replacedExpectation({ expectation in + return .expectedTo(expectation.expectedMessage) + }) + return PredicateResult(status: .matches, message: failure) } - - return true - } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func allPassMatcher(_ matcher: NMBObjCMatcher) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func allPassMatcher(_ matcher: NMBMatcher) -> NMBPredicate { + return NMBPredicate { actualExpression in let location = actualExpression.location let actualValue = try! actualExpression.evaluate() var nsObjects = [NSObject]() var collectionIsUsable = true if let value = actualValue as? NSFastEnumeration { - let generator = NSFastEnumerationIterator(value) + var generator = NSFastEnumerationIterator(value) while let obj = generator.next() { if let nsObject = obj as? NSObject { nsObjects.append(nsObject) @@ -74,20 +87,34 @@ extension NMBObjCMatcher { } if !collectionIsUsable { - failureMessage.postfixMessage = - "allPass only works with NSFastEnumeration (NSArray, NSSet, ...) of NSObjects" - failureMessage.expected = "" - failureMessage.to = "" - return false + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + // swiftlint:disable:next line_length + fail: "allPass can only be used with types which implement NSFastEnumeration (NSArray, NSSet, ...), and whose elements subclass NSObject, got <\(actualValue?.description ?? "nil")>" + ) + ) } let expr = Expression(expression: ({ nsObjects }), location: location) - let elementEvaluator: (Expression, FailureMessage) -> Bool = { - expression, failureMessage in - return matcher.matches({try! expression.evaluate()}, failureMessage: failureMessage, location: expr.location) - } - return try! createAllPassMatcher(elementEvaluator).matches( - expr, failureMessage: failureMessage) + let pred: Predicate<[NSObject]> = createPredicate(Predicate { expr in + if let predicate = matcher as? NMBPredicate { + return predicate.satisfies(({ try! expr.evaluate() }), location: expr.location).toSwift() + } else { + let failureMessage = FailureMessage() + let result = matcher.matches( + ({ try! expr.evaluate() }), + failureMessage: failureMessage, + location: expr.location + ) + let expectationMsg = failureMessage.toExpectationMessage() + return PredicateResult( + bool: result, + message: expectationMsg + ) + } + }) + return try! pred.satisfies(expr).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift index b971ccc..3cba8b0 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift @@ -7,6 +7,37 @@ public struct AsyncDefaults { public static var PollInterval: TimeInterval = 0.01 } +private func async(style: ExpectationStyle, predicate: Predicate, timeout: TimeInterval, poll: TimeInterval, fnName: String) -> Predicate { + return Predicate { actualExpression in + let uncachedExpression = actualExpression.withoutCaching() + let fnName = "expect(...).\(fnName)(...)" + var lastPredicateResult: PredicateResult? + let result = pollBlock( + pollInterval: poll, + timeoutInterval: timeout, + file: actualExpression.location.file, + line: actualExpression.location.line, + fnName: fnName) { + lastPredicateResult = try predicate.satisfies(uncachedExpression) + return lastPredicateResult!.toBoolean(expectation: style) + } + switch result { + case .completed: return lastPredicateResult! + case .timedOut: return PredicateResult(status: .fail, message: lastPredicateResult!.message) + case let .errorThrown(error): + return PredicateResult(status: .fail, message: .fail("unexpected error thrown: <\(error)>")) + case let .raisedException(exception): + return PredicateResult(status: .fail, message: .fail("unexpected exception raised: \(exception)")) + case .blockedRunLoop: + // swiftlint:disable:next line_length + return PredicateResult(status: .fail, message: lastPredicateResult!.message.appended(message: " (timed out, but main thread was unresponsive).")) + case .incomplete: + internalError("Reached .incomplete state for toEventually(...).") + } + } +} + +// Deprecated internal struct AsyncMatcherWrapper: Matcher where U: Matcher, U.ValueType == T { let fullMatcher: U @@ -34,10 +65,10 @@ internal struct AsyncMatcherWrapper: Matcher case let .completed(isSuccessful): return isSuccessful case .timedOut: return false case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" + failureMessage.stringValue = "an unexpected error thrown: <\(error)>" return false case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" + failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" return false case .blockedRunLoop: failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." @@ -61,10 +92,10 @@ internal struct AsyncMatcherWrapper: Matcher case let .completed(isSuccessful): return isSuccessful case .timedOut: return false case let .errorThrown(error): - failureMessage.actualValue = "an unexpected error thrown: <\(error)>" + failureMessage.stringValue = "an unexpected error thrown: <\(error)>" return false case let .raisedException(exception): - failureMessage.actualValue = "an unexpected exception thrown: <\(exception)>" + failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" return false case .blockedRunLoop: failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." @@ -75,8 +106,72 @@ internal struct AsyncMatcherWrapper: Matcher } } -private let toEventuallyRequiresClosureError = FailureMessage(stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function") +private let toEventuallyRequiresClosureError = FailureMessage( + // swiftlint:disable:next line_length + stringValue: "expect(...).toEventually(...) requires an explicit closure (eg - expect { ... }.toEventually(...) )\nSwift 1.2 @autoclosure behavior has changed in an incompatible way for Nimble to function" +) + +extension Expectation { + /// Tests the actual value using a matcher to match by checking continuously + /// at each pollInterval until the timeout is reached. + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) + + let (pass, msg) = execute( + expression, + .toMatch, + async(style: .toMatch, predicate: predicate, timeout: timeout, poll: pollInterval, fnName: "toEventually"), + to: "to eventually", + description: description, + captureExceptions: false + ) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match by checking + /// continuously at each pollInterval until the timeout is reached. + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toEventuallyNot(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + nimblePrecondition(expression.isClosure, "NimbleInternalError", toEventuallyRequiresClosureError.stringValue) + + let (pass, msg) = execute( + expression, + .toNotMatch, + async( + style: .toNotMatch, + predicate: predicate, + timeout: timeout, + poll: pollInterval, + fnName: "toEventuallyNot" + ), + to: "to eventually not", + description: description, + captureExceptions: false + ) + verify(pass, msg) + } + + /// Tests the actual value using a matcher to not match by checking + /// continuously at each pollInterval until the timeout is reached. + /// + /// Alias of toEventuallyNot() + /// + /// @discussion + /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function + /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. + public func toNotEventually(_ predicate: Predicate, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) { + return toEventuallyNot(predicate, timeout: timeout, pollInterval: pollInterval, description: description) + } +} +// Deprecated extension Expectation { /// Tests the actual value using a matcher to match by checking continuously /// at each pollInterval until the timeout is reached. diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift index f636a72..ac9d723 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift @@ -1,46 +1,66 @@ import Foundation +private func matcherMessage(forType expectedType: T.Type) -> String { + return "be a kind of \(String(describing: expectedType))" +} +private func matcherMessage(forClass expectedClass: AnyClass) -> String { + return "be a kind of \(String(describing: expectedClass))" +} + /// A Nimble matcher that succeeds when the actual value is an instance of the given class. -public func beAKindOf(_ expectedType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc {actualExpression, failureMessage in - failureMessage.postfixMessage = "be a kind of \(String(describing: expectedType))" +public func beAKindOf(_ expectedType: T.Type) -> Predicate { + return Predicate.define { actualExpression in + let message: ExpectationMessage + let instance = try actualExpression.evaluate() guard let validInstance = instance else { - failureMessage.actualValue = "" - return false + message = .expectedCustomValueTo(matcherMessage(forType: expectedType), "") + return PredicateResult(status: .fail, message: message) } + message = .expectedCustomValueTo( + "be a kind of \(String(describing: expectedType))", + "<\(String(describing: type(of: validInstance))) instance>" + ) - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" - - guard validInstance is T else { - return false - } - - return true + return PredicateResult( + bool: validInstance is T, + message: message + ) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) /// A Nimble matcher that succeeds when the actual value is an instance of the given class. /// @see beAnInstanceOf if you want to match against the exact class -public func beAKindOf(_ expectedClass: AnyClass) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beAKindOf(_ expectedClass: AnyClass) -> Predicate { + return Predicate.define { actualExpression in + let message: ExpectationMessage + let status: PredicateStatus + let instance = try actualExpression.evaluate() if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" + status = PredicateStatus(bool: instance != nil && instance!.isKind(of: expectedClass)) + message = .expectedCustomValueTo( + matcherMessage(forClass: expectedClass), + "<\(String(describing: type(of: validInstance))) instance>" + ) } else { - failureMessage.actualValue = "" + status = .fail + message = .expectedCustomValueTo( + matcherMessage(forClass: expectedClass), + "" + ) } - failureMessage.postfixMessage = "be a kind of \(String(describing: expectedClass))" - return instance != nil && instance!.isKind(of: expectedClass) + + return PredicateResult(status: status, message: message) } } extension NMBObjCMatcher { - public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage) + @objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { + return NMBPredicate { actualExpression in + return try! beAKindOf(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift index 07ce3d3..5e2c850 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift @@ -1,49 +1,55 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is an _exact_ instance of the given class. -public func beAnInstanceOf(_ expectedType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc {actualExpression, failureMessage in - failureMessage.postfixMessage = "be an instance of \(String(describing: expectedType))" +public func beAnInstanceOf(_ expectedType: T.Type) -> Predicate { + let errorMessage = "be an instance of \(String(describing: expectedType))" + return Predicate.define { actualExpression in let instance = try actualExpression.evaluate() guard let validInstance = instance else { - failureMessage.actualValue = "" - return false + return PredicateResult( + status: .doesNotMatch, + message: .expectedActualValueTo(errorMessage) + ) } - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" + let actualString = "<\(String(describing: type(of: validInstance))) instance>" - if type(of: validInstance) == expectedType { - return true - } - - return false + return PredicateResult( + status: PredicateStatus(bool: type(of: validInstance) == expectedType), + message: .expectedCustomValueTo(errorMessage, actualString) + ) } } /// A Nimble matcher that succeeds when the actual value is an instance of the given class. /// @see beAKindOf if you want to match against subclasses -public func beAnInstanceOf(_ expectedClass: AnyClass) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beAnInstanceOf(_ expectedClass: AnyClass) -> Predicate { + let errorMessage = "be an instance of \(String(describing: expectedClass))" + return Predicate.define { actualExpression in let instance = try actualExpression.evaluate() + let actualString: String if let validInstance = instance { - failureMessage.actualValue = "<\(String(describing: type(of: validInstance))) instance>" + actualString = "<\(String(describing: type(of: validInstance))) instance>" } else { - failureMessage.actualValue = "" + actualString = "" } - failureMessage.postfixMessage = "be an instance of \(String(describing: expectedClass))" -#if _runtime(_ObjC) - return instance != nil && instance!.isMember(of: expectedClass) -#else - return instance != nil && type(of: instance!) == expectedClass -#endif + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) + let matches = instance != nil && instance!.isMember(of: expectedClass) + #else + let matches = instance != nil && type(of: instance!) == expectedClass + #endif + return PredicateResult( + status: PredicateStatus(bool: matches), + message: .expectedCustomValueTo(errorMessage, actualString) + ) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage) + @objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { + return NMBPredicate { actualExpression in + return try! beAnInstanceOf(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift index 95c52cf..34fa1b8 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift @@ -1,20 +1,26 @@ import Foundation -internal let DefaultDelta = 0.0001 - -internal func isCloseTo(_ actualValue: NMBDoubleConvertible?, expectedValue: NMBDoubleConvertible, delta: Double, failureMessage: FailureMessage) -> Bool { - failureMessage.postfixMessage = "be close to <\(stringify(expectedValue))> (within \(stringify(delta)))" - failureMessage.actualValue = "<\(stringify(actualValue))>" - return actualValue != nil && abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta +public let DefaultDelta = 0.0001 + +internal func isCloseTo(_ actualValue: NMBDoubleConvertible?, + expectedValue: NMBDoubleConvertible, + delta: Double) + -> PredicateResult { + let errorMessage = "be close to <\(stringify(expectedValue))> (within \(stringify(delta)))" + return PredicateResult( + bool: actualValue != nil && + abs(actualValue!.doubleValue - expectedValue.doubleValue) < delta, + message: .expectedCustomValueTo(errorMessage, "<\(stringify(actualValue))>") + ) } /// A Nimble matcher that succeeds when a value is close to another. This is used for floating /// point values which can have imprecise results when doing arithmetic on them. /// /// @see equal -public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDelta) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta, failureMessage: failureMessage) +public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDelta) -> Predicate { + return Predicate.define { actualExpression in + return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) } } @@ -22,13 +28,13 @@ public func beCloseTo(_ expectedValue: Double, within delta: Double = DefaultDel /// point values which can have imprecise results when doing arithmetic on them. /// /// @see equal -public func beCloseTo(_ expectedValue: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta, failureMessage: failureMessage) +public func beCloseTo(_ expectedValue: NMBDoubleConvertible, within delta: Double = DefaultDelta) -> Predicate { + return Predicate.define { actualExpression in + return isCloseTo(try actualExpression.evaluate(), expectedValue: expectedValue, delta: delta) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { var _expected: NSNumber var _delta: CDouble @@ -37,7 +43,7 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { _delta = within } - public func matches(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func matches(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let actualBlock: () -> NMBDoubleConvertible? = ({ return actualExpression() as? NMBDoubleConvertible }) @@ -46,7 +52,7 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { return try! matcher.matches(expr, failureMessage: failureMessage) } - public func doesNotMatch(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let actualBlock: () -> NMBDoubleConvertible? = ({ return actualExpression() as? NMBDoubleConvertible }) @@ -55,7 +61,7 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { return try! matcher.doesNotMatch(expr, failureMessage: failureMessage) } - public var within: (CDouble) -> NMBObjCBeCloseToMatcher { + @objc public var within: (CDouble) -> NMBObjCBeCloseToMatcher { return ({ delta in return NMBObjCBeCloseToMatcher(expected: self._expected, within: delta) }) @@ -63,30 +69,28 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { } extension NMBObjCMatcher { - public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { + @objc public class func beCloseToMatcher(_ expected: NSNumber, within: CDouble) -> NMBObjCBeCloseToMatcher { return NMBObjCBeCloseToMatcher(expected: expected, within: within) } } #endif -public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> NonNilMatcherFunc <[Double]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be close to <\(stringify(expectedValues))> (each within \(stringify(delta)))" +public func beCloseTo(_ expectedValues: [Double], within delta: Double = DefaultDelta) -> Predicate<[Double]> { + let errorMessage = "be close to <\(stringify(expectedValues))> (each within \(stringify(delta)))" + return Predicate.simple(errorMessage) { actualExpression in if let actual = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actual))>" - if actual.count != expectedValues.count { - return false + return .doesNotMatch } else { for (index, actualItem) in actual.enumerated() { if fabs(actualItem - expectedValues[index]) > delta { - return false + return .doesNotMatch } } - return true + return .matches } } - return false + return .doesNotMatch } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift index 2ea2cdb..3cbc15d 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift @@ -2,35 +2,32 @@ import Foundation /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualSeq = try actualExpression.evaluate() if actualSeq == nil { - return true + return .fail } var generator = actualSeq!.makeIterator() - return generator.next() == nil + return PredicateStatus(bool: generator.next() == nil) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualString = try actualExpression.evaluate() - return actualString == nil || NSString(string: actualString!).length == 0 + return PredicateStatus(bool: actualString == nil || NSString(string: actualString!).length == 0) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For NSString instances, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualString = try actualExpression.evaluate() - return actualString == nil || actualString!.length == 0 + return PredicateStatus(bool: actualString == nil || actualString!.length == 0) } } @@ -39,52 +36,59 @@ public func beEmpty() -> NonNilMatcherFunc { /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualDictionary = try actualExpression.evaluate() - return actualDictionary == nil || actualDictionary!.count == 0 + return PredicateStatus(bool: actualDictionary == nil || actualDictionary!.count == 0) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actualArray = try actualExpression.evaluate() - return actualArray == nil || actualArray!.count == 0 + return PredicateStatus(bool: actualArray == nil || actualArray!.count == 0) } } /// A Nimble matcher that succeeds when a value is "empty". For collections, this /// means the are no items in that collection. For strings, it is an empty string. -public func beEmpty() -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be empty" +public func beEmpty() -> Predicate { + return Predicate.simple("be empty") { actualExpression in let actual = try actualExpression.evaluate() - return actual == nil || actual!.count == 0 + return PredicateStatus(bool: actual == nil || actual!.count == 0) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beEmptyMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func beEmptyMatcher() -> NMBPredicate { + return NMBPredicate { actualExpression in let location = actualExpression.location let actualValue = try! actualExpression.evaluate() - failureMessage.postfixMessage = "be empty" + if let value = actualValue as? NMBCollection { let expr = Expression(expression: ({ value as NMBCollection }), location: location) - return try! beEmpty().matches(expr, failureMessage: failureMessage) + return try! beEmpty().satisfies(expr).toObjectiveC() } else if let value = actualValue as? NSString { let expr = Expression(expression: ({ value as String }), location: location) - return try! beEmpty().matches(expr, failureMessage: failureMessage) + return try! beEmpty().satisfies(expr).toObjectiveC() } else if let actualValue = actualValue { - failureMessage.postfixMessage = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)" - failureMessage.actualValue = "\(String(describing: type(of: actualValue))) type" + // swiftlint:disable:next line_length + let badTypeErrorMsg = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)" + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + expectedActualValueTo: badTypeErrorMsg, + customActualValue: "\(String(describing: type(of: actualValue))) type" + ) + ) } - return false + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage(expectedActualValueTo: "be empty").appendedBeNilHint() + ) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift index c7eb84c..4370f19 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift @@ -1,23 +1,24 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is greater than the expected value. -public func beGreaterThan(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" +public func beGreaterThan(_ expectedValue: T?) -> Predicate { + let errorMessage = "be greater than <\(stringify(expectedValue))>" + return Predicate.simple(errorMessage) { actualExpression in if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual > expected + return PredicateStatus(bool: actual > expected) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual value is greater than the expected value. -public func beGreaterThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" +public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate { + let errorMessage = "be greater than <\(stringify(expectedValue))>" + return Predicate.simple(errorMessage) { actualExpression in let actualValue = try actualExpression.evaluate() - let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending - return matches + let matches = actualValue != nil + && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending + return PredicateStatus(bool: matches) } } @@ -29,9 +30,9 @@ public func > (lhs: Expectation, rhs: NMBComparable?) { lhs.to(beGreaterThan(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + @objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift index 2949fce..55d8e7b 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift @@ -2,26 +2,26 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() if let actual = actualValue, let expected = expectedValue { return actual >= expected } return false - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. -public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedAscending return matches - } + }.requireNonNil } public func >=(lhs: Expectation, rhs: T) { @@ -32,9 +32,9 @@ public func >=(lhs: Expectation, rhs: T) { lhs.to(beGreaterThanOrEqualTo(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + @objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift index 8df7e5f..5732922 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift @@ -2,20 +2,27 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is the same instance /// as the expected instance. -public func beIdenticalTo(_ expected: Any?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beIdenticalTo(_ expected: Any?) -> Predicate { + return Predicate.define { actualExpression in #if os(Linux) let actual = try actualExpression.evaluate() as? AnyObject #else let actual = try actualExpression.evaluate() as AnyObject? #endif - failureMessage.actualValue = "\(identityAsString(actual))" - failureMessage.postfixMessage = "be identical to \(identityAsString(expected))" + + let bool: Bool #if os(Linux) - return actual === (expected as? AnyObject) && actual !== nil + bool = actual === (expected as? AnyObject) && actual !== nil #else - return actual === (expected as AnyObject?) && actual !== nil + bool = actual === (expected as AnyObject?) && actual !== nil #endif + return PredicateResult( + bool: bool, + message: .expectedCustomValueTo( + "be identical to \(identityAsString(expected))", + "\(identityAsString(actual))" + ) + ) } } @@ -30,13 +37,13 @@ public func !== (lhs: Expectation, rhs: Any?) { /// as the expected instance. /// /// Alias for "beIdenticalTo". -public func be(_ expected: Any?) -> NonNilMatcherFunc { +public func be(_ expected: Any?) -> Predicate { return beIdenticalTo(expected) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { + @objc public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let aExpr = actualExpression.cast { $0 as Any? } return try! beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift index 5bbbf36..8047efd 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift @@ -1,24 +1,24 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beLessThan(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" if let actual = try actualExpression.evaluate(), let expected = expectedValue { return actual < expected } return false - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual value is less than the expected value. -public func beLessThan(_ expectedValue: NMBComparable?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedAscending return matches - } + }.requireNonNil } public func <(lhs: Expectation, rhs: T) { @@ -29,9 +29,9 @@ public func < (lhs: Expectation, rhs: NMBComparable?) { lhs.to(beLessThan(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + @objc public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift index a0cd2f0..f9e9f4e 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift @@ -2,24 +2,24 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" if let actual = try actualExpression.evaluate(), let expected = expectedValue { return actual <= expected } return false - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. -public func beLessThanOrEqualTo(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" let actualValue = try actualExpression.evaluate() return actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedDescending - } + }.requireNonNil } public func <=(lhs: Expectation, rhs: T) { @@ -30,10 +30,10 @@ public func <=(lhs: Expectation, rhs: T) { lhs.to(beLessThanOrEqualTo(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil:false) { actualExpression, failureMessage in + @objc public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { + return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } return try! beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift index 49272a3..2b18b4c 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift @@ -72,37 +72,32 @@ extension UInt: ExpressibleByBooleanLiteral { } } -internal func matcherWithFailureMessage(_ matcher: NonNilMatcherFunc, postprocessor: @escaping (FailureMessage) -> Void) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - defer { postprocessor(failureMessage) } - return try matcher.matcher(actualExpression, failureMessage) - } +internal func rename(_ matcher: Predicate, failureMessage message: ExpectationMessage) -> Predicate { + return Predicate { actualExpression in + let result = try matcher.satisfies(actualExpression) + return PredicateResult(status: result.status, message: message) + }.requireNonNil } // MARK: beTrue() / beFalse() /// A Nimble matcher that succeeds when the actual value is exactly true. /// This matcher will not match against nils. -public func beTrue() -> NonNilMatcherFunc { - return matcherWithFailureMessage(equal(true)) { failureMessage in - failureMessage.postfixMessage = "be true" - } +public func beTrue() -> Predicate { + return rename(equal(true), failureMessage: .expectedActualValueTo("be true")) } /// A Nimble matcher that succeeds when the actual value is exactly false. /// This matcher will not match against nils. -public func beFalse() -> NonNilMatcherFunc { - return matcherWithFailureMessage(equal(false)) { failureMessage in - failureMessage.postfixMessage = "be false" - } +public func beFalse() -> Predicate { + return rename(equal(false), failureMessage: .expectedActualValueTo("be false")) } // MARK: beTruthy() / beFalsy() /// A Nimble matcher that succeeds when the actual value is not logically false. -public func beTruthy() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be truthy" +public func beTruthy() -> Predicate { + return Predicate.simpleNilable("be truthy") { actualExpression in let actualValue = try actualExpression.evaluate() if let actualValue = actualValue { // FIXME: This is a workaround to SR-2290. @@ -110,20 +105,19 @@ public func beTruthy() -> MatcherFun // - https://bugs.swift.org/browse/SR-2290 // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 if let number = actualValue as? NSNumber { - return number.boolValue == true + return PredicateStatus(bool: number.boolValue == true) } - return actualValue == (true as T) + return PredicateStatus(bool: actualValue == (true as T)) } - return actualValue != nil + return PredicateStatus(bool: actualValue != nil) } } /// A Nimble matcher that succeeds when the actual value is logically false. /// This matcher will match against nils. -public func beFalsy() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be falsy" +public func beFalsy() -> Predicate { + return Predicate.simpleNilable("be falsy") { actualExpression in let actualValue = try actualExpression.evaluate() if let actualValue = actualValue { // FIXME: This is a workaround to SR-2290. @@ -131,39 +125,39 @@ public func beFalsy() -> MatcherFunc // - https://bugs.swift.org/browse/SR-2290 // - https://github.com/norio-nomura/Nimble/pull/5#issuecomment-237835873 if let number = actualValue as? NSNumber { - return number.boolValue == false + return PredicateStatus(bool: number.boolValue == false) } - return actualValue == (false as T) + return PredicateStatus(bool: actualValue == (false as T)) } - return actualValue == nil + return PredicateStatus(bool: actualValue == nil) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beTruthyMatcher() -> NMBObjCMatcher { + @objc public class func beTruthyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beTruthy().matches(expr, failureMessage: failureMessage) } } - public class func beFalsyMatcher() -> NMBObjCMatcher { + @objc public class func beFalsyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beFalsy().matches(expr, failureMessage: failureMessage) } } - public class func beTrueMatcher() -> NMBObjCMatcher { + @objc public class func beTrueMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beTrue().matches(expr, failureMessage: failureMessage) } } - public class func beFalseMatcher() -> NMBObjCMatcher { + @objc public class func beFalseMatcher() -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } return try! beFalse().matches(expr, failureMessage: failureMessage) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift index a6fb31f..a22e0f4 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift @@ -1,17 +1,16 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is nil. -public func beNil() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be nil" +public func beNil() -> Predicate { + return Predicate.simpleNilable("be nil") { actualExpression in let actualValue = try actualExpression.evaluate() - return actualValue == nil + return PredicateStatus(bool: actualValue == nil) } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { + @objc public class func beNilMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in return try! beNil().matches(actualExpression, failureMessage: failureMessage) } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift index 92a8d43..a9dbc28 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift @@ -1,11 +1,10 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is Void. -public func beVoid() -> MatcherFunc<()> { - return MatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "be void" +public func beVoid() -> Predicate<()> { + return Predicate.simpleNilable("be void") { actualExpression in let actualValue: ()? = try actualExpression.evaluate() - return actualValue != nil + return PredicateStatus(bool: actualValue != nil) } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift index 31cbe5d..c2ab568 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift @@ -2,55 +2,52 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence's first element /// is equal to the expected value. -public func beginWith(_ startingElement: T) -> NonNilMatcherFunc +public func beginWith(_ startingElement: T) -> Predicate where S.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingElement)>" + return Predicate.simple("begin with <\(startingElement)>") { actualExpression in if let actualValue = try actualExpression.evaluate() { var actualGenerator = actualValue.makeIterator() - return actualGenerator.next() == startingElement + return PredicateStatus(bool: actualGenerator.next() == startingElement) } - return false + return .fail } } /// A Nimble matcher that succeeds when the actual collection's first element /// is equal to the expected object. -public func beginWith(_ startingElement: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingElement)>" - guard let collection = try actualExpression.evaluate() else { return false } - guard collection.count > 0 else { return false } +public func beginWith(_ startingElement: Any) -> Predicate { + return Predicate.simple("begin with <\(startingElement)>") { actualExpression in + guard let collection = try actualExpression.evaluate() else { return .fail } + guard collection.count > 0 else { return .doesNotMatch } #if os(Linux) guard let collectionValue = collection.object(at: 0) as? NSObject else { - return false + return .fail } #else let collectionValue = collection.object(at: 0) as AnyObject #endif - return collectionValue.isEqual(startingElement) + return PredicateStatus(bool: collectionValue.isEqual(startingElement)) } } /// A Nimble matcher that succeeds when the actual string contains expected substring /// where the expected substring's location is zero. -public func beginWith(_ startingSubstring: String) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "begin with <\(startingSubstring)>" +public func beginWith(_ startingSubstring: String) -> Predicate { + return Predicate.simple("begin with <\(startingSubstring)>") { actualExpression in if let actual = try actualExpression.evaluate() { let range = actual.range(of: startingSubstring) - return range != nil && range!.lowerBound == actual.startIndex + return PredicateStatus(bool: range != nil && range!.lowerBound == actual.startIndex) } - return false + return .fail } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { + @objc public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let actual = try! actualExpression.evaluate() - if let _ = actual as? String { + if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift index 5053642..f1afb72 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift @@ -1,14 +1,14 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence contains the expected value. -public func contain(_ items: T...) -> NonNilMatcherFunc +public func contain(_ items: T...) -> Predicate where S.Iterator.Element == T { return contain(items) } -public func contain(_ items: [T]) -> NonNilMatcherFunc +public func contain(_ items: [T]) -> Predicate where S.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" if let actual = try actualExpression.evaluate() { return items.all { @@ -16,16 +16,16 @@ public func contain(_ items: [T]) -> NonNilMatcherFun } } return false - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: String...) -> NonNilMatcherFunc { +public func contain(_ substrings: String...) -> Predicate { return contain(substrings) } -public func contain(_ substrings: [String]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func contain(_ substrings: [String]) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" if let actual = try actualExpression.evaluate() { return substrings.all { @@ -34,42 +34,42 @@ public func contain(_ substrings: [String]) -> NonNilMatcherFunc { } } return false - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual string contains the expected substring. -public func contain(_ substrings: NSString...) -> NonNilMatcherFunc { +public func contain(_ substrings: NSString...) -> Predicate { return contain(substrings) } -public func contain(_ substrings: [NSString]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func contain(_ substrings: [NSString]) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" if let actual = try actualExpression.evaluate() { return substrings.all { actual.range(of: $0.description).length != 0 } } return false - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual collection contains the expected object. -public func contain(_ items: Any?...) -> NonNilMatcherFunc { +public func contain(_ items: Any?...) -> Predicate { return contain(items) } -public func contain(_ items: [Any?]) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func contain(_ items: [Any?]) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" guard let actual = try actualExpression.evaluate() else { return false } return items.all { item in return item != nil && actual.contains(item!) } - } + }.requireNonNil } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { + @objc public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let location = actualExpression.location let actualValue = try! actualExpression.evaluate() @@ -83,6 +83,7 @@ extension NMBObjCMatcher { let expr = Expression(expression: ({ value as String }), location: location) return try! contain(expected as! [String]).matches(expr, failureMessage: failureMessage) } else if actualValue != nil { + // swiftlint:disable:next line_length failureMessage.postfixMessage = "contain <\(arrayAsString(expected))> (only works for NSArrays, NSSets, NSHashTables, and NSStrings)" } else { failureMessage.postfixMessage = "contain <\(arrayAsString(expected))>" diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift index ae8cca2..ae0d854 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift @@ -1,8 +1,8 @@ import Foundation -public func containElementSatisfying(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> NonNilMatcherFunc where S.Iterator.Element == T { +public func containElementSatisfying(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> Predicate where S.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.actualValue = nil if predicateDescription == "" { @@ -22,15 +22,16 @@ public func containElementSatisfying(_ predicate: @escaping ((T) } return false - } + }.requireNonNil } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBObjCMatcher { + @objc public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let value = try! actualExpression.evaluate() guard let enumeration = value as? NSFastEnumeration else { + // swiftlint:disable:next line_length failureMessage.postfixMessage = "containElementSatisfying must be provided an NSFastEnumeration object" failureMessage.actualValue = nil failureMessage.expected = "" @@ -38,7 +39,7 @@ public func containElementSatisfying(_ predicate: @escaping ((T) return false } - let iterator = NSFastEnumerationIterator(enumeration) + var iterator = NSFastEnumerationIterator(enumeration) while let item = iterator.next() { guard let object = item as? NSObject else { continue diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift index 00c7e20..a6f9f91 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift @@ -2,9 +2,9 @@ import Foundation /// A Nimble matcher that succeeds when the actual sequence's last element /// is equal to the expected value. -public func endWith(_ endingElement: T) -> NonNilMatcherFunc +public func endWith(_ endingElement: T) -> Predicate where S.Iterator.Element == T { - return NonNilMatcherFunc { actualExpression, failureMessage in + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "end with <\(endingElement)>" if let actualValue = try actualExpression.evaluate() { @@ -19,13 +19,13 @@ public func endWith(_ endingElement: T) -> NonNilMatc return lastItem == endingElement } return false - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual collection's last element /// is equal to the expected object. -public func endWith(_ endingElement: Any) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func endWith(_ endingElement: Any) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "end with <\(endingElement)>" guard let collection = try actualExpression.evaluate() else { return false } guard collection.count > 0 else { return false } @@ -38,28 +38,28 @@ public func endWith(_ endingElement: Any) -> NonNilMatcherFunc NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func endWith(_ endingSubstring: String) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in failureMessage.postfixMessage = "end with <\(endingSubstring)>" if let collection = try actualExpression.evaluate() { return collection.hasSuffix(endingSubstring) } return false - } + }.requireNonNil } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { + @objc public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let actual = try! actualExpression.evaluate() - if let _ = actual as? String { + if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift index 1dccfd0..ab457ca 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift @@ -4,18 +4,20 @@ import Foundation /// Values can support equal by supporting the Equatable protocol. /// /// @see beCloseTo if you want to match imprecise types (eg - floats, doubles). -public func equal(_ expectedValue: T?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +public func equal(_ expectedValue: T?) -> Predicate { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in let actualValue = try actualExpression.evaluate() let matches = actualValue == expectedValue && expectedValue != nil if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - return false + return PredicateResult(status: .fail, message: msg) } - return matches + return PredicateResult(status: PredicateStatus(bool: matches), message: msg) } } @@ -23,43 +25,60 @@ public func equal(_ expectedValue: T?) -> NonNilMatcherFunc { /// Values can support equal by supporting the Equatable protocol. /// /// @see beCloseTo if you want to match imprecise types (eg - floats, doubles). -public func equal(_ expectedValue: [T: C]?) -> NonNilMatcherFunc<[T: C]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +public func equal(_ expectedValue: [T: C]?) -> Predicate<[T: C]> { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in let actualValue = try actualExpression.evaluate() if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - return false + return PredicateResult(status: .fail, message: msg) } - return expectedValue! == actualValue! + return PredicateResult( + status: PredicateStatus(bool: expectedValue! == actualValue!), + message: msg + ) } } /// A Nimble matcher that succeeds when the actual collection is equal to the expected collection. /// Items must implement the Equatable protocol. -public func equal(_ expectedValue: [T]?) -> NonNilMatcherFunc<[T]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +public func equal(_ expectedValue: [T]?) -> Predicate<[T]> { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in let actualValue = try actualExpression.evaluate() if expectedValue == nil || actualValue == nil { - if expectedValue == nil { - failureMessage.postfixActual = " (use beNil() to match nils)" + if expectedValue == nil && actualValue != nil { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - return false + return PredicateResult( + status: .fail, + message: msg + ) } - return expectedValue! == actualValue! + return PredicateResult( + bool: expectedValue! == actualValue!, + message: msg + ) } } /// A Nimble matcher allowing comparison of collection with optional type -public func equal(_ expectedValue: [T?]) -> NonNilMatcherFunc<[T?]> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +public func equal(_ expectedValue: [T?]) -> Predicate<[T?]> { + return Predicate.define("equal <\(stringify(expectedValue))>") { actualExpression, msg in if let actualValue = try actualExpression.evaluate() { + let doesNotMatch = PredicateResult( + status: .doesNotMatch, + message: msg + ) + if expectedValue.count != actualValue.count { - return false + return doesNotMatch } for (index, item) in actualValue.enumerated() { @@ -67,30 +86,34 @@ public func equal(_ expectedValue: [T?]) -> NonNilMatcherFunc<[T?] if item == nil && otherItem == nil { continue } else if item == nil && otherItem != nil { - return false + return doesNotMatch } else if item != nil && otherItem == nil { - return false + return doesNotMatch } else if item! != otherItem! { - return false + return doesNotMatch } } - return true + return PredicateResult( + status: .matches, + message: msg + ) } else { - failureMessage.postfixActual = " (use beNil() to match nils)" + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) } - - return false } } /// A Nimble matcher that succeeds when the actual set is equal to the expected set. -public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc> { +public func equal(_ expectedValue: Set?) -> Predicate> { return equal(expectedValue, stringify: { stringify($0) }) } /// A Nimble matcher that succeeds when the actual set is equal to the expected set. -public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc> { +public func equal(_ expectedValue: Set?) -> Predicate> { return equal(expectedValue, stringify: { if let set = $0 { return stringify(Array(set).sorted { $0 < $1 }) @@ -100,33 +123,49 @@ public func equal(_ expectedValue: Set?) -> NonNilMatcherFunc< }) } -private func equal(_ expectedValue: Set?, stringify: @escaping (Set?) -> String) -> NonNilMatcherFunc> { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "equal <\(stringify(expectedValue))>" +private func equal(_ expectedValue: Set?, stringify: @escaping (Set?) -> String) -> Predicate> { + return Predicate { actualExpression in + var errorMessage: ExpectationMessage = + .expectedActualValueTo("equal <\(stringify(expectedValue))>") if let expectedValue = expectedValue { if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "<\(stringify(actualValue))>" + errorMessage = .expectedCustomValueTo( + "equal <\(stringify(expectedValue))>", + "<\(stringify(actualValue))>" + ) if expectedValue == actualValue { - return true + return PredicateResult( + status: .matches, + message: errorMessage + ) } let missing = expectedValue.subtracting(actualValue) if missing.count > 0 { - failureMessage.postfixActual += ", missing <\(stringify(missing))>" + errorMessage = errorMessage.appended(message: ", missing <\(stringify(missing))>") } let extra = actualValue.subtracting(expectedValue) if extra.count > 0 { - failureMessage.postfixActual += ", extra <\(stringify(extra))>" + errorMessage = errorMessage.appended(message: ", extra <\(stringify(extra))>") } + return PredicateResult( + status: .doesNotMatch, + message: errorMessage + ) } + return PredicateResult( + status: .fail, + message: errorMessage.appendedBeNilHint() + ) } else { - failureMessage.postfixActual = " (use beNil() to match nils)" + return PredicateResult( + status: .fail, + message: errorMessage.appendedBeNilHint() + ) } - - return false } } @@ -162,19 +201,19 @@ public func !=(lhs: Expectation>, rhs: Set?) { lhs.toNot(equal(rhs)) } -public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { +public func ==(lhs: Expectation<[T: C]>, rhs: [T: C]?) { lhs.to(equal(rhs)) } -public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { +public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { lhs.toNot(equal(rhs)) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! equal(expected).matches(actualExpression, failureMessage: failureMessage) + @objc public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { + return NMBPredicate { actualExpression in + return try! equal(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift index 5b24af2..93335a8 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift @@ -7,9 +7,10 @@ import Foundation /// A Nimble matcher that succeeds when the actual Collection's count equals /// the expected value -public func haveCount(_ expectedValue: T.IndexDistance) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func haveCount(_ expectedValue: T.IndexDistance) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in if let actualValue = try actualExpression.evaluate() { + // swiftlint:disable:next line_length failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" let result = expectedValue == actualValue.count failureMessage.actualValue = "\(actualValue.count)" @@ -18,14 +19,15 @@ public func haveCount(_ expectedValue: T.IndexDistance) -> NonNil } else { return false } - } + }.requireNonNil } /// A Nimble matcher that succeeds when the actual collection's count equals /// the expected value -public func haveCount(_ expectedValue: Int) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in +public func haveCount(_ expectedValue: Int) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in if let actualValue = try actualExpression.evaluate() { + // swiftlint:disable:next line_length failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" let result = expectedValue == actualValue.count failureMessage.actualValue = "\(actualValue.count)" @@ -37,9 +39,9 @@ public func haveCount(_ expectedValue: Int) -> MatcherFunc { } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { + @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let location = actualExpression.location let actualValue = try! actualExpression.evaluate() diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift index 7e80331..96e7a82 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift @@ -2,27 +2,26 @@ import Foundation /// A Nimble matcher that succeeds when the actual string satisfies the regular expression /// described by the expected string. -public func match(_ expectedValue: String?) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in - failureMessage.postfixMessage = "match <\(stringify(expectedValue))>" - +public func match(_ expectedValue: String?) -> Predicate { + return Predicate.simple("match <\(stringify(expectedValue))>") { actualExpression in if let actual = try actualExpression.evaluate() { if let regexp = expectedValue { - return actual.range(of: regexp, options: .regularExpression) != nil + let bool = actual.range(of: regexp, options: .regularExpression) != nil + return PredicateStatus(bool: bool) } } - return false + return .fail } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func matchMatcher(_ expected: NSString) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func matchMatcher(_ expected: NSString) -> NMBMatcher { + return NMBPredicate { actualExpression in let actual = actualExpression.cast { $0 as? String } - return try! match(expected.description).matches(actual, failureMessage: failureMessage) + return try! match(expected.description).satisfies(actual).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift index 2092cb6..9c86fb7 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift @@ -1,26 +1,58 @@ import Foundation +/// A Nimble matcher that succeeds when the actual expression evaluates to an +/// error from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparison by _domain and _code. +public func matchError(_ error: T) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + let actualError: Error? = try actualExpression.evaluate() + + setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) + var matches = false + if let actualError = actualError, errorMatchesExpectedError(actualError, expectedError: error) { + matches = true + } + return matches + }.requireNonNil +} + /// A Nimble matcher that succeeds when the actual expression evaluates to an /// error from the specified case. /// /// Errors are tried to be compared by their implementation of Equatable, /// otherwise they fallback to comparision by _domain and _code. -public func matchError(_ error: T) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func matchError(_ error: T) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in let actualError: Error? = try actualExpression.evaluate() setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error) - } + + var matches = false + if let actualError = actualError as? T, error == actualError { + matches = true + } + return matches + }.requireNonNil } /// A Nimble matcher that succeeds when the actual expression evaluates to an /// error of the specified type -public func matchError(_ errorType: T.Type) -> NonNilMatcherFunc { - return NonNilMatcherFunc { actualExpression, failureMessage in +public func matchError(_ errorType: T.Type) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in let actualError: Error? = try actualExpression.evaluate() - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, errorType: errorType) - return errorMatchesNonNilFieldsOrClosure(actualError, errorType: errorType) - } + setFailureMessageForError( + failureMessage, + postfixMessageVerb: "match", + actualError: actualError, + errorType: errorType + ) + var matches = false + if actualError as? T != nil { + matches = true + } + return matches + }.requireNonNil } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift index 02d3245..abcafa9 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherFunc.swift @@ -1,14 +1,15 @@ -/// A convenience API to build matchers that don't need special negation +/// DEPRECATED: A convenience API to build matchers that don't need special negation /// behavior. The toNot() behavior is the negation of to(). /// /// @see NonNilMatcherFunc if you prefer to have this matcher fail when nil -/// values are recieved in an expectation. +/// values are received in an expectation. /// /// You may use this when implementing your own custom matchers. /// /// Use the Matcher protocol instead of this type to accept custom matchers as /// input parameters. /// @see allPass for an example that uses accepts other matchers as input. +@available(*, deprecated, message: "Use to Predicate instead") public struct MatcherFunc: Matcher { public let matcher: (Expression, FailureMessage) throws -> Bool @@ -23,9 +24,16 @@ public struct MatcherFunc: Matcher { public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { return try !matcher(actualExpression, failureMessage) } + + /// Compatibility layer to new Matcher API. Converts an old-style matcher to a new one. + /// Note: You should definitely spend the time to convert to the new api as soon as possible + /// since this struct type is deprecated. + public var predicate: Predicate { + return Predicate.fromDeprecatedMatcher(self) + } } -/// A convenience API to build matchers that don't need special negation +/// DEPRECATED: A convenience API to build matchers that don't need special negation /// behavior. The toNot() behavior is the negation of to(). /// /// Unlike MatcherFunc, this will always fail if an expectation contains nil. @@ -36,6 +44,7 @@ public struct MatcherFunc: Matcher { /// Use the Matcher protocol instead of this type to accept custom matchers as /// input parameters. /// @see allPass for an example that uses accepts other matchers as input. +@available(*, deprecated, message: "Use to Predicate instead") public struct NonNilMatcherFunc: Matcher { public let matcher: (Expression, FailureMessage) throws -> Bool @@ -66,4 +75,11 @@ public struct NonNilMatcherFunc: Matcher { } return false } + + /// Compatibility layer to new Matcher API. Converts an old-style matcher to a new one. + /// Note: You should definitely spend the time to convert to the new api as soon as possible + /// since this struct type is deprecated. + public var predicate: Predicate { + return Predicate.fromDeprecatedMatcher(self) + } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift index 3f27ec1..6f8f103 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift @@ -1,85 +1,86 @@ import Foundation // `CGFloat` is in Foundation (swift-corelibs-foundation) on Linux. -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) import CoreGraphics #endif /// Implement this protocol to implement a custom matcher for Swift +@available(*, deprecated, message: "Use Predicate instead") public protocol Matcher { associatedtype ValueType func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool } -#if _runtime(_ObjC) +extension Matcher { + var predicate: Predicate { + return Predicate.fromDeprecatedMatcher(self) + } + + var toClosure: (Expression, FailureMessage, Bool) throws -> Bool { + return ({ expr, msg, expectedResult in + if expectedResult { + return try self.matches(expr, failureMessage: msg) + } else { + return try self.doesNotMatch(expr, failureMessage: msg) + } + }) + } +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) /// Objective-C interface to the Swift variant of Matcher. @objc public protocol NMBMatcher { - func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool - func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool + func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool + func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool } #endif -#if _runtime(_ObjC) /// Protocol for types that support contain() matcher. -@objc public protocol NMBContainer { - @objc(containsObject:) +public protocol NMBContainer { func contains(_ anObject: Any) -> Bool } +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) // FIXME: NSHashTable can not conform to NMBContainer since swift-DEVELOPMENT-SNAPSHOT-2016-04-25-a //extension NSHashTable : NMBContainer {} // Corelibs Foundation does not include this class yet -#else -public protocol NMBContainer { - func contains(_ anObject: Any) -> Bool -} #endif -extension NSArray : NMBContainer {} -extension NSSet : NMBContainer {} +extension NSArray: NMBContainer {} +extension NSSet: NMBContainer {} -#if _runtime(_ObjC) /// Protocol for types that support only beEmpty(), haveCount() matchers -@objc public protocol NMBCollection { - var count: Int { get } -} - -extension NSHashTable : NMBCollection {} // Corelibs Foundation does not include these classes yet -extension NSMapTable : NMBCollection {} -#else public protocol NMBCollection { var count: Int { get } } + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +extension NSHashTable: NMBCollection {} // Corelibs Foundation does not include these classes yet +extension NSMapTable: NMBCollection {} #endif -extension NSSet : NMBCollection {} -extension NSIndexSet : NMBCollection {} -extension NSDictionary : NMBCollection {} +extension NSSet: NMBCollection {} +extension NSIndexSet: NMBCollection {} +extension NSDictionary: NMBCollection {} -#if _runtime(_ObjC) /// Protocol for types that support beginWith(), endWith(), beEmpty() matchers -@objc public protocol NMBOrderedCollection: NMBCollection { - @objc(objectAtIndex:) - func object(at index: Int) -> Any -} -#else public protocol NMBOrderedCollection: NMBCollection { func object(at index: Int) -> Any } -#endif -extension NSArray : NMBOrderedCollection {} +extension NSArray: NMBOrderedCollection {} public protocol NMBDoubleConvertible { var doubleValue: CDouble { get } } -extension Double : NMBDoubleConvertible { +extension Double: NMBDoubleConvertible { public var doubleValue: CDouble { return self } } -extension Float : NMBDoubleConvertible { +extension Float: NMBDoubleConvertible { public var doubleValue: CDouble { return CDouble(self) } @@ -91,7 +92,7 @@ extension CGFloat: NMBDoubleConvertible { } } -extension NSNumber : NMBDoubleConvertible { +extension NSNumber: NMBDoubleConvertible { } private let dateFormatter: DateFormatter = { @@ -130,7 +131,7 @@ extension NSDate: TestOutputStringConvertible { /// beGreaterThan(), beGreaterThanOrEqualTo(), and equal() matchers. /// /// Types that conform to Swift's Comparable protocol will work implicitly too -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc public protocol NMBComparable { func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult } @@ -141,12 +142,12 @@ public protocol NMBComparable { } #endif -extension NSNumber : NMBComparable { +extension NSNumber: NMBComparable { public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { return compare(otherObject as! NSNumber) } } -extension NSString : NMBComparable { +extension NSString: NMBComparable { public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { return compare(otherObject as! String) } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift index ac8ee5a..ee886f1 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift @@ -1,9 +1,36 @@ import Foundation +// A workaround to SR-6419. +extension NotificationCenter { +#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) + #if swift(>=4.0) + #if swift(>=4.0.2) + #else + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif + #elseif swift(>=3.2) + #if swift(>=3.2.2) + #else + // swiftlint:disable:next line_length + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif + #else + // swiftlint:disable:next line_length + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif +#endif +} + internal class NotificationCollector { private(set) var observedNotifications: [Notification] private let notificationCenter: NotificationCenter - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) private var token: AnyObject? #else private var token: NSObjectProtocol? @@ -15,14 +42,15 @@ internal class NotificationCollector { } func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { [weak self] n in + // swiftlint:disable:next line_length + self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil, using: { [weak self] n in // linux-swift gets confused by .append(n) self?.observedNotifications.append(n) - } + }) } deinit { - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) if let token = self.token { self.notificationCenter.removeObserver(token) } @@ -36,19 +64,17 @@ internal class NotificationCollector { private let mainThread = pthread_self() -let notificationCenterDefault = NotificationCenter.default - public func postNotifications( _ notificationsMatcher: T, - fromNotificationCenter center: NotificationCenter = notificationCenterDefault) - -> MatcherFunc + fromNotificationCenter center: NotificationCenter = .default) + -> Predicate where T: Matcher, T.ValueType == [Notification] { - let _ = mainThread // Force lazy-loading of this value + _ = mainThread // Force lazy-loading of this value let collector = NotificationCollector(notificationCenter: center) collector.startObserving() var once: Bool = false - return MatcherFunc { actualExpression, failureMessage in + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in let collectorNotificationsExpression = Expression(memoizedExpression: { _ in return collector.observedNotifications }, location: actualExpression.location, withoutCaching: true) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift new file mode 100644 index 0000000..f812344 --- /dev/null +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift @@ -0,0 +1,348 @@ +// New Matcher API +// +import Foundation + +/// A Predicate is part of the new matcher API that provides assertions to expectations. +/// +/// Given a code snippet: +/// +/// expect(1).to(equal(2)) +/// ^^^^^^^^ +/// Called a "matcher" +/// +/// A matcher consists of two parts a constructor function and the Predicate. The term Predicate +/// is used as a separate name from Matcher to help transition custom matchers to the new Nimble +/// matcher API. +/// +/// The Predicate provide the heavy lifting on how to assert against a given value. Internally, +/// predicates are simple wrappers around closures to provide static type information and +/// allow composition and wrapping of existing behaviors. +public struct Predicate { + fileprivate var matcher: (Expression) throws -> PredicateResult + + /// Constructs a predicate that knows how take a given value + public init(_ matcher: @escaping (Expression) throws -> PredicateResult) { + self.matcher = matcher + } + + /// Uses a predicate on a given value to see if it passes the predicate. + /// + /// @param expression The value to run the predicate's logic against + /// @returns A predicate result indicate passing or failing and an associated error message. + public func satisfies(_ expression: Expression) throws -> PredicateResult { + return try matcher(expression) + } +} + +/// Provides convenience helpers to defining predicates +extension Predicate { + /// Like Predicate() constructor, but automatically guard against nil (actual) values + public static func define(matcher: @escaping (Expression) throws -> PredicateResult) -> Predicate { + return Predicate { actual in + return try matcher(actual) + }.requireNonNil + } + + /// Defines a predicate with a default message that can be returned in the closure + /// Also ensures the predicate's actual value cannot pass with `nil` given. + public static func define(_ msg: String, matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { + return Predicate { actual in + return try matcher(actual, .expectedActualValueTo(msg)) + }.requireNonNil + } + + /// Defines a predicate with a default message that can be returned in the closure + /// Unlike `define`, this allows nil values to succeed if the given closure chooses to. + public static func defineNilable(_ msg: String, matcher: @escaping (Expression, ExpectationMessage) throws -> PredicateResult) -> Predicate { + return Predicate { actual in + return try matcher(actual, .expectedActualValueTo(msg)) + } + } +} + +extension Predicate { + /// Provides a simple predicate definition that provides no control over the predefined + /// error message. + /// + /// Also ensures the predicate's actual value cannot pass with `nil` given. + public static func simple(_ msg: String, matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { + return Predicate { actual in + return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(msg)) + }.requireNonNil + } + + /// Provides a simple predicate definition that provides no control over the predefined + /// error message. + /// + /// Unlike `simple`, this allows nil values to succeed if the given closure chooses to. + public static func simpleNilable(_ msg: String, matcher: @escaping (Expression) throws -> PredicateStatus) -> Predicate { + return Predicate { actual in + return PredicateResult(status: try matcher(actual), message: .expectedActualValueTo(msg)) + } + } +} + +// The Expectation style intended for comparison to a PredicateStatus. +public enum ExpectationStyle { + case toMatch, toNotMatch +} + +/// The value that a Predicates return to describe if the given (actual) value matches the +/// predicate. +public struct PredicateResult { + /// Status indicates if the predicate matches, does not match, or fails. + public var status: PredicateStatus + /// The error message that can be displayed if it does not match + public var message: ExpectationMessage + + /// Constructs a new PredicateResult with a given status and error message + public init(status: PredicateStatus, message: ExpectationMessage) { + self.status = status + self.message = message + } + + /// Shorthand to PredicateResult(status: PredicateStatus(bool: bool), message: message) + public init(bool: Bool, message: ExpectationMessage) { + self.status = PredicateStatus(bool: bool) + self.message = message + } + + /// Converts the result to a boolean based on what the expectation intended + public func toBoolean(expectation style: ExpectationStyle) -> Bool { + return status.toBoolean(expectation: style) + } +} + +/// PredicateStatus is a trinary that indicates if a Predicate matches a given value or not +public enum PredicateStatus { + /// Matches indicates if the predicate / matcher passes with the given value + /// + /// For example, `equals(1)` returns `.matches` for `expect(1).to(equal(1))`. + case matches + /// DoesNotMatch indicates if the predicate / matcher fails with the given value, but *would* + /// succeed if the expectation was inverted. + /// + /// For example, `equals(2)` returns `.doesNotMatch` for `expect(1).toNot(equal(2))`. + case doesNotMatch + /// Fail indicates the predicate will never satisfy with the given value in any case. + /// A perfect example is that most matchers fail whenever given `nil`. + /// + /// Using `equal(1)` fails both `expect(nil).to(equal(1))` and `expect(nil).toNot(equal(1))`. + /// Note: Predicate's `requireNonNil` property will also provide this feature mostly for free. + /// Your predicate will still need to guard against nils, but error messaging will be + /// handled for you. + case fail + + /// Converts a boolean to either .matches (if true) or .doesNotMatch (if false). + public init(bool matches: Bool) { + if matches { + self = .matches + } else { + self = .doesNotMatch + } + } + + private func shouldMatch() -> Bool { + switch self { + case .matches: return true + case .doesNotMatch, .fail: return false + } + } + + private func shouldNotMatch() -> Bool { + switch self { + case .doesNotMatch: return true + case .matches, .fail: return false + } + } + + /// Converts the PredicateStatus result to a boolean based on what the expectation intended + internal func toBoolean(expectation style: ExpectationStyle) -> Bool { + if style == .toMatch { + return shouldMatch() + } else { + return shouldNotMatch() + } + } +} + +// Backwards compatibility until Old Matcher API removal +extension Predicate: Matcher { + /// Compatibility layer for old Matcher API, deprecated + public static func fromDeprecatedFullClosure(_ matcher: @escaping (Expression, FailureMessage, Bool) throws -> Bool) -> Predicate { + return Predicate { actual in + let failureMessage = FailureMessage() + let result = try matcher(actual, failureMessage, true) + return PredicateResult( + status: PredicateStatus(bool: result), + message: failureMessage.toExpectationMessage() + ) + } + } + + /// Compatibility layer for old Matcher API, deprecated. + /// Emulates the MatcherFunc API + public static func fromDeprecatedClosure(_ matcher: @escaping (Expression, FailureMessage) throws -> Bool) -> Predicate { + return Predicate { actual in + let failureMessage = FailureMessage() + let result = try matcher(actual, failureMessage) + return PredicateResult( + status: PredicateStatus(bool: result), + message: failureMessage.toExpectationMessage() + ) + } + + } + + /// Compatibility layer for old Matcher API, deprecated. + /// Same as calling .predicate on a MatcherFunc or NonNilMatcherFunc type. + public static func fromDeprecatedMatcher(_ matcher: M) -> Predicate where M: Matcher, M.ValueType == T { + return self.fromDeprecatedFullClosure(matcher.toClosure) + } + + /// Deprecated Matcher API, use satisfies(_:_) instead + public func matches(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { + let result = try satisfies(actualExpression) + result.message.update(failureMessage: failureMessage) + return result.toBoolean(expectation: .toMatch) + } + + /// Deprecated Matcher API, use satisfies(_:_) instead + public func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) throws -> Bool { + let result = try satisfies(actualExpression) + result.message.update(failureMessage: failureMessage) + return result.toBoolean(expectation: .toNotMatch) + } +} + +extension Predicate { + // Someday, make this public? Needs documentation + internal func after(f: @escaping (Expression, PredicateResult) throws -> PredicateResult) -> Predicate { + return Predicate { actual -> PredicateResult in + let result = try self.satisfies(actual) + return try f(actual, result) + } + } + + /// Returns a new Predicate based on the current one that always fails if nil is given as + /// the actual value. + /// + /// This replaces `NonNilMatcherFunc`. + public var requireNonNil: Predicate { + return after { actual, result in + if try actual.evaluate() == nil { + return PredicateResult( + status: .fail, + message: result.message.appendedBeNilHint() + ) + } + return result + } + } +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +public typealias PredicateBlock = (_ actualExpression: Expression) -> NMBPredicateResult + +public class NMBPredicate: NSObject { + private let predicate: PredicateBlock + + public init(predicate: @escaping PredicateBlock) { + self.predicate = predicate + } + + func satisfies(_ expression: @escaping () -> NSObject?, location: SourceLocation) -> NMBPredicateResult { + let expr = Expression(expression: expression, location: location) + return self.predicate(expr) + } +} + +extension NMBPredicate: NMBMatcher { + public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + let result = satisfies(actualBlock, location: location).toSwift() + result.message.update(failureMessage: failureMessage) + return result.status.toBoolean(expectation: .toMatch) + } + + public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + let result = satisfies(actualBlock, location: location).toSwift() + result.message.update(failureMessage: failureMessage) + return result.status.toBoolean(expectation: .toNotMatch) + } +} + +final public class NMBPredicateResult: NSObject { + public var status: NMBPredicateStatus + public var message: NMBExpectationMessage + + public init(status: NMBPredicateStatus, message: NMBExpectationMessage) { + self.status = status + self.message = message + } + + public init(bool success: Bool, message: NMBExpectationMessage) { + self.status = NMBPredicateStatus.from(bool: success) + self.message = message + } + + public func toSwift() -> PredicateResult { + return PredicateResult(status: status.toSwift(), + message: message.toSwift()) + } +} + +extension PredicateResult { + public func toObjectiveC() -> NMBPredicateResult { + return NMBPredicateResult(status: status.toObjectiveC(), message: message.toObjectiveC()) + } +} + +final public class NMBPredicateStatus: NSObject { + private let status: Int + private init(status: Int) { + self.status = status + } + + public static let matches: NMBPredicateStatus = NMBPredicateStatus(status: 0) + public static let doesNotMatch: NMBPredicateStatus = NMBPredicateStatus(status: 1) + public static let fail: NMBPredicateStatus = NMBPredicateStatus(status: 2) + + public override var hashValue: Int { return self.status.hashValue } + + public override func isEqual(_ object: Any?) -> Bool { + guard let otherPredicate = object as? NMBPredicateStatus else { + return false + } + return self.status == otherPredicate.status + } + + public static func from(status: PredicateStatus) -> NMBPredicateStatus { + switch status { + case .matches: return self.matches + case .doesNotMatch: return self.doesNotMatch + case .fail: return self.fail + } + } + + public static func from(bool success: Bool) -> NMBPredicateStatus { + return self.from(status: PredicateStatus(bool: success)) + } + + public func toSwift() -> PredicateStatus { + switch status { + case NMBPredicateStatus.matches.status: return .matches + case NMBPredicateStatus.doesNotMatch.status: return .doesNotMatch + case NMBPredicateStatus.fail.status: return .fail + default: + internalError("Unhandle status for NMBPredicateStatus") + } + } +} + +extension PredicateStatus { + public func toObjectiveC() -> NMBPredicateStatus { + return NMBPredicateStatus.from(status: self) + } +} + +#endif diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift index c898c3b..3e7f2df 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift @@ -1,7 +1,7 @@ import Foundation -// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager -#if _runtime(_ObjC) && !SWIFT_PACKAGE +// This matcher requires the Objective-C, and being built by Xcode rather than the Swift Package Manager +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE /// A Nimble matcher that succeeds when the actual expression raises an /// exception with the specified name, reason, and/or userInfo. @@ -16,8 +16,8 @@ public func raiseException( named: String? = nil, reason: String? = nil, userInfo: NSDictionary? = nil, - closure: ((NSException) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in + closure: ((NSException) -> Void)? = nil) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in var exception: NSException? let capture = NMBExceptionCapture(handler: ({ e in @@ -29,11 +29,25 @@ public func raiseException( return } - setFailureMessageForException(failureMessage, exception: exception, named: named, reason: reason, userInfo: userInfo, closure: closure) - return exceptionMatchesNonNilFieldsOrClosure(exception, named: named, reason: reason, userInfo: userInfo, closure: closure) + setFailureMessageForException( + failureMessage, + exception: exception, + named: named, + reason: reason, + userInfo: userInfo, + closure: closure + ) + return exceptionMatchesNonNilFieldsOrClosure( + exception, + named: named, + reason: reason, + userInfo: userInfo, + closure: closure + ) } } +// swiftlint:disable:next function_parameter_count internal func setFailureMessageForException( _ failureMessage: FailureMessage, exception: NSException?, @@ -52,7 +66,7 @@ internal func setFailureMessageForException( if let userInfo = userInfo { failureMessage.postfixMessage += " with userInfo <\(userInfo)>" } - if let _ = closure { + if closure != nil { failureMessage.postfixMessage += " that satisfies block" } if named == nil && reason == nil && userInfo == nil && closure == nil { @@ -60,6 +74,7 @@ internal func setFailureMessageForException( } if let exception = exception { + // swiftlint:disable:next line_length failureMessage.actualValue = "\(String(describing: type(of: exception))) { name=\(exception.name), reason='\(stringify(exception.reason))', userInfo=\(stringify(exception.userInfo)) }" } else { failureMessage.actualValue = "no exception" @@ -114,7 +129,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { _block = block } - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let block: () -> Any? = ({ _ = actualBlock(); return nil }) let expr = Expression(expression: block, location: location) @@ -126,11 +141,11 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { ).matches(expr, failureMessage: failureMessage) } - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { return !matches(actualBlock, failureMessage: failureMessage, location: location) } - public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { + @objc public var named: (_ name: String) -> NMBObjCRaiseExceptionMatcher { return ({ name in return NMBObjCRaiseExceptionMatcher( name: name, @@ -141,7 +156,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { }) } - public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { + @objc public var reason: (_ reason: String?) -> NMBObjCRaiseExceptionMatcher { return ({ reason in return NMBObjCRaiseExceptionMatcher( name: self._name, @@ -152,7 +167,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { }) } - public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { + @objc public var userInfo: (_ userInfo: NSDictionary?) -> NMBObjCRaiseExceptionMatcher { return ({ userInfo in return NMBObjCRaiseExceptionMatcher( name: self._name, @@ -163,7 +178,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { }) } - public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { + @objc public var satisfyingBlock: (_ block: ((NSException) -> Void)?) -> NMBObjCRaiseExceptionMatcher { return ({ block in return NMBObjCRaiseExceptionMatcher( name: self._name, @@ -176,7 +191,7 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { } extension NMBObjCMatcher { - public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { + @objc public class func raiseExceptionMatcher() -> NMBObjCRaiseExceptionMatcher { return NMBObjCRaiseExceptionMatcher(name: nil, reason: nil, userInfo: nil, block: nil) } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift new file mode 100644 index 0000000..6c63a15 --- /dev/null +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift @@ -0,0 +1,101 @@ +import Foundation + +/// A Nimble matcher that succeeds when the actual value matches with all of the matchers +/// provided in the variable list of matchers. +public func satisfyAllOf(_ matchers: U...) -> Predicate + where U: Matcher, U.ValueType == T { + return satisfyAllOf(matchers) +} + +/// Deprecated. Please use `satisfyAnyOf(_) -> Predicate` instead. +internal func satisfyAllOf(_ matchers: [U]) -> Predicate + where U: Matcher, U.ValueType == T { + return NonNilMatcherFunc { actualExpression, failureMessage in + let postfixMessages = NSMutableArray() + var matches = true + for matcher in matchers { + if try matcher.doesNotMatch(actualExpression, failureMessage: failureMessage) { + matches = false + } + postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) + } + + failureMessage.postfixMessage = "match all of: " + postfixMessages.componentsJoined(by: ", and ") + if let actualValue = try actualExpression.evaluate() { + failureMessage.actualValue = "\(actualValue)" + } + + return matches + }.predicate +} + +internal func satisfyAllOf(_ predicates: [Predicate]) -> Predicate { + return Predicate { actualExpression in + var postfixMessages = [String]() + var matches = true + for predicate in predicates { + let result = try predicate.satisfies(actualExpression) + if result.toBoolean(expectation: .toNotMatch) { + matches = false + } + postfixMessages.append("{\(result.message.expectedMessage)}") + } + + var msg: ExpectationMessage + if let actualValue = try actualExpression.evaluate() { + msg = .expectedCustomValueTo( + "match all of: " + postfixMessages.joined(separator: ", and "), + "\(actualValue)" + ) + } else { + msg = .expectedActualValueTo( + "match all of: " + postfixMessages.joined(separator: ", and ") + ) + } + + return PredicateResult( + bool: matches, + message: msg + ) + }.requireNonNil +} + +public func && (left: Predicate, right: Predicate) -> Predicate { + return satisfyAllOf(left, right) +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +extension NMBObjCMatcher { + @objc public class func satisfyAllOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { + return NMBPredicate { actualExpression in + if matchers.isEmpty { + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + fail: "satisfyAllOf must be called with at least one matcher" + ) + ) + } + + var elementEvaluators = [Predicate]() + for matcher in matchers { + let elementEvaluator = Predicate { expression in + if let predicate = matcher as? NMBPredicate { + // swiftlint:disable:next line_length + return predicate.satisfies({ try! expression.evaluate() }, location: actualExpression.location).toSwift() + } else { + let failureMessage = FailureMessage() + // swiftlint:disable:next line_length + let success = matcher.matches({ try! expression.evaluate() }, failureMessage: failureMessage, location: actualExpression.location) + return PredicateResult(bool: success, message: failureMessage.toExpectationMessage()) + } + } + + elementEvaluators.append(elementEvaluator) + } + + return try! satisfyAllOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() + } + } +} +#endif diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift index b2817cc..d02a0ff 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift @@ -1,61 +1,108 @@ import Foundation /// A Nimble matcher that succeeds when the actual value matches with any of the matchers -/// provided in the variable list of matchers. -public func satisfyAnyOf(_ matchers: U...) -> NonNilMatcherFunc +/// provided in the variable list of matchers. +public func satisfyAnyOf(_ matchers: U...) -> Predicate where U: Matcher, U.ValueType == T { return satisfyAnyOf(matchers) } -internal func satisfyAnyOf(_ matchers: [U]) -> NonNilMatcherFunc +/// Deprecated. Please use `satisfyAnyOf(_) -> Predicate` instead. +internal func satisfyAnyOf(_ matchers: [U]) -> Predicate where U: Matcher, U.ValueType == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - let postfixMessages = NSMutableArray() - var matches = false - for matcher in matchers { - if try matcher.matches(actualExpression, failureMessage: failureMessage) { - matches = true + return NonNilMatcherFunc { actualExpression, failureMessage in + let postfixMessages = NSMutableArray() + var matches = false + for matcher in matchers { + if try matcher.matches(actualExpression, failureMessage: failureMessage) { + matches = true + } + postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) } - postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) - } - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" - } + failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") + if let actualValue = try actualExpression.evaluate() { + failureMessage.actualValue = "\(actualValue)" + } - return matches - } + return matches + }.predicate +} + +internal func satisfyAnyOf(_ predicates: [Predicate]) -> Predicate { + return Predicate { actualExpression in + var postfixMessages = [String]() + var matches = false + for predicate in predicates { + let result = try predicate.satisfies(actualExpression) + if result.toBoolean(expectation: .toMatch) { + matches = true + } + postfixMessages.append("{\(result.message.expectedMessage)}") + } + + var msg: ExpectationMessage + if let actualValue = try actualExpression.evaluate() { + msg = .expectedCustomValueTo( + "match one of: " + postfixMessages.joined(separator: ", or "), + "\(actualValue)" + ) + } else { + msg = .expectedActualValueTo( + "match one of: " + postfixMessages.joined(separator: ", or ") + ) + } + + return PredicateResult( + status: PredicateStatus(bool: matches), + message: msg + ) + }.requireNonNil +} + +public func || (left: Predicate, right: Predicate) -> Predicate { + return satisfyAnyOf(left, right) } -public func || (left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> NonNilMatcherFunc { +public func || (left: NonNilMatcherFunc, right: NonNilMatcherFunc) -> Predicate { return satisfyAnyOf(left, right) } -public func || (left: MatcherFunc, right: MatcherFunc) -> NonNilMatcherFunc { +public func || (left: MatcherFunc, right: MatcherFunc) -> Predicate { return satisfyAnyOf(left, right) } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { - public class func satisfyAnyOfMatcher(_ matchers: [NMBObjCMatcher]) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + @objc public class func satisfyAnyOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { + return NMBPredicate { actualExpression in if matchers.isEmpty { - failureMessage.stringValue = "satisfyAnyOf must be called with at least one matcher" - return false + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + fail: "satisfyAnyOf must be called with at least one matcher" + ) + ) } - var elementEvaluators = [NonNilMatcherFunc]() + var elementEvaluators = [Predicate]() for matcher in matchers { - let elementEvaluator: (Expression, FailureMessage) -> Bool = { - expression, failureMessage in - return matcher.matches({try! expression.evaluate()}, failureMessage: failureMessage, location: actualExpression.location) + let elementEvaluator = Predicate { expression in + if let predicate = matcher as? NMBPredicate { + // swiftlint:disable:next line_length + return predicate.satisfies({ try! expression.evaluate() }, location: actualExpression.location).toSwift() + } else { + let failureMessage = FailureMessage() + // swiftlint:disable:next line_length + let success = matcher.matches({ try! expression.evaluate() }, failureMessage: failureMessage, location: actualExpression.location) + return PredicateResult(bool: success, message: failureMessage.toExpectationMessage()) + } } - elementEvaluators.append(NonNilMatcherFunc(elementEvaluator)) + elementEvaluators.append(elementEvaluator) } - return try! satisfyAnyOf(elementEvaluators).matches(actualExpression, failureMessage: failureMessage) + return try! satisfyAnyOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift index c847a1a..a530c60 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift @@ -1,8 +1,8 @@ import Foundation -public func throwAssertion() -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - #if arch(x86_64) && _runtime(_ObjC) && !SWIFT_PACKAGE +public func throwAssertion() -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + #if arch(x86_64) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE failureMessage.postfixMessage = "throw an assertion" failureMessage.actualValue = nil @@ -49,7 +49,8 @@ public func throwAssertion() -> MatcherFunc { #else fatalError("The throwAssertion Nimble matcher can only run on x86_64 platforms with " + "Objective-C (e.g. Mac, iPhone 5s or later simulators). You can silence this error " + - "by placing the test case inside an #if arch(x86_64) or _runtime(_ObjC) conditional statement") + "by placing the test case inside an #if arch(x86_64) or (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) conditional statement") + // swiftlint:disable:previous line_length #endif } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift index 151eb9a..872ca5c 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift @@ -1,5 +1,36 @@ import Foundation +/// A Nimble matcher that succeeds when the actual expression throws an +/// error of the specified type or from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparison by _domain and _code. +/// +/// Alternatively, you can pass a closure to do any arbitrary custom matching +/// to the thrown error. The closure only gets called when an error was thrown. +/// +/// nil arguments indicates that the matcher should not attempt to match against +/// that parameter. +public func throwError() -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + failureMessage.postfixMessage = "throw any error" + if let actualError = actualError { + failureMessage.actualValue = "<\(actualError)>" + } else { + failureMessage.actualValue = "no error" + } + return actualError != nil + } +} + /// A Nimble matcher that succeeds when the actual expression throws an /// error of the specified type or from the specified case. /// @@ -11,22 +42,149 @@ import Foundation /// /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. -public func throwError( - _ error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var actualError: Error? - do { - _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError +public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + setFailureMessageForError( + failureMessage, + actualError: actualError, + error: error, + errorType: nil, + closure: closure + ) + var matches = false + if let actualError = actualError, errorMatchesExpectedError(actualError, expectedError: error) { + matches = true + if let closure = closure { + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if messages.count > 0 { + matches = false + } } + } + return matches + } +} + +/// A Nimble matcher that succeeds when the actual expression throws an +/// error of the specified type or from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparision by _domain and _code. +/// +/// Alternatively, you can pass a closure to do any arbitrary custom matching +/// to the thrown error. The closure only gets called when an error was thrown. +/// +/// nil arguments indicates that the matcher should not attempt to match against +/// that parameter. +public func throwError(_ error: T, closure: ((T) -> Void)? = nil) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + setFailureMessageForError( + failureMessage, + actualError: actualError, + error: error, + errorType: nil, + closure: closure + ) + var matches = false + if let actualError = actualError as? T, error == actualError { + matches = true + + if let closure = closure { + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if messages.count > 0 { + matches = false + } + } + } + return matches + } +} + +/// A Nimble matcher that succeeds when the actual expression throws an +/// error of the specified type or from the specified case. +/// +/// Errors are tried to be compared by their implementation of Equatable, +/// otherwise they fallback to comparision by _domain and _code. +/// +/// Alternatively, you can pass a closure to do any arbitrary custom matching +/// to the thrown error. The closure only gets called when an error was thrown. +/// +/// nil arguments indicates that the matcher should not attempt to match against +/// that parameter. +public func throwError( + errorType: T.Type, + closure: ((T) -> Void)? = nil) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } - setFailureMessageForError(failureMessage, actualError: actualError, error: error, errorType: errorType, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, error: error, errorType: errorType, closure: closure) + setFailureMessageForError( + failureMessage, + actualError: actualError, + error: nil, + errorType: errorType, + closure: closure + ) + var matches = false + if let actualError = actualError { + matches = true + if let actualError = actualError as? T { + if let closure = closure { + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if messages.count > 0 { + matches = false + } + } + } else { + matches = (actualError is T) + // The closure expects another ErrorProtocol as argument, so this + // is _supposed_ to fail, so that it becomes more obvious. + if let closure = closure { + let assertions = gatherExpectations { + if let actual = actualError as? T { + closure(actual) + } + } + let messages = assertions.map { $0.message } + if messages.count > 0 { + matches = false + } + } + } } + + return matches + } } /// A Nimble matcher that succeeds when the actual expression throws any @@ -36,18 +194,65 @@ public func throwError( /// values of the existential type `Error` in the closure. /// /// The closure only gets called when an error was thrown. -public func throwError( - closure: ((Error) -> Void)? = nil) -> MatcherFunc { - return MatcherFunc { actualExpression, failureMessage in - - var actualError: Error? - do { - _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError +public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) + + var matches = false + if let actualError = actualError { + matches = true + + let assertions = gatherFailingExpectations { + closure(actualError) } + let messages = assertions.map { $0.message } + if messages.count > 0 { + matches = false + } + } + return matches + } +} + +/// A Nimble matcher that succeeds when the actual expression throws any +/// error or when the passed closures' arbitrary custom matching succeeds. +/// +/// This duplication to it's generic adequate is required to allow to receive +/// values of the existential type `Error` in the closure. +/// +/// The closure only gets called when an error was thrown. +public func throwError(closure: @escaping ((T) -> Void)) -> Predicate { + return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + var actualError: Error? + do { + _ = try actualExpression.evaluate() + } catch let catchedError { + actualError = catchedError + } + + setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) + + var matches = false + if let actualError = actualError as? T { + matches = true - setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) - return errorMatchesNonNilFieldsOrClosure(actualError, closure: closure) + let assertions = gatherFailingExpectations { + closure(actualError) + } + let messages = assertions.map { $0.message } + if messages.count > 0 { + matches = false + } } + return matches + } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift new file mode 100644 index 0000000..01369bb --- /dev/null +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/ToSucceed.swift @@ -0,0 +1,37 @@ +/** + Used by the `toSucceed` matcher. + + This is the return type for the closure. + */ +public enum ToSucceedResult { + case succeeded + case failed(reason: String) +} + +/** + A Nimble matcher that takes in a closure for validation. + + Return `.succeeded` when the validation succeeds. + Return `.failed` with a failure reason when the validation fails. + */ +public func succeed() -> Predicate<() -> ToSucceedResult> { + return Predicate.define { actualExpression in + let optActual = try actualExpression.evaluate() + guard let actual = optActual else { + return PredicateResult(status: .fail, message: .fail("expected a closure, got ")) + } + + switch actual() { + case .succeeded: + return PredicateResult( + bool: true, + message: .expectedCustomValueTo("succeed", "") + ) + case .failed(let reason): + return PredicateResult( + bool: false, + message: .expectedCustomValueTo("succeed", " because <\(reason)>") + ) + } + } +} diff --git a/Example/Pods/Nimble/Sources/Nimble/Nimble.h b/Example/Pods/Nimble/Sources/Nimble/Nimble.h index 790d16d..2bbc693 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Nimble.h +++ b/Example/Pods/Nimble/Sources/Nimble/Nimble.h @@ -3,11 +3,10 @@ #import "NMBStringify.h" #import "DSL.h" -#import "CwlCatchException.h" -#import "CwlCatchBadInstruction.h" - -#if !TARGET_OS_TV - #import "mach_excServer.h" +#if TARGET_OS_TV + #import "CwlPreconditionTesting_POSIX.h" +#else + #import "CwlPreconditionTesting.h" #endif FOUNDATION_EXPORT double NimbleVersionNumber; diff --git a/Example/Pods/Nimble/Sources/Nimble/Utils/Async.swift b/Example/Pods/Nimble/Sources/Nimble/Utils/Async.swift index 943fd30..cb672ad 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Utils/Async.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Utils/Async.swift @@ -2,7 +2,7 @@ import CoreFoundation import Dispatch import Foundation -#if !_runtime(_ObjC) +#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) import CDispatch #endif @@ -27,12 +27,12 @@ internal protocol WaitLock { } internal class AssertionWaitLock: WaitLock { - private var currentWaiter: WaitingInfo? = nil + private var currentWaiter: WaitingInfo? init() { } func acquireWaitingLock(_ fnName: String, file: FileString, line: UInt) { let info = WaitingInfo(name: fnName, file: file, lineNumber: line) - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) let isMainThread = Thread.isMainThread #else let isMainThread = _CFIsMainThread() @@ -89,7 +89,7 @@ internal enum AwaitResult { func isCompleted() -> Bool { switch self { - case .completed(_): return true + case .completed: return true default: return false } } @@ -105,11 +105,15 @@ internal class AwaitPromise { signal = DispatchSemaphore(value: 1) } + deinit { + signal.signal() + } + /// Resolves the promise with the given result if it has not been resolved. Repeated calls to /// this method will resolve in a no-op. /// /// @returns a Bool that indicates if the async result was accepted or rejected because another - /// value was recieved first. + /// value was received first. func resolveResult(_ result: AwaitResult) -> Bool { if signal.wait(timeout: .now()) == .success { self.asyncResult = result @@ -176,16 +180,25 @@ internal class AwaitPromiseBuilder { // checked. // // In addition, stopping the run loop is used to halt code executed on the main run loop. + #if swift(>=4.0) + trigger.timeoutSource.schedule( + deadline: DispatchTime.now() + timeoutInterval, + repeating: .never, + leeway: timeoutLeeway + ) + #else trigger.timeoutSource.scheduleOneshot( deadline: DispatchTime.now() + timeoutInterval, - leeway: timeoutLeeway) + leeway: timeoutLeeway + ) + #endif trigger.timeoutSource.setEventHandler { guard self.promise.asyncResult.isIncomplete() else { return } let timedOutSem = DispatchSemaphore(value: 0) let semTimedOutOrBlocked = DispatchSemaphore(value: 0) semTimedOutOrBlocked.signal() let runLoop = CFRunLoopGetMain() - #if _runtime(_ObjC) + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) let runLoopMode = CFRunLoopMode.defaultMode.rawValue #else let runLoopMode = kCFRunLoopDefaultMode @@ -218,7 +231,7 @@ internal class AwaitPromiseBuilder { /// @discussion /// This function must be executed on the main thread and cannot be nested. This is because /// this function (and it's related methods) coordinate through the main run loop. Tampering - /// with the run loop can cause undesireable behavior. + /// with the run loop can cause undesirable behavior. /// /// This method will return an AwaitResult in the following cases: /// @@ -250,9 +263,13 @@ internal class AwaitPromiseBuilder { self.trigger.timeoutSource.resume() while self.promise.asyncResult.isIncomplete() { // Stopping the run loop does not work unless we run only 1 mode + #if swift(>=4.2) + _ = RunLoop.current.run(mode: .default, before: .distantFuture) + #else _ = RunLoop.current.run(mode: .defaultRunLoopMode, before: .distantFuture) + #endif } - self.trigger.timeoutSource.suspend() + self.trigger.timeoutSource.cancel() if let asyncSource = self.trigger.actionSource { asyncSource.cancel() @@ -282,20 +299,23 @@ internal class Awaiter { } func performBlock( - _ closure: @escaping (@escaping (T) -> Void) throws -> Void) -> AwaitPromiseBuilder { + file: FileString, + line: UInt, + _ closure: @escaping (@escaping (T) -> Void) throws -> Void + ) -> AwaitPromiseBuilder { let promise = AwaitPromise() let timeoutSource = createTimerSource(timeoutQueue) var completionCount = 0 let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: nil) { try closure { completionCount += 1 - nimblePrecondition( - completionCount < 2, - "InvalidNimbleAPIUsage", - "Done closure's was called multiple times. waitUntil(..) expects its " + - "completion closure to only be called once.") - if promise.resolveResult(.completed($0)) { - CFRunLoopStop(CFRunLoopGetMain()) + if completionCount < 2 { + if promise.resolveResult(.completed($0)) { + CFRunLoopStop(CFRunLoopGetMain()) + } + } else { + fail("waitUntil(..) expects its completion closure to be only called once", + file: file, line: line) } } } @@ -313,7 +333,11 @@ internal class Awaiter { let asyncSource = createTimerSource(asyncQueue) let trigger = AwaitTrigger(timeoutSource: timeoutSource, actionSource: asyncSource) { let interval = DispatchTimeInterval.nanoseconds(Int(pollInterval * TimeInterval(NSEC_PER_SEC))) + #if swift(>=4.0) + asyncSource.schedule(deadline: .now(), repeating: interval, leeway: pollLeeway) + #else asyncSource.scheduleRepeating(deadline: .now(), interval: interval, leeway: pollLeeway) + #endif asyncSource.setEventHandler { do { if let result = try closure() { @@ -347,14 +371,10 @@ internal func pollBlock( expression: @escaping () throws -> Bool) -> AwaitResult { let awaiter = NimbleEnvironment.activeInstance.awaiter let result = awaiter.poll(pollInterval) { () throws -> Bool? in - do { - if try expression() { - return true - } - return nil - } catch let error { - throw error + if try expression() { + return true } + return nil }.timeout(timeoutInterval, forcefullyAbortTimeout: timeoutInterval / 2.0).wait(fnName, file: file, line: line) return result diff --git a/Example/Pods/Nimble/Sources/Nimble/Utils/Errors.swift b/Example/Pods/Nimble/Sources/Nimble/Utils/Errors.swift index f376505..074cb20 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Utils/Errors.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Utils/Errors.swift @@ -12,15 +12,11 @@ internal func setFailureMessageForError( failureMessage.postfixMessage = "\(postfixMessageVerb) error" if let error = error { - if let error = error as? CustomDebugStringConvertible { - failureMessage.postfixMessage += " <\(error.debugDescription)>" - } else { - failureMessage.postfixMessage += " <\(error)>" - } + failureMessage.postfixMessage += " <\(error)>" } else if errorType != nil || closure != nil { failureMessage.postfixMessage += " from type <\(T.self)>" } - if let _ = closure { + if closure != nil { failureMessage.postfixMessage += " that satisfies block" } if error == nil && errorType == nil && closure == nil { @@ -41,62 +37,6 @@ internal func errorMatchesExpectedError( && actualError._code == expectedError._code } -internal func errorMatchesExpectedError( - _ actualError: Error, - expectedError: T) -> Bool - where T: Equatable { - if let actualError = actualError as? T { - return actualError == expectedError - } - return false -} - -internal func errorMatchesNonNilFieldsOrClosure( - _ actualError: Error?, - error: T? = nil, - errorType: T.Type? = nil, - closure: ((T) -> Void)? = nil) -> Bool { - var matches = false - - if let actualError = actualError { - matches = true - - if let error = error { - if !errorMatchesExpectedError(actualError, expectedError: error) { - matches = false - } - } - if let actualError = actualError as? T { - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(actualError as T) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } else if errorType != nil { - matches = (actualError is T) - // The closure expects another ErrorProtocol as argument, so this - // is _supposed_ to fail, so that it becomes more obvious. - if let closure = closure { - let assertions = gatherExpectations { - if let actual = actualError as? T { - closure(actual) - } - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - } - - return matches -} - // Non-generic internal func setFailureMessageForError( @@ -105,7 +45,7 @@ internal func setFailureMessageForError( closure: ((Error) -> Void)?) { failureMessage.postfixMessage = "throw error" - if let _ = closure { + if closure != nil { failureMessage.postfixMessage += " that satisfies block" } else { failureMessage.postfixMessage = "throw any error" @@ -117,25 +57,3 @@ internal func setFailureMessageForError( failureMessage.actualValue = "no error" } } - -internal func errorMatchesNonNilFieldsOrClosure( - _ actualError: Error?, - closure: ((Error) -> Void)?) -> Bool { - var matches = false - - if let actualError = actualError { - matches = true - - if let closure = closure { - let assertions = gatherFailingExpectations { - closure(actualError) - } - let messages = assertions.map { $0.message } - if messages.count > 0 { - matches = false - } - } - } - - return matches -} diff --git a/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift b/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift index 4a7d94f..7c4d273 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift @@ -144,7 +144,9 @@ extension Data: TestOutputStringConvertible { /// will return the result of constructing a string from the value. /// /// - SeeAlso: `TestOutputStringConvertible` -public func stringify(_ value: T) -> String { +public func stringify(_ value: T?) -> String { + guard let value = value else { return "nil" } + if let value = value as? TestOutputStringConvertible { return value.testDescription } @@ -156,15 +158,7 @@ public func stringify(_ value: T) -> String { return String(describing: value) } -/// -SeeAlso: `stringify(value: T)` -public func stringify(_ value: T?) -> String { - if let unboxed = value { - return stringify(unboxed) - } - return "nil" -} - -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc public class NMBStringer: NSObject { @objc public class func stringify(_ obj: Any?) -> String { return Nimble.stringify(obj) @@ -175,7 +169,7 @@ public func stringify(_ value: T?) -> String { // MARK: Collection Type Stringers /// Attempts to generate a pretty type string for a given value. If the value is of a Objective-C -/// collection type, or a subclass thereof, (e.g. `NSArray`, `NSDictionary`, etc.). +/// collection type, or a subclass thereof, (e.g. `NSArray`, `NSDictionary`, etc.). /// This function will return the type name of the root class of the class cluster for better /// readability (e.g. `NSArray` instead of `__NSArrayI`). /// diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h b/Example/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h deleted file mode 100644 index 5d416e4..0000000 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble22CurrentTestCaseTracker") -@interface CurrentTestCaseTracker : NSObject -+ (CurrentTestCaseTracker *)sharedInstance; -@end - -@interface CurrentTestCaseTracker (Register) @end diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h index 2089607..9170541 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h @@ -30,12 +30,12 @@ NS_ASSUME_NONNULL_BEGIN #define DEFINE_NMB_EXPECT_OVERLOAD(TYPE, EXPR) \ NIMBLE_EXPORT_INLINE NIMBLE_OVERLOADABLE \ - NMBExpectation *NMB_expect(TYPE(^actualBlock)(), NSString *file, NSUInteger line) { \ + NMBExpectation *NMB_expect(TYPE(^actualBlock)(void), NSString *file, NSUInteger line) { \ return NMB_expect(^id { return EXPR; }, file, line); \ } NIMBLE_EXPORT NIMBLE_OVERLOADABLE - NMBExpectation *NMB_expect(id(^actualBlock)(), NSString *file, NSUInteger line); + NMBExpectation *NMB_expect(id(^actualBlock)(void), NSString *file, NSUInteger line); // overloaded dispatch for nils - expect(nil) DEFINE_NMB_EXPECT_OVERLOAD(void*, nil) @@ -60,7 +60,7 @@ NS_ASSUME_NONNULL_BEGIN -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(), NSString *file, NSUInteger line); +NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSString *file, NSUInteger line); @@ -186,6 +186,8 @@ NIMBLE_EXPORT_INLINE id beginWith(id itemElementOrSubstring) { DEFINE_OVERLOAD(unsigned long, @(expectedValue)) DEFINE_OVERLOAD(int, @(expectedValue)) DEFINE_OVERLOAD(unsigned int, @(expectedValue)) + DEFINE_OVERLOAD(float, @(expectedValue)) + DEFINE_OVERLOAD(double, @(expectedValue)) DEFINE_OVERLOAD(long long, @(expectedValue)) DEFINE_OVERLOAD(unsigned long long, @(expectedValue)) DEFINE_OVERLOAD(char, @(expectedValue)) @@ -348,6 +350,12 @@ NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); #define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) #endif +NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers); +#define NMB_satisfyAllOf(...) NMB_satisfyAllOfWithMatchers(@[__VA_ARGS__]) +#ifndef NIMBLE_DISABLE_SHORT_SYNTAX +#define satisfyAllOf(...) NMB_satisfyAllOf(__VA_ARGS__) +#endif + // In order to preserve breakpoint behavior despite using macros to fill in __FILE__ and __LINE__, // define a builder that populates __FILE__ and __LINE__, and returns a block that takes timeout // and action arguments. See https://github.com/Quick/Quick/pull/185 for details. diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m index 31ff810..670415b 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m @@ -1,26 +1,23 @@ #import -#import - -SWIFT_CLASS("_TtC6Nimble7NMBWait") -@interface NMBWait : NSObject - -+ (void)untilTimeout:(NSTimeInterval)timeout file:(NSString *)file line:(NSUInteger)line action:(void(^)())action; -+ (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void(^)())action; -@end +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else +#import +#endif NS_ASSUME_NONNULL_BEGIN -NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBExpectation *__nonnull NMB_expect(id __nullable(^actualBlock)(), NSString *__nonnull file, NSUInteger line) { +NIMBLE_EXPORT NIMBLE_OVERLOADABLE NMBExpectation *__nonnull NMB_expect(id __nullable(^actualBlock)(void), NSString *__nonnull file, NSUInteger line) { return [[NMBExpectation alloc] initWithActualBlock:actualBlock negative:NO file:file line:line]; } -NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(), NSString *file, NSUInteger line) { +NIMBLE_EXPORT NMBExpectation *NMB_expectAction(void(^actualBlock)(void), NSString *file, NSUInteger line) { return NMB_expect(^id{ actualBlock(); return nil; @@ -141,18 +138,22 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; } +NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers) { + return [NMBObjCMatcher satisfyAllOfMatcher:matchers]; +} + NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { return [NMBObjCMatcher raiseExceptionMatcher]; } NIMBLE_EXPORT NMBWaitUntilTimeoutBlock NMB_waitUntilTimeoutBuilder(NSString *file, NSUInteger line) { - return ^(NSTimeInterval timeout, void (^action)(void (^)(void))) { + return ^(NSTimeInterval timeout, void (^ _Nonnull action)(void (^ _Nonnull)(void))) { [NMBWait untilTimeout:timeout file:file line:line action:action]; }; } NIMBLE_EXPORT NMBWaitUntilBlock NMB_waitUntilBuilder(NSString *file, NSUInteger line) { - return ^(void (^action)(void (^)(void))) { + return ^(void (^ _Nonnull action)(void (^ _Nonnull)(void))) { [NMBWait untilFile:file line:line action:action]; }; } diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h index d2a54d2..e6e0272 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.h @@ -3,8 +3,8 @@ @interface NMBExceptionCapture : NSObject -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally; -- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)())unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); +- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally; +- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)(void))unsafeBlock NS_SWIFT_NAME(tryBlock(_:)); @end diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m index 0a882b7..52684b7 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m @@ -2,12 +2,12 @@ @interface NMBExceptionCapture () @property (nonatomic, copy) void(^ _Nullable handler)(NSException * _Nullable); -@property (nonatomic, copy) void(^ _Nullable finally)(); +@property (nonatomic, copy) void(^ _Nullable finally)(void); @end @implementation NMBExceptionCapture -- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)())finally { +- (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnull))handler finally:(void(^ _Nullable)(void))finally { self = [super init]; if (self) { self.handler = handler; @@ -16,7 +16,7 @@ - (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnul return self; } -- (void)tryBlock:(void(^ _Nonnull)())unsafeBlock { +- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)(void))unsafeBlock { @try { unsafeBlock(); } diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h index e5d5ddd..7938bca 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.h @@ -4,7 +4,7 @@ * Returns a string appropriate for displaying in test output * from the provided value. * - * @param value A value that will show up in a test's output. + * @param anyObject A value that will show up in a test's output. * * @return The string that is returned can be * customized per type by conforming a type to the `TestOutputStringConvertible` diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m index 329d39a..31a80d6 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m @@ -1,5 +1,10 @@ #import "NMBStringify.h" + +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else #import +#endif NSString *_Nonnull NMBStringify(id _Nullable anyObject) { return [NMBStringer stringify:anyObject]; diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m index 35f26fd..fa5030a 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m @@ -1,7 +1,12 @@ -#import "CurrentTestCaseTracker.h" #import #import +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else +#import +#endif + #pragma mark - Method Swizzling /// Swaps the implementations between two instance methods. diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 677384c..a9494f1 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,171 +7,175 @@ objects = { /* Begin PBXBuildFile section */ - 04ADA7ED88E0D419D4DA1DB9DA1A2FF1 /* MachineLeanringErrorEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6576B5347A8A01F10941469B1EA3EB /* MachineLeanringErrorEnum.swift */; }; - 04AE1DC56A0C088489EA27CED5190838 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 692BA097D08B9592A8A24370C50D81D0 /* Stringers.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 06701D0572D99FF3577E0C4F3E308FE8 /* MLKit.h in Headers */ = {isa = PBXBuildFile; fileRef = D227D633B0111C5DC188D1C75FBC2BB6 /* MLKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0B846370B6EA04F7D7909A403DD16317 /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A0C56CEE8C3AD43FF8AE40F6AFFF4C7 /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 0B9A16DAD08AFA59EDD6058831216A70 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A46C9CABC6D7C94BE0864668B74F949 /* World+DSL.swift */; }; - 0D4B1951108CF54E1968467D30C351B5 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0CED4BACCDE5B346DA1AF62EB6AF781 /* MatcherFunc.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 0DF2D4E6B55D67E28D8BE9EC5A25F24E /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 256AA66B0C109C259E2D0DDA42B32EDB /* Async.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 10B953E63951E8DB495AA5B5EBDBBABA /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6C176A86FD62B15FEA0A36C68FCEBF8 /* PostNotification.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 11EEDB6DB6F03E2AF3FC368AA32274AC /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 564EE9F32DE4725529A52326B19EA90F /* ThrowAssertion.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 123D36BB9CA549C55BBE6FC7D21BAB97 /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 538A45E8224CD67C4262A9B8B8F1F37D /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 153AA07F19B6F56DE6BB54E6D7BBF1E5 /* Matrix.swift in Sources */ = {isa = PBXBuildFile; fileRef = B90161234C0D9C58144F0D114775D3E8 /* Matrix.swift */; }; - 15B880A364E4467B8496FB49A27371AA /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B964EBE2CDB51FDD20A12FCFCB2CA92 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 178FA5CACF9ACD91FBBEB0DF8892201F /* Hyperbolic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24D478FE2127475CABEE5C5AE5B9772D /* Hyperbolic.swift */; }; - 17B85BEE3D018EB0AF42539D1658D24E /* Arithmetic.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24FCB1F18D8CD9497E67BE1BC119854 /* Arithmetic.swift */; }; - 18F58A2CDEFED6B5617F4944FC84DBEE /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = CECAF283BF4E0E908EDD2145F46A956C /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - 1C37D984F1BBBC7278E1FB6BDB153892 /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAC4FF748D013369FE77FEB13FA517D2 /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 1F707004C05C63F90F0030E8E4902D66 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC69007AFC0A65564291043D24B15E3D /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 20C32450383B494CC9EF7F3072369EE0 /* Pods-MLKit_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A6F138A9EBF54B5A06DCE9CD171D6071 /* Pods-MLKit_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2173F4681D2DDDF63A01A7439EDE1FD4 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 460AA53800E69CBD26BBD78537857F1E /* NMBObjCMatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 2211BD314546EEC0AB7B56FC3A45B4E5 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 761E70C09096AF7E9F07C0940571D8E8 /* XCTest.framework */; }; - 249AC8A0B6CC8D4D92DA5D841D712900 /* Complex.swift in Sources */ = {isa = PBXBuildFile; fileRef = E73EAAE4A9B8B04A94992730F2F8F808 /* Complex.swift */; }; - 288DBE855F794BA1AE8BC47AA413693E /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26788572C6F366401AFEC63C14A45513 /* BeginWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 2991245B488F3F00EDCFD3EFB2244294 /* Auxiliary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 012916E1116F4F544559C4FFCDD0D170 /* Auxiliary.swift */; }; - 2B132F4EB4A9D60A8439EFAC1D0D6D2C /* Span.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99A3B4EC6DA19FEADCCDCA96CA327574 /* Span.swift */; }; - 2DB201D5AC1FCE6C27412155BACDF7F6 /* ActivationFunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97CC96CA68BA0815524C996D3FD7D4C8 /* ActivationFunctionType.swift */; }; - 2DF80575B9759A9E8004F4F642D0D123 /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4891C3E0E5A4953C1B99E8D3D29EE77 /* ContainElementSatisfying.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 3068D78E8F744939B04CA6B03D3380AA /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = E676FEA2024624A7035E564D4FD4C518 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30F80459D8D536D8B99880EDD353987A /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46306D0BBA1452AFEA95521C31EF74FD /* BeGreaterThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 318F9AE6D9561CFB487071A821B4217D /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = E173D8DBF9F7B3031B549B2E0D20C12A /* BeLessThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 31DAC2CCBBF3C8BA68AB4DC7912A199B /* Pods-MLKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D3A07F4F6A05CA6A00CF85FDA94AB57 /* Pods-MLKit_Tests-dummy.m */; }; + 004C4A6F461C216F03A05253CA730BEF /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3D739338A7631D1462E2684F771CCDE /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 00D139EEB6792519BEAF55EA35ED8F83 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E6B7D825EED250A8A2E507119F4709 /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 057FD6F9061B0A2B9BFE252D3C102A3B /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5939A7201581DF730418B213139A659D /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 06A1ED28CC8A4A7AA51A74E3F066B890 /* Tensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8652DE537D4205F41CABDA2982BA1C25 /* Tensor.swift */; }; + 0B24159FEC50346D438B9E0EECBEE8BE /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8A10C6381DD2BA184C44E716A301AA /* SatisfyAnyOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 0ECBFD6DD2705D603B58B6CDBB4ECB55 /* ActivationFunctionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99AE607EC3AE432038B8D01ED43874F5 /* ActivationFunctionType.swift */; }; + 0EFF888E42BD1DF8B77FA6B547BC9149 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = C62DBF5F4F814CA68B3097F0248FB2ED /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10C8501040563F6DC661872488E4EE05 /* Interval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E704933645FA99C8E634547C49786E9 /* Interval.swift */; }; + 11B8DC63427760E55702E36491E82FA5 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D7A706141B0D9509964E0CB47AA457C /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 12080BB18AFDA64D95FD31E27B28A66D /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04B8E32AD23B2D12CA57341D936CAB3A /* Stringers.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 13222A32A26429EB6E1D112C5F8B97D4 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D6EB106E4321D22F26A52B5B8DE64CD /* ExampleMetadata.swift */; }; + 1995EBB8E64C83233C202827D2D642E9 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89EF396CF1EE4E75AD050BDF3EC68560 /* Predicate.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 1B1A26FD4363A19DEFED48BF5E5341BE /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = BF556D4573DC7F987D53D889524FE92C /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1BBFE5E8E35BF18EC9F4C8BD8EC1C060 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = A859BC8BAFA1A204B91C3D70FD7A64A6 /* BeAKindOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 1CFDB94DFF57F98BA7A40829DDB3CFC0 /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = B9B1A75006593B42ED0AC43E5AF1A6C4 /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D230EC73A17C8494F279447636B6D51 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 5981D3D86D2E06AC38A3978635C9DED8 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D6F244C93C8350C8BD032AEDC9402C5 /* FFT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7285349CCF57C337C73827A7D17A9CEF /* FFT.swift */; }; + 1E03644651C38FCCC0C5614DF1CC4541 /* Span.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197CCEAC9008FEF55260A0F2FF0C7B32 /* Span.swift */; }; + 1F7C236A1386F8EDED5E6445FD19C9E3 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF91AA966FF23FD34A8A2A6CA13B6D92 /* EndWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 21979416B2B4389E1A489EE0C33A536B /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2865B6ED5D6CC83F8E66C35548F7893 /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 22731B945A88C7E0BEE56C04EA79B854 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA5D01A26D43913794F56D3A7971FF5E /* NSBundle+CurrentTestBundle.swift */; }; + 2339AFF95F06AB4A518AAA46A27255D6 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D75D2A081911A92CAAA13793F43C1F75 /* AsyncMatcherWrapper.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 258E93DF9434A618A4A4E48C5CAA41CD /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1FBBDEE20AB0367D1E895BFF7BAFB74 /* BeNil.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 26C2857031D2CB5DE4BFC55F71E64229 /* 2DTensorSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC94E0F4BCD7B7FE9B85BA34D118700B /* 2DTensorSlice.swift */; }; + 28CFC0568B5E674FF8F0AF1CC0E54ADF /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA6E390EC13AA8DFEFCF8F64F83ED7F0 /* BeGreaterThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 294B014BE7FF231808A123355C1DDDCC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */; }; + 2A58E899DD8B5F96FE9C3EDE09DA4275 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86BC4FC4C5A0AC48D066EA367D9F1A1 /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 2A64C14CA0740E07DF5604A89045B736 /* ComplexArithmetic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF613065B011698DDBE313953239BF2 /* ComplexArithmetic.swift */; }; + 320DB9CF630DCAD9F57987783F2BCCA6 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED86E004A5AE80E2A32D547215794042 /* RaisesException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 32303624D5644DFA368BB8ADE56A5A80 /* PointerUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E5093D5F993BB458C93C325732AC182 /* PointerUtilities.swift */; }; 327749EF14CAE658519971A5FDD0AB95 /* Upsurge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29E88E2BB63028C27C1E53746F101DF7 /* Upsurge.framework */; }; - 32AB6828BB98A679D3EBCC16C7BE9566 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2D5869169BD2131A228B383AB451505 /* Functional.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 34E0569B2666F68A70EB676EFDCC4434 /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40FFCF7710FDE9792C5747C276F2DF4F /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 35E498D7267B6961DED0706D43F883A0 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D765DA753FAB21A06C81689DCF49863 /* SuiteHooks.swift */; }; - 383B3EF018CDFD095EFEB7D74769144A /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05BA3CAD29488F2C5317D831BB6931BF /* EndWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 387B27F0A4DD48F245FF12E5485FB9BE /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EB98267420E501E4F7B0573E2C5F96F /* QuickConfiguration.m */; }; - 3C8CBA02B15729E98A0F63382FE6217B /* ValueArraySlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D06F6EACA4C3A8FB660F983B8C2500 /* ValueArraySlice.swift */; }; - 3E456278E0D7B190269739DA08693C9E /* LinearType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB15E15A6C417380F4BDE4F104E73FA /* LinearType.swift */; }; - 3E699E314F200C3EEF7C7E0D46E26B79 /* Upsurge-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C36512E8311F1878F954D885D3EF9B /* Upsurge-dummy.m */; }; - 3FFDB93012DF1EBF973430063D61C96D /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04D296FB2AE0035E8400F25EBD3EF4B /* Callsite.swift */; }; - 409A3ECDDC680D0BD343E3F203862E25 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 124FF2A96FE15393763BC63572EEC184 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 438262E9AEBC5203D56677E842F563D5 /* MatrixArithmetic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A2A011722B21DE42A32C785BC89EA01 /* MatrixArithmetic.swift */; }; - 4540D4FBCD937483258578DE32634108 /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = F4AA2FCE20C3F50B7669DC36BD5B9FD0 /* World+DSL.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 458ECBFAB660567138EFA52210058C36 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE29DF31652B34FA490E23487B83FBEE /* QuickSelectedTestSuiteBuilder.swift */; }; - 46AAFE6E2E75D62AF8DFED367375002C /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = B9D3FED038BE3338641A141732755B00 /* QuickSpecBase.m */; }; - 4780B7DFD8E5DC959B44110EEB2AD935 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */; }; - 48D3AEB90C6F865FB5128840EF13CAC8 /* Layer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C22F81E5621CF7F9199426C6B30396E0 /* Layer.swift */; }; - 4A17E1DB4EA2CCBF04B76F5F8EB417A1 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 0874FE88223748474F9540CC3A7B2CDD /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4B6579FFF0062EEBBABB8336C0871171 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C1D721B2C6C17E12FA8322E6E16682 /* Errors.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 4D339AFDC6B6AAA44BA5C0CD471B6EA2 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 67BD782939C66E9C3619A77243519BF6 /* QuickSpec.m */; }; - 4D5C0E52B4D1231A2E3057B4A048D1C5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */; }; - 4FDFB4587C55A09C0A2E3A3780568B54 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 02862E2FB988A3D26C860CD548A14BEB /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 50471C0EFA0C6F13833F63066765DCFF /* LinearOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C3B0FE4A67C53BAE82ACF00A907244A /* LinearOperators.swift */; }; - 508E5B8353068B37CA6F40E3D7B89D42 /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9624E19BE6F7377A79FB879764B1B1DE /* Closures.swift */; }; - 519349F9AF137FFAD28A594685046460 /* Exponential.swift in Sources */ = {isa = PBXBuildFile; fileRef = C00D1260FC691D4C91B5C7B0C1E51CED /* Exponential.swift */; }; - 51CE8C2AEBC657C98FFC03B61E97B412 /* Upsurge-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5480FBA1F6D203291F193F6D19878DBA /* Upsurge-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 562D9F54656827753A037634D5385BFD /* TensorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C9E249A32DD13B27BA05B3CDE01B22E /* TensorType.swift */; }; - 5685322E421AB4DA6A91B26C09833B29 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E429FE9C8505AE999927833503F9CB86 /* BeIdenticalTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 59667A95671EEAF87FA2272CE0B01451 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = E3118F695CEE1A70F01A9E795A35D87A /* QCKDSL.m */; }; - 5B18BC28616DDC2DDE3442B98F00CF09 /* PolynomialRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8C04FE82A09C3FC32594EBFC743E53 /* PolynomialRegression.swift */; }; - 5FB36CC3D65A05755802D9EC66B0AEDC /* KMeans.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93DE7AC6CBCC1E15E3EC4491A5B45D7C /* KMeans.swift */; }; - 61554BF9F5D2997AD26BC61F4674CD68 /* Pods-MLKit_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9951688C60A46DD572589F5DACF0C4A5 /* Pods-MLKit_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 643B6917C3157C68C92A7260459DC694 /* Real.swift in Sources */ = {isa = PBXBuildFile; fileRef = B05A2B00A7660C87F990F90901BB61C2 /* Real.swift */; }; - 646824AF5ADC1159EBC9CAC023BAED4E /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FB8099238DE7DDCFE3FE4C07E86CF1E /* ExampleHooks.swift */; }; - 65335E2F74AE71C270659EC7E8725030 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 445AD67BD05424A184443D2B95D450E1 /* Expression.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 694FFDD18CDDC9EC5B5F52779DEC4133 /* CSVReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7264F4D0435F000E2684EB1DAACEBDD1 /* CSVReader.swift */; }; - 69F9C31FC991A69337CE9B599993D68D /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E2478F9C2B8F6A4FD3E290EB66D2967 /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 6B8EEA47C6BE87E17FD2F93747E2A4C5 /* MachineLearningKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D60404BA78CC7BF6C1144F008DDDDBC /* MachineLearningKit-dummy.m */; }; - 6C52EF3CBF595A0DC903558A35E303D9 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7B423E7D950D806D1D781D4D9FC8B1 /* QuickTestSuite.swift */; }; - 6E55E227D9195A39F978F2DC1C408636 /* RidgeRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DB8A700464608EEC997EB8F70F5A97 /* RidgeRegression.swift */; }; - 6F36A431DE56B28FD400D20036A23DE4 /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = D90BB83409612B6B1623CBC644ACC3FE /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 6F74F8072E2C42E51624D0B89AB03048 /* ComplexArithmetic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0EB0151B5DDBCEC7706C08CB3F6D0A /* ComplexArithmetic.swift */; }; - 704DA81E48A5263B35189F36C5247A53 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077C0519A2057F471035D14A7027344E /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 71CD456EE3712FFF55CB7BF70ED20647 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AEF9A30B4EAA4E623AC004398637120 /* MapKit.framework */; }; - 7272DB71A8C5325A0778F63E6F6C9957 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F2FFA2871232A17F74D97604A516636 /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 7276DB3552398200B421D06F207EC0E3 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7EC0E4FEBE039947272C3B4A867BE43 /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 74534A7B8A7904903E206702029453C8 /* QuickSpecBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D128A10EA2E300A21235B91F63A2AA3 /* QuickSpecBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 748BB746CA429F9C5D510EEF3245ECFD /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DBD0EB0CE3764BD0D10DF460F60B14F7 /* Nimble-dummy.m */; }; - 76C86B1AE6D2B6BED9ABBA270B6EC2F5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */; }; - 78726014CB6610CA87B10E02D148478A /* DSP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 383A4DC8ACFD6B49ECF2DFE23764A2D3 /* DSP.swift */; }; - 7900A1BADFEB30B7D803D0869E548E10 /* MatrixSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 674822B4E356741B78B38B007C88BB9C /* MatrixSlice.swift */; }; - 7BD907A708031D5361E1A97CACF9F24E /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 162303716510B6A1AC25BFD0F74F2544 /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C94AD7C4A4F54FB18623AD4E5CD64F7 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF83868F61F3BD4402D23052FDEA773A /* Example.swift */; }; - 7E08966D0A420CCE741F608370F4759C /* ComplexArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDC143C76D629D8D454DC5D8AA30F893 /* ComplexArray.swift */; }; - 7E950AE4BC7D603625CBFD877F63728C /* ComplexArrayRealSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1210BE3C711459C58AE9F743F7B82931 /* ComplexArrayRealSlice.swift */; }; - 7F5D5AFA3C84AA582DEDC6A6C78E7533 /* Tensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB6F2F34E76936E5DCD781D737E8D0E /* Tensor.swift */; }; - 80D1788131B3D3326041E62364F8C7AA /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1849FDC7F164FD02BFDF72640C9F951 /* BeAKindOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 86D13DA212D4F8A87E212941DF61361D /* ComplexArraySlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB163EBF7C9440E868AC98AFF69EA4BF /* ComplexArraySlice.swift */; }; - 86E4EF6BCCB1EF6E67552FCD7A3B6D6E /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 16D03C36A6892F0A0BA80E3B43181599 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 874EF0A06B9FC80B877261425BAB4ED2 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 20BF642EFEB79518E353D7F8F3D860F1 /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 88B771FB81DD05BF7E48A0D9271D9EB4 /* CwlCatchBadInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 3949269DDD43CCFF544917979779224B /* CwlCatchBadInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 88FEF6149AF4FA0DEE3DBCBFD20BE64C /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 895545B440ABA73C074838125D4DDCD5 /* Filter.swift */; }; - 8995462F1A16CFB4BB4B376A1DE531EA /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79862A111E88CCA41E254825B0A2B523 /* NSString+C99ExtendedIdentifier.swift */; }; - 8B633AB7CA7CD7773A1C426781C08948 /* BiologicalProcessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 224B74EEB01665D46840260470EA4991 /* BiologicalProcessManager.swift */; }; - 8E00B22C6FE14FEF9B828106A8B1622F /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = 64BEBE3A1D4FF0196925EEA64015469B /* World.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 926F67C94121C19A959745138E5B42B6 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A7F3D729C82E75AB35940B80EDE5960 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 92EDDC00A5D940D4F7361AEE6644BD30 /* LassoRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 436FD53B1F1C37D3650BE5FE2C882A5E /* LassoRegression.swift */; }; - 96154D504405D81853EF3326A10CA05C /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7D069980D480A434318340B49416C2C /* World.swift */; }; - 9D9155396F48333B854DBE586138EDBF /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60979E4BD68DB0DE4501D0BCC7234D91 /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 9FFFDDC2816EEAA4F74BE9FCF9681670 /* SimpleLinearRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33447FAB1F2844FCF376B75EB97C4666 /* SimpleLinearRegression.swift */; }; - A167AE1A23ECB0052ECE3E97BCE40E70 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */; }; - A1F2BC02366DABC762E62F506B6D1AC2 /* 2DTensorSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C13EEF6CE7B8665E06332AD77882466 /* 2DTensorSlice.swift */; }; - A279D4DAE8E16C5D8F9019CDBED14D73 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0912AB47C2FD8B724C2FF78EB04DA146 /* DSL.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - A665BE606F6B28E89B531EDE41657ECE /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CCCA0D5F8BB724A0B342E39C887F56C /* Match.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - A711AA562D0AD3092BAF83E2CFCC86A7 /* QuadraticType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 494C0F635D5836E872EF3C5A39E97D40 /* QuadraticType.swift */; }; - A87CA098369D61EFC7A05BD61512A3F5 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB4893036DEB2A1EB8B6111A120F5A2 /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - A8F199FA1C0D1AD05EADD8EFBC00592B /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76A2C52BB2BC141539B6A02006AE6422 /* Value.swift */; }; - AA6EAFA71E1A6862AA312D89A601C34F /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1601B2905CD07F5813DA81623EDCA6C /* AsyncMatcherWrapper.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - ABE2A268050AA3DEFDF8D945B9930866 /* DataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477B34BD1FFA8820D6EF220B0BC0118F /* DataManager.swift */; }; - ABEE3775B4FD25B3C86EE712BC2502B2 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C77F9745A1AEE0419DE285232F7A4B46 /* BeGreaterThanOrEqualTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - AC3D1B5A37FB49CFDCC4C671C79B020F /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C397B78C2E0CE51B2767D2AF1CD9817 /* Extensions.swift */; }; - AD2B0E5BFF8EAD0EDF0449F8D198277C /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 851E4FB881FC4ED5D39D0CBCB7DAA845 /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - AE7464C0BFB56E8B11B0670A68B9CF12 /* NeuralNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F8B6CE41AAC2E1823ECFFB4021CC6E2 /* NeuralNetwork.swift */; }; - AF7F875677FF3EB4B6ADDB1373B34249 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 227DDFCD5D9F3918AB624B74E886C8A5 /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - AF814F353BF9C15BAED3E4067DCC3BF7 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C9A0B54C6BC094E3CD3A2A61EDA9D85 /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - B138DBC0F7D2656EE7E413BEA735C71D /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7958F9886E618114345F800A8E55FF /* DSL+Wait.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - B16340143CE7FF40A32CD8082ED4152D /* CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = BA9401876190B7BA1B70B7A9752180D5 /* CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; }; - B18BBE44B0684143A1542A9ADC880697 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3E3057A07EA15E4008F933E8752DD2 /* URL+FileName.swift */; }; - B1A6D9047AE13EF484B5F58F215440A1 /* Interval.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93BD78CE597862CCAAF3A214DF9A8D46 /* Interval.swift */; }; - B1D59A1BD0FBDF3BA9A5B65ACFC25D56 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0117B79C919D9B561E2A88CF83B7969 /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - B1D876C441B5F61984E35ABB5210AFE6 /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F643B28D12D7235D05A86D94E704075 /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - B231D3FAB3CCEF59EC681C7C51C0AE56 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = CABE7AA02D1F045430D6A230BD3B4C19 /* ExampleMetadata.swift */; }; - B24A0A8140995A495C05A9D6209847CA /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FD3593FEB98ECA8845615527BF4C07B6 /* Accelerate.framework */; }; - B4590BB72005AC96211E469104D92DB5 /* InputDataType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEA09D70E089028B813F7E3B421C5F78 /* InputDataType.swift */; }; - B612F1F906E3AF8B1FC6B893229E83B6 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA483EF72520B01CF4A81ED38901CC64 /* AssertionRecorder.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - BCA0250C524C4316B3D4D6415A4969C8 /* ValueArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AAD299764DE8C9B43BA8AFF5C36053F /* ValueArray.swift */; }; - BCCBC7CED6FB9D71D85D8044B209B09A /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 711A9AC0701A2E08E65DD82429B871BA /* ExampleGroup.swift */; }; - BD782803F394A708E7D3223EBDE31C95 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6452D2CC7C17DD01ECD91742AF746F /* DSL.swift */; }; - C08FCDC247B35C971F5AE7E58987E8AC /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBBD5A13ECC31F538E7CFD189D0DC70 /* SatisfyAnyOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C39921387DA273A0952A999B0CDC03F9 /* CwlCatchBadInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = D88E93CB6BC77FCE57F53E52EA5D23E8 /* CwlCatchBadInstruction.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C710B6A7B1A479349273B3AC04CF07C5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */; }; - C7D1BAD68F1C67EA9AAE23534D3E9665 /* Population.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A45BA6EC001C35D2D0B9BFE6072BD59 /* Population.swift */; }; - C83188A450E13A233EF77D94306E926D /* Pods-MLKit_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5025AF8F620B99C3283F0975D09FE3 /* Pods-MLKit_Example-dummy.m */; }; - C9132B1E287B7ECA69A90F4766ADE9C2 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C0D020BB9A8FA4BD0F26AC76A2E14A /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C97B9F51427BCD4C63EC7D75AB161833 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95FD3F8CEA2A60510B93CE50FFDAEC43 /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C9AAE13CC11B5370479EA08F706EA61F /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA8E6B68CD5B9186B6EC6647BF81A356 /* HooksPhase.swift */; }; - CC420602CB84B73545CD09A3DAD3F638 /* Trigonometric.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632231BFC26E16C229D32687B917D3A0 /* Trigonometric.swift */; }; - D234F610A6025A894A8CF8971A8F96C0 /* TensorSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 904FEA0622628AADB1CA02AA57ED1A48 /* TensorSlice.swift */; }; - D5D4E8223C271A19448FCEAC36A9B441 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7738AD08C39FE55EBEED43F72217AD23 /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - D6A1634CFD5243D18DB762116C8CEF8F /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27B970E9789C66FDD4D00112E12E321A /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - D7408861438442F67469ACE39D1604C1 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 985F35A8C7BB37C0852C7E45F32619DA /* BeCloseTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - D93C5A1929F8FD53F7EF2C3CA16CCC95 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC2B937DBAE6CC4BCEE683AA80588DC7 /* Expectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - D9921CDBA36587248C63AFDD5B3C1981 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91835FDAA353C4CC63023DDB96B91F6 /* Equal.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - DA5FD83FA962C78A2484186465AB5AF2 /* MachineLearningKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ECF49E5836E9754AAF942842CE1B960 /* MachineLearningKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DA90A10D3A108672F7D61F8A96C42650 /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C3523CB10A94DA7970870A6190C1CB1C /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DB039F39038342DE5258F386F694A9A0 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6030DF38EBDBF336FFAE0120EEA4D959 /* SourceLocation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - DB5066EBB8C95A3F8818628C9CA6794D /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 922D9654CE04819948A343CA3B1429F3 /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - DC9C69D7524AFEECCDC73D5CF1F4C028 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07FB5885E183C905F1B353BA590212F0 /* HaveCount.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - DEF289C7BF4E97D42B06B1EB7CAE0951 /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 50F4D75F4A1D2B2E24633488475931A3 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFA04175FF8EB3DFFA5FFEEF93996E7C /* FFT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8696FA5715205A2FE823260539588590 /* FFT.swift */; }; - E1554E6ED22E94CAD97E211C7FBA530B /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD25694F61A3303C6994E49FD926F60C /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - E1DC6CA2B4B8D7E6F175D02BE729E637 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE766189385F7E575AD7202D0316AFFC /* UIKit.framework */; }; - E9CD7EF9DD6E75404E4264F6F0AC8D26 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CFC980E2966F69FA4D771EB69B2072A /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EEACC5B78AFB71C8594380C005C17A4B /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 38FE998DBDEEBCE33949AAA9F3296550 /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - F100D41C0564EE46CA47DA9E3540DA70 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8255BF758512319BCEC8A9465100F12 /* BeNil.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - F2ED0A18E020A07A092F957B2C7EF0E2 /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 5CEECA1264E2048F119396D446D14C91 /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - F4BD351BF32EA4E81E2971E225914D1E /* Genome.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DAB4E6A2EB3A9C3629C2062F345461A /* Genome.swift */; }; - F5F8D1CB9DDF071F399D675E73649244 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */; }; - F6947DC02F61303F74AF8602F1A1BE68 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8F95C5A721744403DDF5D71E3B20A06 /* NSBundle+CurrentTestBundle.swift */; }; - F863E54F759068A89CD87B9121C7F6A0 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68FA4E20FBA69E54B8641FB7E2A67324 /* Configuration.swift */; }; - F96CD569B97BF947F19270C6C1D0FA23 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0841731251EEDE7ACA21267B1A8A673F /* ErrorUtility.swift */; }; - FAACCCDBE0D2785212E37468636AAB0A /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 424CEA9DC77FE5D725C9551F2ACAA8BA /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - FCB81A907C61E1883C282A0271C05D7E /* PointerUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCF0CD880E6B5A4F29D38A6CE05AAFA8 /* PointerUtilities.swift */; }; - FD9373DD3C1910FB513089F4CD39613B /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13CD84A26A08B3EC263D565FE02D7940 /* RaisesException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - FE877D0C3D6700F0C8E5CCC0C5020462 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 023DA655BA54CB7DEA97C57AD9725DDE /* Quick-dummy.m */; }; + 35C948170BDAB55532CB1F547389EA0C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */; }; + 3623C7E6A6B2657435DC80924EB8DE60 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FBB274627F3CCD45711698273E0F3E15 /* Quick-dummy.m */; }; + 36803D11BA838FB1E1D131AA6F366EB7 /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD2B7A69A92DA0BFAC01F38D57957048 /* NSString+C99ExtendedIdentifier.swift */; }; + 37B2802744DEADBC4FD37AF8E53EAE8C /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10276B77433F1E402AA83B42483AA81C /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 38987AF1005F71F197DE94320F9311A0 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F825E5C5C07AABCDF90FAD0630DA30B /* Extensions.swift */; }; + 3AD17A92405C1EF8A71E7B2A24C84170 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66977DC443BDBFD0C106D7A4F184AC01 /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3C12D78CF670FBEDBC28AA6ED303CBEA /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 691B44A14B74DB67BCC78D5ED07E8881 /* Async.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3C1C9BDF15626EB1AF76EDD10A87F2CA /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB876AD0511C8EA666EF8E4C0C08E306 /* ExampleHooks.swift */; }; + 3D166297C8E5CFF2F002B9CEC9D5C6F1 /* MLKit.h in Headers */ = {isa = PBXBuildFile; fileRef = DB4CCD4C09F2E233F7EA1F7876D2AF18 /* MLKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D3D94A184EB5C93F8887954BFB12C0B /* MatrixArithmetic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D5F1F566CEFFF34B2EDFA4761A30736 /* MatrixArithmetic.swift */; }; + 3D5F2F7E4A2DE9B43A8965BB56179E4A /* ValueArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3157754E17798B264F621373EBDE7CBB /* ValueArray.swift */; }; + 40A171EDCB95C2F32A957676476A25BC /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = B6C49FC9DB8F6D1AD5CE50C0A47653B7 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 40CD85252642CD7C44BEFA855FF493D4 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8E2F9F631419C82139E99139B7128F1 /* ExpectationMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 413C30B3D21CDEA27D0B380A677F42F1 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = F704A1EAB5E5CD9661BD1D9CBC759BB6 /* Expression.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 442F136F23EFE21E3975E58EB88FEA2C /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 743433A01B8BAF2AB26BE6DB7BA78D04 /* BeLessThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 44B5C5D451E86F04D22C0E2132D0424D /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FF09F25EDC45AF504AE7DB3E25153AC /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 46C3577F6C8DB66064E956935F063CB7 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC8D67D5F51E353FFEB079CCBB4185AB /* DSL.swift */; }; + 4998726555D0E6AC12D7683597D6F3F0 /* QuadraticType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952F2775024622B4796405322A6794DB /* QuadraticType.swift */; }; + 4A829DC29EC5600B259E1CA203C7131D /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EB6C1B9DCCA2688998730FBBEED6A1E /* AssertionRecorder.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 4B3023C8B818F53F59316503EA79812C /* SatisfyAllOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16606F3887D1DCD0FEBD520F792DA300 /* SatisfyAllOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 4D0E207D7B0997A03091983024832904 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EC6FB98BC9B9C5A27A8BF747A7F6C7E /* Configuration.swift */; }; + 502B570C39B2814E60BC55201BB02414 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E5C08A8967C75927DD6642B47902110B /* XCTest.framework */; }; + 50B22FA5505CE61D56DD50D37BF90FC0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */; }; + 512C40F8402C23DFF6D7C8616B4A752B /* RidgeRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3A75F0368092983A16979F80FBADF25 /* RidgeRegression.swift */; }; + 51CE8C2AEBC657C98FFC03B61E97B412 /* Upsurge-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 37945938F521BFB59BCF46DD7A0BF594 /* Upsurge-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51E8ED4E1C9624CEA91CE72E31A77352 /* Layer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CBDFC2C80E00FA020DA53C005E838C /* Layer.swift */; }; + 53DCB7202178EC5C3E6727168073391F /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12D4D8665E25B2D00E226E53BD267285 /* MatcherFunc.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 56C429A204D9FC3CA3E5B72C8E93EF9F /* ComplexArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DD06D99DA5CD87A0BF51FB6056AD802 /* ComplexArray.swift */; }; + 5D25D8140BE47BEDA9E07C8BB641BB4F /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9D615FAE0AA7C543BE7F92529CA1C1 /* Errors.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6021482B94C91267E84D163309B95763 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 34AC4F5E4E39D1C3AF89CEC5B360EA2D /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 608484BC82ED853B02509AFF26C1DAF7 /* SimpleLinearRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC4AC27D0E6B3366260B309A77BF1DEE /* SimpleLinearRegression.swift */; }; + 61554BF9F5D2997AD26BC61F4674CD68 /* Pods-MLKit_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E11A16A5E738A6972FCB39D12D520E9C /* Pods-MLKit_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 619CAC289E6EBE57D6AD4C6C4CA0CD17 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42C3D67146BDBA10CAC51CFD228F2FAB /* BeCloseTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6487761C38E6711E2C194CFDF3BF0447 /* Pods-MLKit_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6183EF695DE254CDFF2B81C50B41F244 /* Pods-MLKit_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 695BC1AED063402F2284EB3F846EBEB8 /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F7F2720A7CF251866B1B65971F0EA81 /* CwlMachBadInstructionHandler.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6A6894A8FD8E3A149E513F76A752EC91 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137AA47B11FCF8DFAD21FDBFDF07E50A /* Example.swift */; }; + 6A85BF50303C56690DD0B2B66CBADDA0 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC029CDED30DA7B2ABF33E6954B7EB6D /* World.swift */; }; + 6BD5954D6D97255245EFDA13D419F5D9 /* MatrixSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24359C2419BC40E913F7E18F66162068 /* MatrixSlice.swift */; }; + 6C761ED9AC2B10745751A1D07ADBFB5A /* MachineLeanringErrorEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = F138797CE87D370358418C683E65A0C8 /* MachineLeanringErrorEnum.swift */; }; + 6D35850AE79F6BB1812DB02D1D2C4B95 /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 482052EDFA9575D28D64E9549C44197E /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6F5BB0DEDCB97B6CA9BDC6E2BC894BCD /* LinearType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8DABCC737B4BE064BB957352D867302 /* LinearType.swift */; }; + 7322E5D673689B017FCF72610299ECF0 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC56E3DE936D1D3231E8D92095668DB8 /* ToSucceed.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 73913EBEE109B560765B9C354EE333DE /* QuickSpecBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F1DAF6BB9F55D39AF40337558D846AE /* QuickSpecBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 73EA7ECA35082C124EB45D82F12D027A /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5B2080DE017858E1C4F1180D226ADE5 /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 756A8D952F562DC0D1540F4E21EFEF56 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80DFF51CCA5EBBCE893D89BB5F3498AD /* MapKit.framework */; }; + 767D96C3DE8A33843E313EC5080E13C9 /* Real.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030A59ECDA8F7D3C591CE152B3BBBA87 /* Real.swift */; }; + 782667D2D5260BAEF7473BC258613D13 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D7DE08F4564DB849F36813C94F66821 /* HaveCount.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 7C01BD975A436D2AE25C109908B8E519 /* KMeans.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CE78F76EE57AA3351A3BDC2DF75A472 /* KMeans.swift */; }; + 835ED63895528314B94936A1222496AE /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 035C2EED1791B7BE6BE9D42969BAB1C9 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 854787B57491875DFF74CBA89571C9F6 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B05419F27BE1D11F326BDE23BEBF0E7 /* URL+FileName.swift */; }; + 86BE1B34AD7742A81064C43766751FC4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */; }; + 88F07F135909FB51B8B6DC3E564F94C9 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2D683B1F99B9F712F2EE56447823F6E /* Sequence.swift */; }; + 8995A017033F9847A868FA9B081471B7 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 0994970A2155ACFCCAF3F3AF8BE2E5CC /* QuickConfiguration.m */; }; + 8A5B774CBE0C649BD8AE0C6EBD802777 /* DataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788D53525A0B21F8BC8F27DDA78143E6 /* DataManager.swift */; }; + 8B4A8B4617BE1D9580BC7653ED4E3CCF /* Arithmetic.swift in Sources */ = {isa = PBXBuildFile; fileRef = D083DBFCD198E8DF228467AF0BB09175 /* Arithmetic.swift */; }; + 8BE24F68EE0482CBCA709E049318823A /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F737BB93131E723165509AE01FA5729 /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8E3B0618CF9A19EE391875415CDD1E2E /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 16E6DC1E5FD69A192A194383B26C8EC3 /* QCKDSL.m */; }; + 8F3D92A40D06F36E61FD7ED6FBEE69BC /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDF4EB4F151410D97C620DA409F22EFC /* SuiteHooks.swift */; }; + 90BA044032941979487072C733619240 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C03EEF29C5CE0126A004280345CEB5 /* BeIdenticalTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9108613C28FC0D1A7948C6B4FE64932F /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EC1ED54D7A581E3899A873412515A27A /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 924746047825777BE99D81F35E875981 /* Trigonometric.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B251496F77D014ADC2729BF32DC0756 /* Trigonometric.swift */; }; + 94299DD46562D02D0529FC16C10C39AF /* CSVReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 903B1867081A10809FA5BF96301EAC0E /* CSVReader.swift */; }; + 97E3A1B8E5B7EF1D2399B486FE63BCAB /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFC79DCAC3566B7A977FA02418445C5A /* ContainElementSatisfying.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9839BAE4DF6D8962D2BBE8E2DFDD1F08 /* Complex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AEA96C7D58C6932E550A8F5F49CDF2 /* Complex.swift */; }; + 9C3FBF83F72E03F08F977DFA1218B5F9 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 556B768D5C717E2EFDBF20FC039624F5 /* ThrowAssertion.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9CFDD01A2D0AA56E4A6C72B232021B71 /* Pods-MLKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DF85C3F736F31B6E3DB7DFC71BD097C4 /* Pods-MLKit_Tests-dummy.m */; }; + 9D2DB6D873E1BCB6FE2200D4328F675A /* Matrix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B26AC147A0657266508051439D0675F /* Matrix.swift */; }; + 9F05AD64FA1B9ED2EDD6C485C5E6D296 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9FE4D96E9551D946E8D2BB7312C0EBD /* QuickSelectedTestSuiteBuilder.swift */; }; + A03E49A483BD40BD3A8B943A8A963764 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47E4190D74012C482B496182A661F4C4 /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A0A56298A62CC7D47428EAADCB13E913 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B2D375478530E99780737CD66CD8DD93 /* QuickSpec.m */; }; + A3F6738E2A7AC46F9C8F091372EB9331 /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDE1009D96FFAEDC002FCE0D35C778CC /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A5A9F8A2E529DDE72AC3A69E1649B607 /* NeuralNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45944744A832416BF5020527CAD33A70 /* NeuralNetwork.swift */; }; + A5FC691080848921A6D86C349E32AFB3 /* MachineLearningKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9868FD249081AA56BD34C6162A6E0FB3 /* MachineLearningKit-dummy.m */; }; + A8F7AF423D60D84B30D46CA84A88819D /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = EED75267527D223ED50D65EC87059D48 /* DSL+Wait.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + AC0DC051DDF5D34B02E9A4938226F8FC /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 337B8D2516336668DC0F954A21611095 /* PostNotification.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + AE0F790B7BC316B1D8AE83B58753E213 /* Behavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = F127827C31D06829D019510F822834F7 /* Behavior.swift */; }; + AF504059860A2519D681686DC8C56D5A /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7849017A446FAAC1AA464BF30B3DB9A9 /* QuickTestSuite.swift */; }; + B034B1EA1C94BBDFFA3564E010A56A04 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D83F506716B92E26EDB9E77BE6F7159 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B0A24F0E24E02201A246F0D58523ED7E /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CA0DD982FBC2D3667E3DDA63B24456 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B0C88072D75620D68F7C690CF2CD2D92 /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = F0DA4837482BDAF49EE0CFC14E653077 /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B0CE1B8655743386970201D46EA88589 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 901B5CAA4EB5DC150DF830F34762A545 /* Equal.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B15E411FFF3E2AD78A5B5D6094B48AE3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */; }; + B3091203BBEFA70B87EAC5CCFB28E32C /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 52F937831EEA31D8B58ACEA667057BEE /* XCTestSuite+QuickTestSuiteBuilder.m */; }; + B4984DA0EF9EFB51A61EB447F969389D /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 147E17B49D366E81D21A0B73472E5A23 /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B51FCB764739D557C3BB3FDBE8107D39 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8FD5147603F141BD056C0756090B6F /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B76E5CB09EC007EED55BB57E320692AE /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C545BAF94B4B6AAF8AE48FFFFE1F791 /* Value.swift */; }; + B88F9184DF2ECC40C8EE0C63EDDCA197 /* Exponential.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E19E5E330F0B730F5C71B8F67C235DA /* Exponential.swift */; }; + B992D07E451C740A64C11452ADAC34C8 /* Population.swift in Sources */ = {isa = PBXBuildFile; fileRef = 169BC2DB3712E23D9A69F1AACCD762C0 /* Population.swift */; }; + BA65AB10ECCDF1B685D0BBDE49FF255F /* Auxiliary.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC04D0B55B2DF98E82BDFDBDAA249C23 /* Auxiliary.swift */; }; + BAABCE6AB9AC7ABC3C9A7CDF8A6FF8A7 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C80A7C25D576D1F551F878DBA6AF8C /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BAAD4E7A01DD015FCB6E2AE29462D2EE /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = E136F98E96561490178FBCFC9686F5E0 /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BB11FBD2359EF261F71F076ED124D8B1 /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B713FD278927D49885E1904255F064 /* Closures.swift */; }; + BB1F8C46AB981EA52FA280F8E2B8E4AB /* InputDataType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041AFB8E22C5AAD543EDA1F96A9BCBAB /* InputDataType.swift */; }; + BB85CDB5A7F9D7C9733ED9A3AFDBDEA2 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C54F7F18FAF0353E348C4DD3B716DB00 /* UIKit.framework */; }; + BDA66F64BCBE78B25D470F3184B50532 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0AFF316A4EDB73779600E89CF19632 /* NMBObjCMatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C09CE51A451E72D653FD4923A86EB852 /* LinearOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2912F84DAE219F366CB90C00C6248FA6 /* LinearOperators.swift */; }; + C7155137CD896EFAD562C90E1A461EE2 /* ValueArraySlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = D44A37484B179283B009A5229D427246 /* ValueArraySlice.swift */; }; + C83188A450E13A233EF77D94306E926D /* Pods-MLKit_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 26B0E28532E762E9902A82E87EC50B64 /* Pods-MLKit_Example-dummy.m */; }; + CA5821BE1C1F8E0CBC0D1330410FC7C0 /* Hyperbolic.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A0A7BD8FBCF34C54C12F615A32D045 /* Hyperbolic.swift */; }; + CC7D11A33BD4AC9581D2C01C28B26C1D /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF8ADAE9FEE03A3463D9A4A6E72AB360 /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + CD780F20B5B520C03C95726C6E23A4A1 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 489ECA679D24E54A6CC7B87EACD3D221 /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + CE0B2DB399E32E476CCC40B18DF1BD3E /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCBBC9C55535D0AC68C2CA15578DA91 /* HooksPhase.swift */; }; + D000AB338C568FBCCDFAF753350E1E6D /* ComplexArrayRealSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 144B5707254D157A52910519D2F17C8D /* ComplexArrayRealSlice.swift */; }; + D03B3661A806DB01D904EC24E59B7E2E /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 46BA399BDE1B6DE7B14C30EF6055327D /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + D0FF7942A83B866A85C4EEA65BE2A8BC /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 1142E838EF9E0ECBE2816DC30D200AF0 /* QuickSpecBase.m */; }; + D3F727B55FB86EA9C679DEC4ABF8C136 /* PolynomialRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = F107EA658C6B53E0B84DD2A10C8FCFE8 /* PolynomialRegression.swift */; }; + D4854F8569321A500968B34987FFFB30 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3463C2B70E2BDD90E3CE7FCAC5292630 /* Match.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + D4B3F9CB9B4FF5379324C4D94DE2B189 /* LassoRegression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A9832ABE1993F30F8D46161D2D60B7F /* LassoRegression.swift */; }; + D60BCC22E506E252B7F4C6E9675D7B57 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DC137D322A128441EBF52B5FFE5BE58 /* Filter.swift */; }; + D61297130E9E49830B044AA557E4A06F /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A9880E45E7F3B3785B9FBFF52CEAA60 /* ExampleGroup.swift */; }; + D69CEF312A13F98B8E5746A02F5A59AB /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 395A5303D2C1ED53000412E2C3DCF92D /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + D7540984B876954995215DBAFF52EF9B /* TensorSlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07E148306C6BA950FCA137CD27AEB033 /* TensorSlice.swift */; }; + D99EEA3143EABF137D39E3A97FFD84DE /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8E9ECD30E2954373F475721AA57A24C /* BeGreaterThanOrEqualTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DA2554FF0F87BDD44B56650B7C483B50 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7F1CBDC973E32E006EB9A8DCF2B225 /* World+DSL.swift */; }; + DCCC78645AB51BCBDC92B41E7178C5DA /* Genome.swift in Sources */ = {isa = PBXBuildFile; fileRef = 149C087BF5CF9736F9C47759977B4DCD /* Genome.swift */; }; + DE1AF2FCB9BD497D0A0D866D8895AC3A /* BiologicalProcessManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83BCF2F8D63C19C2434BD6853C915D86 /* BiologicalProcessManager.swift */; }; + DE4C1C79903A92287FD102F1E28C3A49 /* TensorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D75FB88DD2222A56D717AAF228FFE78 /* TensorType.swift */; }; + E638C6BA5AF87A5D632C0EF4EC935EDF /* DSP.swift in Sources */ = {isa = PBXBuildFile; fileRef = D18C3D56C8E6AC4C4D8AF2D71F127EC2 /* DSP.swift */; }; + E679DCFB9825A7B5B92CF584273D20F7 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C0B466BB0421312D8078CED0B71E6BE /* ErrorUtility.swift */; }; + E693ED027F354D0C0B26BA260073C5D1 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 038A760F895431B48CEA5B48437243EA /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E6B23012319D7A5969C414F36A2B5DEE /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 866F20B5ADA342A20100B077B4CC0F22 /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + E72A47B4B76741BE1090EED5A84F5A08 /* Upsurge-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DD537815AD750380E3798229FAB811 /* Upsurge-dummy.m */; }; + ED70B4997FC9EEA54B89CBFF3DCC27A9 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 335991C55FC2A3EEDDFE264BA0C64169 /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EDC4B37063B934740542A03374BE3DC7 /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96945A916008CD4B69F1E34AD69B7922 /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F02C4FA6C6F8D9B7C8FECB076DCEC9EE /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = C008229A23584B84BE1AE6061F6FBA63 /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F376FB1DBE7FB046CDA7388B7035FBB5 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = A521626B7302B082F1B39A00AA2C3A0C /* DSL.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F401580BB3F94199850EE085919D337B /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBE1188D696473745440C84BF05C42B7 /* Accelerate.framework */; }; + F5F7F03D04479B0EE47D69DF65EA53B6 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = C88ACC22A83253002DF3E9F48F72ECD0 /* BeginWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F6FD9357A3EF5F6736CC2AFA82520534 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 521B35F4C031ABE1E2E2EF830840542B /* SourceLocation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F714F0DD6B5353FBF76FA23B94519C4E /* MachineLearningKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 26B79A4758A80BCE9213C86BEFA1D243 /* MachineLearningKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F7AC37D64DE8E79CC8275835892F4490 /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B273D8C6E67454E52F2780AE08AFD37 /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F82D4E195C2879A141A4DA12CB912078 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30CFC567F8A1B22F61DC542426B15B60 /* Expectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F878F23B6132166302F83F543699B457 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */; }; + F969AEB2E68708B5A0B901C7EA6BBD93 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EC271834216A505262D80AF2EF61DE /* Functional.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + FAE9DB89C9544E5C56345A371A49F7FD /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = FADB247880A1DED3E6643AEE0F9D3216 /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + FD175D10EE7DBD2C7A83BF8BD9125329 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAFCD1EAB3A11FCBE8181968A1EF4DC /* Callsite.swift */; }; + FDADDA2F644E74CFFBC21DAE8B34D209 /* ComplexArraySlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FC20B789CA93B273E0BC1AA0AB7F7C /* ComplexArraySlice.swift */; }; + FF62BEF08E929321B76037A261B9D23C /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D926C598D07A72EACCD54FF65A67092A /* Nimble-dummy.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -182,26 +186,33 @@ remoteGlobalIDString = 6C57B4D688C9D6216427DD10ADDFFCB6; remoteInfo = Upsurge; }; - 6261E54E70518E4B80DE3D3A4B3823C4 /* PBXContainerItemProxy */ = { + 197D4E6B5F102611AC7352D8583E7BA3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 0921CC2F4398BE9A4F1CEACB30684B56; + remoteGlobalIDString = 0C900B9C11E235F9DF95A64E8C83D049; + remoteInfo = Quick; + }; + 61B7CC3502E6878E7FB482C64CEF9454 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = BA85E3619866E2EAA8CC3EDE21C659FC; remoteInfo = Nimble; }; - 9438A9C923DBE3D0619348D344A7421F /* PBXContainerItemProxy */ = { + 80173E14C71EB3A528D671C26839B22F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 28C1C0C2E20677EBC9884E8E60383F6C; - remoteInfo = MachineLearningKit; + remoteGlobalIDString = 11214F2158317CCF8497B1AFC05251A3; + remoteInfo = "Pods-MLKit_Example"; }; - A5D12A1484F74731661DDE4440445475 /* PBXContainerItemProxy */ = { + 9438A9C923DBE3D0619348D344A7421F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 405857F01F82B80417D1BCAA762E7FA5; - remoteInfo = Quick; + remoteGlobalIDString = 28C1C0C2E20677EBC9884E8E60383F6C; + remoteInfo = MachineLearningKit; }; C595E3A155D1433C52691795FEC29880 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; @@ -213,205 +224,212 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 012916E1116F4F544559C4FFCDD0D170 /* Auxiliary.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Auxiliary.swift; path = Source/Operations/Auxiliary.swift; sourceTree = ""; }; - 023DA655BA54CB7DEA97C57AD9725DDE /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; - 02862E2FB988A3D26C860CD548A14BEB /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; - 05BA3CAD29488F2C5317D831BB6931BF /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; - 077C0519A2057F471035D14A7027344E /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; - 07FB5885E183C905F1B353BA590212F0 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; - 0841731251EEDE7ACA21267B1A8A673F /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; - 0874FE88223748474F9540CC3A7B2CDD /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; - 08D39735D7DBDB3A52B19BB1A1BEAD08 /* Pods-MLKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-MLKit_Example.modulemap"; sourceTree = ""; }; - 0912AB47C2FD8B724C2FF78EB04DA146 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; - 09DB8A700464608EEC997EB8F70F5A97 /* RidgeRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RidgeRegression.swift; sourceTree = ""; }; - 0AB6F2F34E76936E5DCD781D737E8D0E /* Tensor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Tensor.swift; path = Source/ND/Tensor.swift; sourceTree = ""; }; - 0C3B0FE4A67C53BAE82ACF00A907244A /* LinearOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinearOperators.swift; path = Source/1D/LinearOperators.swift; sourceTree = ""; }; - 0D765DA753FAB21A06C81689DCF49863 /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; - 0EB98267420E501E4F7B0573E2C5F96F /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; - 0FB8099238DE7DDCFE3FE4C07E86CF1E /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; - 1210BE3C711459C58AE9F743F7B82931 /* ComplexArrayRealSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArrayRealSlice.swift; path = Source/Complex/ComplexArrayRealSlice.swift; sourceTree = ""; }; - 124FF2A96FE15393763BC63572EEC184 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; - 13CD84A26A08B3EC263D565FE02D7940 /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; - 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 162303716510B6A1AC25BFD0F74F2544 /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; - 16D03C36A6892F0A0BA80E3B43181599 /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; - 19D06F6EACA4C3A8FB660F983B8C2500 /* ValueArraySlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ValueArraySlice.swift; path = Source/1D/ValueArraySlice.swift; sourceTree = ""; }; - 1C9E249A32DD13B27BA05B3CDE01B22E /* TensorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TensorType.swift; path = Source/ND/TensorType.swift; sourceTree = ""; }; + 0072087E9838D243ABAAAB182449A157 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 030A59ECDA8F7D3C591CE152B3BBBA87 /* Real.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Real.swift; path = Sources/Upsurge/Real.swift; sourceTree = ""; }; + 035C2EED1791B7BE6BE9D42969BAB1C9 /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; + 0365A681452A1DA13C0E39C5DC0675EB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 038A760F895431B48CEA5B48437243EA /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; + 041AFB8E22C5AAD543EDA1F96A9BCBAB /* InputDataType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InputDataType.swift; sourceTree = ""; }; + 04B8E32AD23B2D12CA57341D936CAB3A /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; + 07E148306C6BA950FCA137CD27AEB033 /* TensorSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TensorSlice.swift; path = Sources/Upsurge/TensorSlice.swift; sourceTree = ""; }; + 0994970A2155ACFCCAF3F3AF8BE2E5CC /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; + 0B05419F27BE1D11F326BDE23BEBF0E7 /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = ""; }; + 10276B77433F1E402AA83B42483AA81C /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; + 103DE453E6596254E367B645D93B900C /* Pods-MLKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Tests.debug.xcconfig"; sourceTree = ""; }; + 1142E838EF9E0ECBE2816DC30D200AF0 /* QuickSpecBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpecBase.m; path = Sources/QuickSpecBase/QuickSpecBase.m; sourceTree = ""; }; + 12D4D8665E25B2D00E226E53BD267285 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; + 137AA47B11FCF8DFAD21FDBFDF07E50A /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; + 144B5707254D157A52910519D2F17C8D /* ComplexArrayRealSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArrayRealSlice.swift; path = Sources/Upsurge/ComplexArrayRealSlice.swift; sourceTree = ""; }; + 147E17B49D366E81D21A0B73472E5A23 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; + 149C087BF5CF9736F9C47759977B4DCD /* Genome.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Genome.swift; sourceTree = ""; }; + 16606F3887D1DCD0FEBD520F792DA300 /* SatisfyAllOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAllOf.swift; path = Sources/Nimble/Matchers/SatisfyAllOf.swift; sourceTree = ""; }; + 169BC2DB3712E23D9A69F1AACCD762C0 /* Population.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Population.swift; sourceTree = ""; }; + 16E6DC1E5FD69A192A194383B26C8EC3 /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; + 197CCEAC9008FEF55260A0F2FF0C7B32 /* Span.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Span.swift; path = Sources/Upsurge/Span.swift; sourceTree = ""; }; 1CA1E0D7EDD11FD11C55B7AC425EA02C /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Quick.framework; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1CFC980E2966F69FA4D771EB69B2072A /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; - 1DAB4E6A2EB3A9C3629C2062F345461A /* Genome.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Genome.swift; sourceTree = ""; }; - 2002FFD090C435360F60A33E88C41DBB /* Pods-MLKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MLKit_Tests-acknowledgements.markdown"; sourceTree = ""; }; - 20BF642EFEB79518E353D7F8F3D860F1 /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.h; sourceTree = ""; }; - 224B74EEB01665D46840260470EA4991 /* BiologicalProcessManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiologicalProcessManager.swift; sourceTree = ""; }; - 227DDFCD5D9F3918AB624B74E886C8A5 /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; - 24D478FE2127475CABEE5C5AE5B9772D /* Hyperbolic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Hyperbolic.swift; path = Source/Operations/Hyperbolic.swift; sourceTree = ""; }; - 256AA66B0C109C259E2D0DDA42B32EDB /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; - 26788572C6F366401AFEC63C14A45513 /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; - 27B970E9789C66FDD4D00112E12E321A /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; + 1D83F506716B92E26EDB9E77BE6F7159 /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; + 1F1DAF6BB9F55D39AF40337558D846AE /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickSpecBase/include/QuickSpecBase.h; sourceTree = ""; }; + 2166FFC06EE0F270A009284D29A4995A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 21FC20B789CA93B273E0BC1AA0AB7F7C /* ComplexArraySlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArraySlice.swift; path = Sources/Upsurge/ComplexArraySlice.swift; sourceTree = ""; }; + 24359C2419BC40E913F7E18F66162068 /* MatrixSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatrixSlice.swift; path = Sources/Upsurge/MatrixSlice.swift; sourceTree = ""; }; + 24B713FD278927D49885E1904255F064 /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; + 26B0E28532E762E9902A82E87EC50B64 /* Pods-MLKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MLKit_Example-dummy.m"; sourceTree = ""; }; + 26B79A4758A80BCE9213C86BEFA1D243 /* MachineLearningKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MachineLearningKit-umbrella.h"; sourceTree = ""; }; 289B26827495B1EA15C10A9AFE473C7A /* Upsurge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Upsurge.framework; path = Upsurge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2912F84DAE219F366CB90C00C6248FA6 /* LinearOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinearOperators.swift; path = Sources/Upsurge/LinearOperators.swift; sourceTree = ""; }; 29E88E2BB63028C27C1E53746F101DF7 /* Upsurge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Upsurge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2C176355D2DA1EB17207AE84594804D6 /* Pods-MLKit_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Tests-resources.sh"; sourceTree = ""; }; - 2D3E3057A07EA15E4008F933E8752DD2 /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = ""; }; - 2D60404BA78CC7BF6C1144F008DDDDBC /* MachineLearningKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MachineLearningKit-dummy.m"; sourceTree = ""; }; - 32AA223B57196F7790D905F38D2517BF /* Pods-MLKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Tests.debug.xcconfig"; sourceTree = ""; }; - 33447FAB1F2844FCF376B75EB97C4666 /* SimpleLinearRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SimpleLinearRegression.swift; sourceTree = ""; }; - 383A4DC8ACFD6B49ECF2DFE23764A2D3 /* DSP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSP.swift; path = Source/DSP/DSP.swift; sourceTree = ""; }; - 38FE998DBDEEBCE33949AAA9F3296550 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; - 3949269DDD43CCFF544917979779224B /* CwlCatchBadInstruction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchBadInstruction.h; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.h; sourceTree = ""; }; - 3A0C56CEE8C3AD43FF8AE40F6AFFF4C7 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; - 3A2A011722B21DE42A32C785BC89EA01 /* MatrixArithmetic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatrixArithmetic.swift; path = Source/2D/MatrixArithmetic.swift; sourceTree = ""; }; - 3A46C9CABC6D7C94BE0864668B74F949 /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; - 3AE3D8AECCC1ACCEA8F2C3B88B7A5070 /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; - 3AFFFEB5837A94482C2215EB9EFEEEDD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 3C9A0B54C6BC094E3CD3A2A61EDA9D85 /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; - 3D34DA76C844CF16C054BA1344541C74 /* Pods-MLKit_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Example-resources.sh"; sourceTree = ""; }; - 3D5025AF8F620B99C3283F0975D09FE3 /* Pods-MLKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MLKit_Example-dummy.m"; sourceTree = ""; }; - 3EB4893036DEB2A1EB8B6111A120F5A2 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; - 40FFCF7710FDE9792C5747C276F2DF4F /* CwlCatchException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; - 424CEA9DC77FE5D725C9551F2ACAA8BA /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; - 436FD53B1F1C37D3650BE5FE2C882A5E /* LassoRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LassoRegression.swift; sourceTree = ""; }; - 440AC79C4CAC00E64494654CCFEB3615 /* Pods-MLKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Tests.release.xcconfig"; sourceTree = ""; }; - 445AD67BD05424A184443D2B95D450E1 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; - 460AA53800E69CBD26BBD78537857F1E /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; - 46306D0BBA1452AFEA95521C31EF74FD /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; - 477B34BD1FFA8820D6EF220B0BC0118F /* DataManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataManager.swift; sourceTree = ""; }; - 494C0F635D5836E872EF3C5A39E97D40 /* QuadraticType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuadraticType.swift; path = Source/2D/QuadraticType.swift; sourceTree = ""; }; - 4A6452D2CC7C17DD01ECD91742AF746F /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; - 4A7F3D729C82E75AB35940B80EDE5960 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; - 4C397B78C2E0CE51B2767D2AF1CD9817 /* Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; - 4F8B6CE41AAC2E1823ECFFB4021CC6E2 /* NeuralNetwork.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NeuralNetwork.swift; sourceTree = ""; }; - 50F4D75F4A1D2B2E24633488475931A3 /* CwlCatchException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.h; sourceTree = ""; }; - 538A45E8224CD67C4262A9B8B8F1F37D /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; - 5480FBA1F6D203291F193F6D19878DBA /* Upsurge-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Upsurge-umbrella.h"; sourceTree = ""; }; - 55F8E5E39CFFED8C8B0162606918FB20 /* MachineLearningKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MachineLearningKit.xcconfig; sourceTree = ""; }; - 564EE9F32DE4725529A52326B19EA90F /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = ""; }; - 56C0D020BB9A8FA4BD0F26AC76A2E14A /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; + 2D7DE08F4564DB849F36813C94F66821 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; + 2E5093D5F993BB458C93C325732AC182 /* PointerUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerUtilities.swift; path = Sources/Upsurge/PointerUtilities.swift; sourceTree = ""; }; + 30C1619989EFFEFB685F646D70830431 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 30CFC567F8A1B22F61DC542426B15B60 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; + 3157754E17798B264F621373EBDE7CBB /* ValueArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ValueArray.swift; path = Sources/Upsurge/ValueArray.swift; sourceTree = ""; }; + 335991C55FC2A3EEDDFE264BA0C64169 /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h; sourceTree = ""; }; + 337B8D2516336668DC0F954A21611095 /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; + 3463C2B70E2BDD90E3CE7FCAC5292630 /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; + 34AC4F5E4E39D1C3AF89CEC5B360EA2D /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; + 37945938F521BFB59BCF46DD7A0BF594 /* Upsurge-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Upsurge-umbrella.h"; sourceTree = ""; }; + 38E6B7D825EED250A8A2E507119F4709 /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; + 395A5303D2C1ED53000412E2C3DCF92D /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; + 3A9832ABE1993F30F8D46161D2D60B7F /* LassoRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LassoRegression.swift; sourceTree = ""; }; + 3CCBBC9C55535D0AC68C2CA15578DA91 /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; + 3D75FB88DD2222A56D717AAF228FFE78 /* TensorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TensorType.swift; path = Sources/Upsurge/TensorType.swift; sourceTree = ""; }; + 3DAFCD1EAB3A11FCBE8181968A1EF4DC /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; + 42C3D67146BDBA10CAC51CFD228F2FAB /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; + 45944744A832416BF5020527CAD33A70 /* NeuralNetwork.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NeuralNetwork.swift; sourceTree = ""; }; + 46BA399BDE1B6DE7B14C30EF6055327D /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; + 47E4190D74012C482B496182A661F4C4 /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; + 482052EDFA9575D28D64E9549C44197E /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = ""; }; + 489ECA679D24E54A6CC7B87EACD3D221 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; + 4B251496F77D014ADC2729BF32DC0756 /* Trigonometric.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Trigonometric.swift; path = Sources/Upsurge/Trigonometric.swift; sourceTree = ""; }; + 4BF613065B011698DDBE313953239BF2 /* ComplexArithmetic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArithmetic.swift; path = Sources/Upsurge/ComplexArithmetic.swift; sourceTree = ""; }; + 4C9D615FAE0AA7C543BE7F92529CA1C1 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; + 4F825E5C5C07AABCDF90FAD0630DA30B /* Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; + 508C55FD4AE738ACC7274ADDBEB2028E /* Upsurge.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Upsurge.modulemap; sourceTree = ""; }; + 50C03EEF29C5CE0126A004280345CEB5 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; + 521B35F4C031ABE1E2E2EF830840542B /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; + 52F937831EEA31D8B58ACEA667057BEE /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; + 556B768D5C717E2EFDBF20FC039624F5 /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = ""; }; 57189BBB8E0A886933E15F0E294E2908 /* Pods_MLKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_MLKit_Tests.framework; path = "Pods-MLKit_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 5CEECA1264E2048F119396D446D14C91 /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mach_excServer.c; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/mach_excServer.c; sourceTree = ""; }; - 5ECF49E5836E9754AAF942842CE1B960 /* MachineLearningKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MachineLearningKit-umbrella.h"; sourceTree = ""; }; - 6030DF38EBDBF336FFAE0120EEA4D959 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; - 60979E4BD68DB0DE4501D0BCC7234D91 /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; - 617F2E0CEEF4C400A8D6EADD86F6145C /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; - 632231BFC26E16C229D32687B917D3A0 /* Trigonometric.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Trigonometric.swift; path = Source/Operations/Trigonometric.swift; sourceTree = ""; }; - 636673BDA1F06E469643F565D84270B5 /* Pods-MLKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Example.debug.xcconfig"; sourceTree = ""; }; - 64BEBE3A1D4FF0196925EEA64015469B /* World.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = World.h; path = Sources/QuickObjectiveC/World.h; sourceTree = ""; }; - 674822B4E356741B78B38B007C88BB9C /* MatrixSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatrixSlice.swift; path = Source/2D/MatrixSlice.swift; sourceTree = ""; }; - 67BD782939C66E9C3619A77243519BF6 /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; - 68FA4E20FBA69E54B8641FB7E2A67324 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; - 692BA097D08B9592A8A24370C50D81D0 /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; - 6E5F3C7C7DEC67A40AB30E806AC7D1E2 /* Pods-MLKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MLKit_Example-acknowledgements.markdown"; sourceTree = ""; }; - 6F7958F9886E618114345F800A8E55FF /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; - 711A9AC0701A2E08E65DD82429B871BA /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; - 7264F4D0435F000E2684EB1DAACEBDD1 /* CSVReader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CSVReader.swift; sourceTree = ""; }; - 761E70C09096AF7E9F07C0940571D8E8 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 76A2C52BB2BC141539B6A02006AE6422 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Source/Types/Value.swift; sourceTree = ""; }; - 7738AD08C39FE55EBEED43F72217AD23 /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; - 79862A111E88CCA41E254825B0A2B523 /* NSString+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSString+C99ExtendedIdentifier.swift"; path = "Sources/Quick/NSString+C99ExtendedIdentifier.swift"; sourceTree = ""; }; - 7A45BA6EC001C35D2D0B9BFE6072BD59 /* Population.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Population.swift; sourceTree = ""; }; - 7CCCA0D5F8BB724A0B342E39C887F56C /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; - 851E4FB881FC4ED5D39D0CBCB7DAA845 /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; - 8696FA5715205A2FE823260539588590 /* FFT.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FFT.swift; path = Source/DSP/FFT.swift; sourceTree = ""; }; - 895545B440ABA73C074838125D4DDCD5 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; - 8AAD299764DE8C9B43BA8AFF5C36053F /* ValueArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ValueArray.swift; path = Source/1D/ValueArray.swift; sourceTree = ""; }; - 8AB15E15A6C417380F4BDE4F104E73FA /* LinearType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinearType.swift; path = Source/1D/LinearType.swift; sourceTree = ""; }; - 8B964EBE2CDB51FDD20A12FCFCB2CA92 /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; + 5939A7201581DF730418B213139A659D /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; + 5981D3D86D2E06AC38A3978635C9DED8 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; + 5D5F1F566CEFFF34B2EDFA4761A30736 /* MatrixArithmetic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatrixArithmetic.swift; path = Sources/Upsurge/MatrixArithmetic.swift; sourceTree = ""; }; + 5E704933645FA99C8E634547C49786E9 /* Interval.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Interval.swift; path = Sources/Upsurge/Interval.swift; sourceTree = ""; }; + 5F737BB93131E723165509AE01FA5729 /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; + 6183EF695DE254CDFF2B81C50B41F244 /* Pods-MLKit_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MLKit_Tests-umbrella.h"; sourceTree = ""; }; + 66977DC443BDBFD0C106D7A4F184AC01 /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; + 691B44A14B74DB67BCC78D5ED07E8881 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; + 6A9880E45E7F3B3785B9FBFF52CEAA60 /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; + 6B26AC147A0657266508051439D0675F /* Matrix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Matrix.swift; path = Sources/Upsurge/Matrix.swift; sourceTree = ""; }; + 6D6EB106E4321D22F26A52B5B8DE64CD /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; + 6EB6C1B9DCCA2688998730FBBEED6A1E /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; + 6FB3756871335B5449117CCB19CAA652 /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Quick.modulemap; sourceTree = ""; }; + 71F3393CED3AA91406E2F69CC8918BB8 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nimble.modulemap; sourceTree = ""; }; + 7285349CCF57C337C73827A7D17A9CEF /* FFT.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FFT.swift; path = Sources/Upsurge/FFT.swift; sourceTree = ""; }; + 743433A01B8BAF2AB26BE6DB7BA78D04 /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; + 74ADF229929EC6D9711C899553BE6EE1 /* Pods-MLKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Example-frameworks.sh"; sourceTree = ""; }; + 76B89ABEC28DF672A809E705A4840A93 /* Pods-MLKit_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Example-resources.sh"; sourceTree = ""; }; + 7849017A446FAAC1AA464BF30B3DB9A9 /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; + 788D53525A0B21F8BC8F27DDA78143E6 /* DataManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataManager.swift; sourceTree = ""; }; + 78E63F59786E0FA12C7D604E0A89EA14 /* Pods-MLKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MLKit_Tests-acknowledgements.plist"; sourceTree = ""; }; + 7A0D4F1E4771931E554C14EBD530BBF0 /* Pods-MLKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MLKit_Example-acknowledgements.markdown"; sourceTree = ""; }; + 7B273D8C6E67454E52F2780AE08AFD37 /* CwlCatchException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; + 7C545BAF94B4B6AAF8AE48FFFFE1F791 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Sources/Upsurge/Value.swift; sourceTree = ""; }; + 7DC137D322A128441EBF52B5FFE5BE58 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; + 7F7F2720A7CF251866B1B65971F0EA81 /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlMachBadInstructionHandler.m; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m; sourceTree = ""; }; + 7F87494EB08182EBB6C6DFC0A40EDE44 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 80DFF51CCA5EBBCE893D89BB5F3498AD /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; + 82120BC34AAA8690AB35CBC4292002FC /* Pods-MLKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Tests.release.xcconfig"; sourceTree = ""; }; + 83BCF2F8D63C19C2434BD6853C915D86 /* BiologicalProcessManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BiologicalProcessManager.swift; sourceTree = ""; }; + 84AEA96C7D58C6932E550A8F5F49CDF2 /* Complex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Complex.swift; path = Sources/Upsurge/Complex.swift; sourceTree = ""; }; + 864DD86938280C9A69C5A1E4B9663C84 /* MachineLearningKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = MachineLearningKit.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 8652DE537D4205F41CABDA2982BA1C25 /* Tensor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Tensor.swift; path = Sources/Upsurge/Tensor.swift; sourceTree = ""; }; + 866F20B5ADA342A20100B077B4CC0F22 /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mach_excServer.c; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; + 8964581D635112603B39EFBBF40DE387 /* Pods-MLKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-MLKit_Example.modulemap"; sourceTree = ""; }; + 8989F80BF9DE58885C888CAF78A4C095 /* Upsurge.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Upsurge.xcconfig; sourceTree = ""; }; + 89EF396CF1EE4E75AD050BDF3EC68560 /* Predicate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Predicate.swift; path = Sources/Nimble/Matchers/Predicate.swift; sourceTree = ""; }; + 8C0B466BB0421312D8078CED0B71E6BE /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; + 8CAC8E3CABDE963E50CBC99B73B23A2D /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; + 8CE78F76EE57AA3351A3BDC2DF75A472 /* KMeans.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KMeans.swift; sourceTree = ""; }; 8D5D6E6E6D3B6CCBD5B8D01D78A6C3A1 /* MachineLearningKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MachineLearningKit.framework; path = MachineLearningKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8E2478F9C2B8F6A4FD3E290EB66D2967 /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; - 8F643B28D12D7235D05A86D94E704075 /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; - 904FEA0622628AADB1CA02AA57ED1A48 /* TensorSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TensorSlice.swift; path = Source/ND/TensorSlice.swift; sourceTree = ""; }; - 918BC97B218D0A8A64BDD621B91F9069 /* Upsurge-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Upsurge-prefix.pch"; sourceTree = ""; }; - 922D9654CE04819948A343CA3B1429F3 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException/CwlCatchException.m; sourceTree = ""; }; + 8DD06D99DA5CD87A0BF51FB6056AD802 /* ComplexArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArray.swift; path = Sources/Upsurge/ComplexArray.swift; sourceTree = ""; }; + 8E19E5E330F0B730F5C71B8F67C235DA /* Exponential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Exponential.swift; path = Sources/Upsurge/Exponential.swift; sourceTree = ""; }; + 8EC6FB98BC9B9C5A27A8BF747A7F6C7E /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; + 901B5CAA4EB5DC150DF830F34762A545 /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; + 903B1867081A10809FA5BF96301EAC0E /* CSVReader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CSVReader.swift; path = MLKit/Classes/CSVReader.swift; sourceTree = ""; }; + 91CFF7338D8B2EFEE0292C206A40EE84 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + 92787D690F848868A35127DDA567E382 /* Pods-MLKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-MLKit_Tests-acknowledgements.markdown"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 93BD78CE597862CCAAF3A214DF9A8D46 /* Interval.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Interval.swift; path = Source/Types/Interval.swift; sourceTree = ""; }; - 93DE7AC6CBCC1E15E3EC4491A5B45D7C /* KMeans.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = KMeans.swift; sourceTree = ""; }; - 94F560C6B000B2C3D6E49CCFD3562B68 /* MachineLearningKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MachineLearningKit-prefix.pch"; sourceTree = ""; }; - 95FD3F8CEA2A60510B93CE50FFDAEC43 /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; - 9624E19BE6F7377A79FB879764B1B1DE /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; - 97CC96CA68BA0815524C996D3FD7D4C8 /* ActivationFunctionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivationFunctionType.swift; sourceTree = ""; }; - 985F35A8C7BB37C0852C7E45F32619DA /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; - 98C52913DD43FF732C4CB0156035175F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9951688C60A46DD572589F5DACF0C4A5 /* Pods-MLKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MLKit_Example-umbrella.h"; sourceTree = ""; }; - 99A3B4EC6DA19FEADCCDCA96CA327574 /* Span.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Span.swift; path = Source/ND/Span.swift; sourceTree = ""; }; - 9AEF9A30B4EAA4E623AC004398637120 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/MapKit.framework; sourceTree = DEVELOPER_DIR; }; - 9B8C04FE82A09C3FC32594EBFC743E53 /* PolynomialRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PolynomialRegression.swift; sourceTree = ""; }; - 9C13EEF6CE7B8665E06332AD77882466 /* 2DTensorSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = 2DTensorSlice.swift; path = Source/2D/2DTensorSlice.swift; sourceTree = ""; }; - 9C6B6A08749A762D9174E03E4409BD8E /* Pods-MLKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Example-frameworks.sh"; sourceTree = ""; }; - 9D128A10EA2E300A21235B91F63A2AA3 /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickSpecBase/include/QuickSpecBase.h; sourceTree = ""; }; - 9D3A07F4F6A05CA6A00CF85FDA94AB57 /* Pods-MLKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MLKit_Tests-dummy.m"; sourceTree = ""; }; - 9E0EB0151B5DDBCEC7706C08CB3F6D0A /* ComplexArithmetic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArithmetic.swift; path = Source/Complex/ComplexArithmetic.swift; sourceTree = ""; }; - 9E6576B5347A8A01F10941469B1EA3EB /* MachineLeanringErrorEnum.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MachineLeanringErrorEnum.swift; sourceTree = ""; }; - 9F2FFA2871232A17F74D97604A516636 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; - A6F138A9EBF54B5A06DCE9CD171D6071 /* Pods-MLKit_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MLKit_Tests-umbrella.h"; sourceTree = ""; }; - A7A7DD8570BF793B588ADA5EE940E963 /* Pods-MLKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MLKit_Tests-acknowledgements.plist"; sourceTree = ""; }; - A7EC0E4FEBE039947272C3B4A867BE43 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; - A8255BF758512319BCEC8A9465100F12 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; - A9C1D721B2C6C17E12FA8322E6E16682 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; - ABF3645F0FF96B3623FC6818DA9B5E03 /* Pods-MLKit_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Tests-frameworks.sh"; sourceTree = ""; }; - AD94BC820DCB168006B7673EF857A635 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AF83868F61F3BD4402D23052FDEA773A /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; - B05A2B00A7660C87F990F90901BB61C2 /* Real.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Real.swift; path = Source/Types/Real.swift; sourceTree = ""; }; - B8F95C5A721744403DDF5D71E3B20A06 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; - B90161234C0D9C58144F0D114775D3E8 /* Matrix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Matrix.swift; path = Source/2D/Matrix.swift; sourceTree = ""; }; - B9D3FED038BE3338641A141732755B00 /* QuickSpecBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpecBase.m; path = Sources/QuickSpecBase/QuickSpecBase.m; sourceTree = ""; }; - BA8E6B68CD5B9186B6EC6647BF81A356 /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; - BA9401876190B7BA1B70B7A9752180D5 /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CurrentTestCaseTracker.h; path = Sources/NimbleObjectiveC/CurrentTestCaseTracker.h; sourceTree = ""; }; + 943AC779D543443D52F1E0E5A33E7E8F /* MachineLearningKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MachineLearningKit.xcconfig; sourceTree = ""; }; + 944520EB51852FB71B9B018254FCB428 /* MachineLearningKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MachineLearningKit.modulemap; sourceTree = ""; }; + 952F2775024622B4796405322A6794DB /* QuadraticType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuadraticType.swift; path = Sources/Upsurge/QuadraticType.swift; sourceTree = ""; }; + 96945A916008CD4B69F1E34AD69B7922 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; + 9774CA86DF8D2DC26C4830B97504FBD6 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; + 9868FD249081AA56BD34C6162A6E0FB3 /* MachineLearningKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MachineLearningKit-dummy.m"; sourceTree = ""; }; + 99AE607EC3AE432038B8D01ED43874F5 /* ActivationFunctionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ActivationFunctionType.swift; sourceTree = ""; }; + 99CBDFC2C80E00FA020DA53C005E838C /* Layer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Layer.swift; sourceTree = ""; }; + 9B8FD5147603F141BD056C0756090B6F /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; + 9D7A706141B0D9509964E0CB47AA457C /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; + 9F0AFF316A4EDB73779600E89CF19632 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; + 9FF09F25EDC45AF504AE7DB3E25153AC /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; + A521626B7302B082F1B39A00AA2C3A0C /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; + A859BC8BAFA1A204B91C3D70FD7A64A6 /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; + A8A0A7BD8FBCF34C54C12F615A32D045 /* Hyperbolic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Hyperbolic.swift; path = Sources/Upsurge/Hyperbolic.swift; sourceTree = ""; }; + A8E9ECD30E2954373F475721AA57A24C /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; + B1AE425ACC355E279BDA5F98580C7CA4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B2D375478530E99780737CD66CD8DD93 /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; + B2D683B1F99B9F712F2EE56447823F6E /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = Sources/Upsurge/Sequence.swift; sourceTree = ""; }; + B3C80A7C25D576D1F551F878DBA6AF8C /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; + B621E050BD878B9F6C3BBA0EDA15F0B0 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; + B6C49FC9DB8F6D1AD5CE50C0A47653B7 /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; + B70FD9CD88E839C57AEB90CE095321E4 /* Pods-MLKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Example.debug.xcconfig"; sourceTree = ""; }; + B9B1A75006593B42ED0AC43E5AF1A6C4 /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlPreconditionTesting.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h; sourceTree = ""; }; + B9FE4D96E9551D946E8D2BB7312C0EBD /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; BC1FE7307C927E1E6A92842F57E0C7C9 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nimble.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - BE29DF31652B34FA490E23487B83FBEE /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; - C00D1260FC691D4C91B5C7B0C1E51CED /* Exponential.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Exponential.swift; path = Source/Operations/Exponential.swift; sourceTree = ""; }; - C0CED4BACCDE5B346DA1AF62EB6AF781 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; - C17505640C9782BB9C72471DFBF96025 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; - C22F81E5621CF7F9199426C6B30396E0 /* Layer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Layer.swift; sourceTree = ""; }; - C3523CB10A94DA7970870A6190C1CB1C /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; - C77F9745A1AEE0419DE285232F7A4B46 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; - C7E15AEC4FF3B6933962B82D62626FC0 /* Pods-MLKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-MLKit_Tests.modulemap"; sourceTree = ""; }; - CA483EF72520B01CF4A81ED38901CC64 /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; + BC4AC27D0E6B3366260B309A77BF1DEE /* SimpleLinearRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SimpleLinearRegression.swift; sourceTree = ""; }; + BD2B7A69A92DA0BFAC01F38D57957048 /* NSString+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSString+C99ExtendedIdentifier.swift"; path = "Sources/Quick/NSString+C99ExtendedIdentifier.swift"; sourceTree = ""; }; + BF556D4573DC7F987D53D889524FE92C /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; + C008229A23584B84BE1AE6061F6FBA63 /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; + C1EC271834216A505262D80AF2EF61DE /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; + C3CA0DD982FBC2D3667E3DDA63B24456 /* CwlCatchException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h; sourceTree = ""; }; + C4DD537815AD750380E3798229FAB811 /* Upsurge-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Upsurge-dummy.m"; sourceTree = ""; }; + C54F7F18FAF0353E348C4DD3B716DB00 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + C62DBF5F4F814CA68B3097F0248FB2ED /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; + C86BC4FC4C5A0AC48D066EA367D9F1A1 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; + C88ACC22A83253002DF3E9F48F72ECD0 /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; + C8DABCC737B4BE064BB957352D867302 /* LinearType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinearType.swift; path = Sources/Upsurge/LinearType.swift; sourceTree = ""; }; + CA5D01A26D43913794F56D3A7971FF5E /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; + CA6E390EC13AA8DFEFCF8F64F83ED7F0 /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; CA785AB3A9A0B1FEB1F8D8297A1DEB72 /* Pods_MLKit_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_MLKit_Example.framework; path = "Pods-MLKit_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - CABE7AA02D1F045430D6A230BD3B4C19 /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; - CAC74302C6BE8BE111885420D68AEFA2 /* MachineLearningKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = MachineLearningKit.modulemap; sourceTree = ""; }; - CACBB118DD81CDBEFB6559A57C883F50 /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Quick.modulemap; sourceTree = ""; }; - CC69007AFC0A65564291043D24B15E3D /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; - CC698E9958DEF380C0198EAA773F7DFF /* Pods-MLKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Example.release.xcconfig"; sourceTree = ""; }; - CD25694F61A3303C6994E49FD926F60C /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; - CE766189385F7E575AD7202D0316AFFC /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - CE7B423E7D950D806D1D781D4D9FC8B1 /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; - CECAF283BF4E0E908EDD2145F46A956C /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; - CFF92402EDA16EB6806DBA1684B4C0F0 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Nimble.modulemap; sourceTree = ""; }; - D04D296FB2AE0035E8400F25EBD3EF4B /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; - D1601B2905CD07F5813DA81623EDCA6C /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; - D17AF65B06ED8A966DDAA320DDAE3508 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - D1849FDC7F164FD02BFDF72640C9F951 /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; - D227D633B0111C5DC188D1C75FBC2BB6 /* MLKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MLKit.h; sourceTree = ""; }; - D24FCB1F18D8CD9497E67BE1BC119854 /* Arithmetic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Arithmetic.swift; path = Source/Operations/Arithmetic.swift; sourceTree = ""; }; - D88E93CB6BC77FCE57F53E52EA5D23E8 /* CwlCatchBadInstruction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchBadInstruction.m; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.m; sourceTree = ""; }; - D90BB83409612B6B1623CBC644ACC3FE /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; - D9452A9050B54245FBAA633769A8E911 /* Upsurge.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Upsurge.xcconfig; sourceTree = ""; }; - DB163EBF7C9440E868AC98AFF69EA4BF /* ComplexArraySlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArraySlice.swift; path = Source/Complex/ComplexArraySlice.swift; sourceTree = ""; }; - DB7D8CD585F3E3E717E1D6C1E2E0094E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DBD0EB0CE3764BD0D10DF460F60B14F7 /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; - DCBBD5A13ECC31F538E7CFD189D0DC70 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; - DD78B0C12B597C5AADB88DE894863255 /* Pods-MLKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MLKit_Example-acknowledgements.plist"; sourceTree = ""; }; - DEA09D70E089028B813F7E3B421C5F78 /* InputDataType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InputDataType.swift; sourceTree = ""; }; - E0117B79C919D9B561E2A88CF83B7969 /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; - E173D8DBF9F7B3031B549B2E0D20C12A /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; - E2D5869169BD2131A228B383AB451505 /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; - E3118F695CEE1A70F01A9E795A35D87A /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; - E429FE9C8505AE999927833503F9CB86 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; - E4891C3E0E5A4953C1B99E8D3D29EE77 /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = ""; }; - E676FEA2024624A7035E564D4FD4C518 /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; - E73EAAE4A9B8B04A94992730F2F8F808 /* Complex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Complex.swift; path = Source/Complex/Complex.swift; sourceTree = ""; }; - E7B1ECDF505544DD10698F0466B6541D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E7D069980D480A434318340B49416C2C /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; - E91835FDAA353C4CC63023DDB96B91F6 /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; - E9C36512E8311F1878F954D885D3EF9B /* Upsurge-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Upsurge-dummy.m"; sourceTree = ""; }; - EAC4FF748D013369FE77FEB13FA517D2 /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; - EC2B937DBAE6CC4BCEE683AA80588DC7 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; - ED533B83CC472C5A00FECB4769AAC30A /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; - EDA0AC86CACECCE2595819A08D31B2BE /* Upsurge.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Upsurge.modulemap; sourceTree = ""; }; - EDC143C76D629D8D454DC5D8AA30F893 /* ComplexArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ComplexArray.swift; path = Source/Complex/ComplexArray.swift; sourceTree = ""; }; - F4AA2FCE20C3F50B7669DC36BD5B9FD0 /* World+DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "World+DSL.h"; path = "Sources/QuickObjectiveC/DSL/World+DSL.h"; sourceTree = ""; }; - F6C176A86FD62B15FEA0A36C68FCEBF8 /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; - FCF0CD880E6B5A4F29D38A6CE05AAFA8 /* PointerUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PointerUtilities.swift; path = Source/Operations/PointerUtilities.swift; sourceTree = ""; }; - FD3593FEB98ECA8845615527BF4C07B6 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; + CBE1188D696473745440C84BF05C42B7 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; + CC8D67D5F51E353FFEB079CCBB4185AB /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; + D083DBFCD198E8DF228467AF0BB09175 /* Arithmetic.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Arithmetic.swift; path = Sources/Upsurge/Arithmetic.swift; sourceTree = ""; }; + D1621D3CC99AA55323D74A449B312FCB /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + D18C3D56C8E6AC4C4D8AF2D71F127EC2 /* DSP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSP.swift; path = Sources/Upsurge/DSP.swift; sourceTree = ""; }; + D1FBBDEE20AB0367D1E895BFF7BAFB74 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; + D2865B6ED5D6CC83F8E66C35548F7893 /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; + D2BFE4634D330CC7BDB6FD050266645B /* Pods-MLKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-MLKit_Example.release.xcconfig"; sourceTree = ""; }; + D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + D3A75F0368092983A16979F80FBADF25 /* RidgeRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RidgeRegression.swift; sourceTree = ""; }; + D44A37484B179283B009A5229D427246 /* ValueArraySlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ValueArraySlice.swift; path = Sources/Upsurge/ValueArraySlice.swift; sourceTree = ""; }; + D452C3BB7BB1790D5A4903D0B514CBF0 /* Pods-MLKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-MLKit_Example-acknowledgements.plist"; sourceTree = ""; }; + D5B2080DE017858E1C4F1180D226ADE5 /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; + D75D2A081911A92CAAA13793F43C1F75 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; + D926C598D07A72EACCD54FF65A67092A /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; + DA8A10C6381DD2BA184C44E716A301AA /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; + DB1CB1AFD9F2B0C76F52519316F890D8 /* Upsurge-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Upsurge-prefix.pch"; sourceTree = ""; }; + DB4CCD4C09F2E233F7EA1F7876D2AF18 /* MLKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MLKit.h; path = MLKit/Classes/MLKit.h; sourceTree = ""; }; + DB876AD0511C8EA666EF8E4C0C08E306 /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; + DC56E3DE936D1D3231E8D92095668DB8 /* ToSucceed.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToSucceed.swift; path = Sources/Nimble/Matchers/ToSucceed.swift; sourceTree = ""; }; + DC94E0F4BCD7B7FE9B85BA34D118700B /* 2DTensorSlice.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = 2DTensorSlice.swift; path = Sources/Upsurge/2DTensorSlice.swift; sourceTree = ""; }; + DDF4EB4F151410D97C620DA409F22EFC /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; + DE2CD684208F87ED0F834DB064BDC989 /* Pods-MLKit_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Tests-resources.sh"; sourceTree = ""; }; + DF85C3F736F31B6E3DB7DFC71BD097C4 /* Pods-MLKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-MLKit_Tests-dummy.m"; sourceTree = ""; }; + DF91AA966FF23FD34A8A2A6CA13B6D92 /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; + DFC79DCAC3566B7A977FA02418445C5A /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = ""; }; + E11A16A5E738A6972FCB39D12D520E9C /* Pods-MLKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-MLKit_Example-umbrella.h"; sourceTree = ""; }; + E136F98E96561490178FBCFC9686F5E0 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; + E3D739338A7631D1462E2684F771CCDE /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; + E5C08A8967C75927DD6642B47902110B /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + E5E37B4BB6EC6AFEFF78D4BA53518B58 /* Pods-MLKit_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-MLKit_Tests-frameworks.sh"; sourceTree = ""; }; + E711FA07BCB7DDF1C300B40F196A5A8C /* Pods-MLKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-MLKit_Tests.modulemap"; sourceTree = ""; }; + EC04D0B55B2DF98E82BDFDBDAA249C23 /* Auxiliary.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Auxiliary.swift; path = Sources/Upsurge/Auxiliary.swift; sourceTree = ""; }; + EC1ED54D7A581E3899A873412515A27A /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; + ED86E004A5AE80E2A32D547215794042 /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; + EDE1009D96FFAEDC002FCE0D35C778CC /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; + EED75267527D223ED50D65EC87059D48 /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; + EF8ADAE9FEE03A3463D9A4A6E72AB360 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; + F0DA4837482BDAF49EE0CFC14E653077 /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlMachBadInstructionHandler.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h; sourceTree = ""; }; + F107EA658C6B53E0B84DD2A10C8FCFE8 /* PolynomialRegression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PolynomialRegression.swift; sourceTree = ""; }; + F127827C31D06829D019510F822834F7 /* Behavior.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Behavior.swift; path = Sources/Quick/Behavior.swift; sourceTree = ""; }; + F138797CE87D370358418C683E65A0C8 /* MachineLeanringErrorEnum.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MachineLeanringErrorEnum.swift; sourceTree = ""; }; + F227CF09F2AD26717EECB3B56B8A901A /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; + F6810A90251928F55D7237C647E8D9EA /* MachineLearningKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MachineLearningKit-prefix.pch"; sourceTree = ""; }; + F704A1EAB5E5CD9661BD1D9CBC759BB6 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; + F8E2F9F631419C82139E99139B7128F1 /* ExpectationMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpectationMessage.swift; path = Sources/Nimble/ExpectationMessage.swift; sourceTree = ""; }; + FADB247880A1DED3E6643AEE0F9D3216 /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; + FBB274627F3CCD45711698273E0F3E15 /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; + FC029CDED30DA7B2ABF33E6954B7EB6D /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; + FD7F1CBDC973E32E006EB9A8DCF2B225 /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -419,16 +437,16 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B24A0A8140995A495C05A9D6209847CA /* Accelerate.framework in Frameworks */, - 76C86B1AE6D2B6BED9ABBA270B6EC2F5 /* Foundation.framework in Frameworks */, + F401580BB3F94199850EE085919D337B /* Accelerate.framework in Frameworks */, + B15E411FFF3E2AD78A5B5D6094B48AE3 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A0673853CCFEF089C0BF4D09E710CC4F /* Frameworks */ = { + 574B86180AA21635BD44FF3398DFA2E2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C710B6A7B1A479349273B3AC04CF07C5 /* Foundation.framework in Frameworks */, + 50B22FA5505CE61D56DD50D37BF90FC0 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -436,24 +454,24 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A167AE1A23ECB0052ECE3E97BCE40E70 /* Foundation.framework in Frameworks */, + F878F23B6132166302F83F543699B457 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B86FB0EBB7F7A201A10E81C25CD1B0E2 /* Frameworks */ = { + DC385C7AD4FA36B921F14CA4DF14FDF3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4780B7DFD8E5DC959B44110EEB2AD935 /* Foundation.framework in Frameworks */, + 35C948170BDAB55532CB1F547389EA0C /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - E4DCA3407A8C0FB721EDC1348B32DECF /* Frameworks */ = { + E883C83B47F861096C0E2E69092FB001 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4D5C0E52B4D1231A2E3057B4A048D1C5 /* Foundation.framework in Frameworks */, - 2211BD314546EEC0AB7B56FC3A45B4E5 /* XCTest.framework in Frameworks */, + 86BE1B34AD7742A81064C43766751FC4 /* Foundation.framework in Frameworks */, + 502B570C39B2814E60BC55201BB02414 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -461,9 +479,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F5F8D1CB9DDF071F399D675E73649244 /* Foundation.framework in Frameworks */, - 71CD456EE3712FFF55CB7BF70ED20647 /* MapKit.framework in Frameworks */, - E1DC6CA2B4B8D7E6F175D02BE729E637 /* UIKit.framework in Frameworks */, + 294B014BE7FF231808A123355C1DDDCC /* Foundation.framework in Frameworks */, + 756A8D952F562DC0D1540F4E21EFEF56 /* MapKit.framework in Frameworks */, + BB85CDB5A7F9D7C9733ED9A3AFDBDEA2 /* UIKit.framework in Frameworks */, 327749EF14CAE658519971A5FDD0AB95 /* Upsurge.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -471,408 +489,405 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0066F3595AACA5F22AD82B642CFD8ED3 /* MachineLearningKit */ = { + 043EA181C52180C09B04C84EBE7AD5B7 /* Support Files */ = { isa = PBXGroup; children = ( - F551375ACF695895BAD2B86463E2BE0F /* MLKit */, - D59683A2F228DFD2049EE3B2C6076128 /* Support Files */, + 0072087E9838D243ABAAAB182449A157 /* Info.plist */, + 944520EB51852FB71B9B018254FCB428 /* MachineLearningKit.modulemap */, + 943AC779D543443D52F1E0E5A33E7E8F /* MachineLearningKit.xcconfig */, + 9868FD249081AA56BD34C6162A6E0FB3 /* MachineLearningKit-dummy.m */, + F6810A90251928F55D7237C647E8D9EA /* MachineLearningKit-prefix.pch */, + 26B79A4758A80BCE9213C86BEFA1D243 /* MachineLearningKit-umbrella.h */, ); - name = MachineLearningKit; - path = ../..; + name = "Support Files"; + path = "Example/Pods/Target Support Files/MachineLearningKit"; sourceTree = ""; }; - 079067B8263219CD4F9533B01088DD9E /* Quick */ = { + 09D7DFC9E09DB2917AA006E7FEF1330D /* Support Files */ = { isa = PBXGroup; children = ( - D04D296FB2AE0035E8400F25EBD3EF4B /* Callsite.swift */, - 9624E19BE6F7377A79FB879764B1B1DE /* Closures.swift */, - 68FA4E20FBA69E54B8641FB7E2A67324 /* Configuration.swift */, - 4A6452D2CC7C17DD01ECD91742AF746F /* DSL.swift */, - 0841731251EEDE7ACA21267B1A8A673F /* ErrorUtility.swift */, - AF83868F61F3BD4402D23052FDEA773A /* Example.swift */, - 711A9AC0701A2E08E65DD82429B871BA /* ExampleGroup.swift */, - 0FB8099238DE7DDCFE3FE4C07E86CF1E /* ExampleHooks.swift */, - CABE7AA02D1F045430D6A230BD3B4C19 /* ExampleMetadata.swift */, - 895545B440ABA73C074838125D4DDCD5 /* Filter.swift */, - BA8E6B68CD5B9186B6EC6647BF81A356 /* HooksPhase.swift */, - B8F95C5A721744403DDF5D71E3B20A06 /* NSBundle+CurrentTestBundle.swift */, - 79862A111E88CCA41E254825B0A2B523 /* NSString+C99ExtendedIdentifier.swift */, - E676FEA2024624A7035E564D4FD4C518 /* QCKDSL.h */, - E3118F695CEE1A70F01A9E795A35D87A /* QCKDSL.m */, - 8B964EBE2CDB51FDD20A12FCFCB2CA92 /* Quick.h */, - 16D03C36A6892F0A0BA80E3B43181599 /* QuickConfiguration.h */, - 0EB98267420E501E4F7B0573E2C5F96F /* QuickConfiguration.m */, - BE29DF31652B34FA490E23487B83FBEE /* QuickSelectedTestSuiteBuilder.swift */, - 02862E2FB988A3D26C860CD548A14BEB /* QuickSpec.h */, - 67BD782939C66E9C3619A77243519BF6 /* QuickSpec.m */, - 9D128A10EA2E300A21235B91F63A2AA3 /* QuickSpecBase.h */, - B9D3FED038BE3338641A141732755B00 /* QuickSpecBase.m */, - CE7B423E7D950D806D1D781D4D9FC8B1 /* QuickTestSuite.swift */, - 0D765DA753FAB21A06C81689DCF49863 /* SuiteHooks.swift */, - 2D3E3057A07EA15E4008F933E8752DD2 /* URL+FileName.swift */, - 64BEBE3A1D4FF0196925EEA64015469B /* World.h */, - E7D069980D480A434318340B49416C2C /* World.swift */, - F4AA2FCE20C3F50B7669DC36BD5B9FD0 /* World+DSL.h */, - 3A46C9CABC6D7C94BE0864668B74F949 /* World+DSL.swift */, - CECAF283BF4E0E908EDD2145F46A956C /* XCTestSuite+QuickTestSuiteBuilder.m */, - BC003FE70FEB7D13ABECA4112A71C975 /* Support Files */, + 7F87494EB08182EBB6C6DFC0A40EDE44 /* Info.plist */, + 71F3393CED3AA91406E2F69CC8918BB8 /* Nimble.modulemap */, + 9774CA86DF8D2DC26C4830B97504FBD6 /* Nimble.xcconfig */, + D926C598D07A72EACCD54FF65A67092A /* Nimble-dummy.m */, + B621E050BD878B9F6C3BBA0EDA15F0B0 /* Nimble-prefix.pch */, + EC1ED54D7A581E3899A873412515A27A /* Nimble-umbrella.h */, ); - name = Quick; - path = Quick; + name = "Support Files"; + path = "../Target Support Files/Nimble"; sourceTree = ""; }; 1778580F4F8EE091B81F359F5D5D5FBA /* Targets Support Files */ = { isa = PBXGroup; children = ( - C33BE72AAA8A6B3C0353F4762B4B7270 /* Pods-MLKit_Example */, - F0131D05BEC2BD586052E0ECAF5DD440 /* Pods-MLKit_Tests */, + E9C62807DC6498F4D3C6E96926B82AF7 /* Pods-MLKit_Example */, + DF9535B1A88C3A536047C0CAE39F16EC /* Pods-MLKit_Tests */, ); name = "Targets Support Files"; sourceTree = ""; }; - 1D9290CBB8F9FDE0A430DD2D913AC93B /* K Means Clustering */ = { + 2B6CC3750AA37500856DAA883E48FC3A /* Nimble */ = { isa = PBXGroup; children = ( - 93DE7AC6CBCC1E15E3EC4491A5B45D7C /* KMeans.swift */, + 9B8FD5147603F141BD056C0756090B6F /* AdapterProtocols.swift */, + 38E6B7D825EED250A8A2E507119F4709 /* AllPass.swift */, + 9D7A706141B0D9509964E0CB47AA457C /* AssertionDispatcher.swift */, + 6EB6C1B9DCCA2688998730FBBEED6A1E /* AssertionRecorder.swift */, + 691B44A14B74DB67BCC78D5ED07E8881 /* Async.swift */, + D75D2A081911A92CAAA13793F43C1F75 /* AsyncMatcherWrapper.swift */, + A859BC8BAFA1A204B91C3D70FD7A64A6 /* BeAKindOf.swift */, + C86BC4FC4C5A0AC48D066EA367D9F1A1 /* BeAnInstanceOf.swift */, + 42C3D67146BDBA10CAC51CFD228F2FAB /* BeCloseTo.swift */, + 10276B77433F1E402AA83B42483AA81C /* BeEmpty.swift */, + C88ACC22A83253002DF3E9F48F72ECD0 /* BeginWith.swift */, + CA6E390EC13AA8DFEFCF8F64F83ED7F0 /* BeGreaterThan.swift */, + A8E9ECD30E2954373F475721AA57A24C /* BeGreaterThanOrEqualTo.swift */, + 50C03EEF29C5CE0126A004280345CEB5 /* BeIdenticalTo.swift */, + 743433A01B8BAF2AB26BE6DB7BA78D04 /* BeLessThan.swift */, + E3D739338A7631D1462E2684F771CCDE /* BeLessThanOrEqual.swift */, + B3C80A7C25D576D1F551F878DBA6AF8C /* BeLogical.swift */, + D1FBBDEE20AB0367D1E895BFF7BAFB74 /* BeNil.swift */, + C008229A23584B84BE1AE6061F6FBA63 /* BeVoid.swift */, + D2865B6ED5D6CC83F8E66C35548F7893 /* Contain.swift */, + DFC79DCAC3566B7A977FA02418445C5A /* ContainElementSatisfying.swift */, + 96945A916008CD4B69F1E34AD69B7922 /* CwlBadInstructionException.swift */, + 5939A7201581DF730418B213139A659D /* CwlCatchBadInstruction.swift */, + C3CA0DD982FBC2D3667E3DDA63B24456 /* CwlCatchException.h */, + 482052EDFA9575D28D64E9549C44197E /* CwlCatchException.m */, + 7B273D8C6E67454E52F2780AE08AFD37 /* CwlCatchException.swift */, + EDE1009D96FFAEDC002FCE0D35C778CC /* CwlDarwinDefinitions.swift */, + F0DA4837482BDAF49EE0CFC14E653077 /* CwlMachBadInstructionHandler.h */, + 7F7F2720A7CF251866B1B65971F0EA81 /* CwlMachBadInstructionHandler.m */, + B9B1A75006593B42ED0AC43E5AF1A6C4 /* CwlPreconditionTesting.h */, + B6C49FC9DB8F6D1AD5CE50C0A47653B7 /* DSL.h */, + 9FF09F25EDC45AF504AE7DB3E25153AC /* DSL.m */, + A521626B7302B082F1B39A00AA2C3A0C /* DSL.swift */, + EED75267527D223ED50D65EC87059D48 /* DSL+Wait.swift */, + DF91AA966FF23FD34A8A2A6CA13B6D92 /* EndWith.swift */, + 901B5CAA4EB5DC150DF830F34762A545 /* Equal.swift */, + 4C9D615FAE0AA7C543BE7F92529CA1C1 /* Errors.swift */, + 30CFC567F8A1B22F61DC542426B15B60 /* Expectation.swift */, + F8E2F9F631419C82139E99139B7128F1 /* ExpectationMessage.swift */, + F704A1EAB5E5CD9661BD1D9CBC759BB6 /* Expression.swift */, + 47E4190D74012C482B496182A661F4C4 /* FailureMessage.swift */, + C1EC271834216A505262D80AF2EF61DE /* Functional.swift */, + 2D7DE08F4564DB849F36813C94F66821 /* HaveCount.swift */, + 866F20B5ADA342A20100B077B4CC0F22 /* mach_excServer.c */, + 335991C55FC2A3EEDDFE264BA0C64169 /* mach_excServer.h */, + 3463C2B70E2BDD90E3CE7FCAC5292630 /* Match.swift */, + 12D4D8665E25B2D00E226E53BD267285 /* MatcherFunc.swift */, + 395A5303D2C1ED53000412E2C3DCF92D /* MatcherProtocols.swift */, + 66977DC443BDBFD0C106D7A4F184AC01 /* MatchError.swift */, + 5981D3D86D2E06AC38A3978635C9DED8 /* Nimble.h */, + D5B2080DE017858E1C4F1180D226ADE5 /* NimbleEnvironment.swift */, + EF8ADAE9FEE03A3463D9A4A6E72AB360 /* NimbleXCTestHandler.swift */, + BF556D4573DC7F987D53D889524FE92C /* NMBExceptionCapture.h */, + 46BA399BDE1B6DE7B14C30EF6055327D /* NMBExceptionCapture.m */, + 489ECA679D24E54A6CC7B87EACD3D221 /* NMBExpectation.swift */, + 9F0AFF316A4EDB73779600E89CF19632 /* NMBObjCMatcher.swift */, + C62DBF5F4F814CA68B3097F0248FB2ED /* NMBStringify.h */, + E136F98E96561490178FBCFC9686F5E0 /* NMBStringify.m */, + 337B8D2516336668DC0F954A21611095 /* PostNotification.swift */, + 89EF396CF1EE4E75AD050BDF3EC68560 /* Predicate.swift */, + ED86E004A5AE80E2A32D547215794042 /* RaisesException.swift */, + 16606F3887D1DCD0FEBD520F792DA300 /* SatisfyAllOf.swift */, + DA8A10C6381DD2BA184C44E716A301AA /* SatisfyAnyOf.swift */, + 521B35F4C031ABE1E2E2EF830840542B /* SourceLocation.swift */, + 04B8E32AD23B2D12CA57341D936CAB3A /* Stringers.swift */, + 556B768D5C717E2EFDBF20FC039624F5 /* ThrowAssertion.swift */, + FADB247880A1DED3E6643AEE0F9D3216 /* ThrowError.swift */, + DC56E3DE936D1D3231E8D92095668DB8 /* ToSucceed.swift */, + 147E17B49D366E81D21A0B73472E5A23 /* XCTestObservationCenter+Register.m */, + 09D7DFC9E09DB2917AA006E7FEF1330D /* Support Files */, ); - name = "K Means Clustering"; - path = "K Means Clustering"; + name = Nimble; + path = Nimble; sourceTree = ""; }; - 3E25486F8A00548F48F062EE3E3C5DA6 /* Upsurge */ = { + 2BC9D7FC0581B53AD03D521F505E91D7 /* Support Files */ = { isa = PBXGroup; children = ( - 9C13EEF6CE7B8665E06332AD77882466 /* 2DTensorSlice.swift */, - D24FCB1F18D8CD9497E67BE1BC119854 /* Arithmetic.swift */, - 012916E1116F4F544559C4FFCDD0D170 /* Auxiliary.swift */, - E73EAAE4A9B8B04A94992730F2F8F808 /* Complex.swift */, - 9E0EB0151B5DDBCEC7706C08CB3F6D0A /* ComplexArithmetic.swift */, - EDC143C76D629D8D454DC5D8AA30F893 /* ComplexArray.swift */, - 1210BE3C711459C58AE9F743F7B82931 /* ComplexArrayRealSlice.swift */, - DB163EBF7C9440E868AC98AFF69EA4BF /* ComplexArraySlice.swift */, - 383A4DC8ACFD6B49ECF2DFE23764A2D3 /* DSP.swift */, - C00D1260FC691D4C91B5C7B0C1E51CED /* Exponential.swift */, - 8696FA5715205A2FE823260539588590 /* FFT.swift */, - 24D478FE2127475CABEE5C5AE5B9772D /* Hyperbolic.swift */, - 93BD78CE597862CCAAF3A214DF9A8D46 /* Interval.swift */, - 0C3B0FE4A67C53BAE82ACF00A907244A /* LinearOperators.swift */, - 8AB15E15A6C417380F4BDE4F104E73FA /* LinearType.swift */, - B90161234C0D9C58144F0D114775D3E8 /* Matrix.swift */, - 3A2A011722B21DE42A32C785BC89EA01 /* MatrixArithmetic.swift */, - 674822B4E356741B78B38B007C88BB9C /* MatrixSlice.swift */, - FCF0CD880E6B5A4F29D38A6CE05AAFA8 /* PointerUtilities.swift */, - 494C0F635D5836E872EF3C5A39E97D40 /* QuadraticType.swift */, - B05A2B00A7660C87F990F90901BB61C2 /* Real.swift */, - 99A3B4EC6DA19FEADCCDCA96CA327574 /* Span.swift */, - 0AB6F2F34E76936E5DCD781D737E8D0E /* Tensor.swift */, - 904FEA0622628AADB1CA02AA57ED1A48 /* TensorSlice.swift */, - 1C9E249A32DD13B27BA05B3CDE01B22E /* TensorType.swift */, - 632231BFC26E16C229D32687B917D3A0 /* Trigonometric.swift */, - 76A2C52BB2BC141539B6A02006AE6422 /* Value.swift */, - 8AAD299764DE8C9B43BA8AFF5C36053F /* ValueArray.swift */, - 19D06F6EACA4C3A8FB660F983B8C2500 /* ValueArraySlice.swift */, - A819A510A47562E3C92C1A44685374D7 /* Support Files */, + B1AE425ACC355E279BDA5F98580C7CA4 /* Info.plist */, + 6FB3756871335B5449117CCB19CAA652 /* Quick.modulemap */, + F227CF09F2AD26717EECB3B56B8A901A /* Quick.xcconfig */, + FBB274627F3CCD45711698273E0F3E15 /* Quick-dummy.m */, + 8CAC8E3CABDE963E50CBC99B73B23A2D /* Quick-prefix.pch */, + 5F737BB93131E723165509AE01FA5729 /* Quick-umbrella.h */, ); - name = Upsurge; - path = Upsurge; - sourceTree = ""; - }; - 4AE7C6F0FD3648726140001A937F65A4 /* Classes */ = { - isa = PBXGroup; - children = ( - 7264F4D0435F000E2684EB1DAACEBDD1 /* CSVReader.swift */, - D227D633B0111C5DC188D1C75FBC2BB6 /* MLKit.h */, - EB5A14FBFFD7D19B1C8F35011074CE5C /* ANN */, - A150A522CB01D506F45AAD0F0D18E638 /* Genetic Algorithms */, - 68F4F244E826EF084EF6419CB442D871 /* Helper Classes & Extensions */, - 1D9290CBB8F9FDE0A430DD2D913AC93B /* K Means Clustering */, - AE798DB5CB6B3DFD4A133D9CC0382AE8 /* Regression */, - ); - name = Classes; - path = Classes; + name = "Support Files"; + path = "../Target Support Files/Quick"; sourceTree = ""; }; - 68F4F244E826EF084EF6419CB442D871 /* Helper Classes & Extensions */ = { + 310CCCD67B366821FCFF08B1D0CE3F34 /* Helper Classes & Extensions */ = { isa = PBXGroup; children = ( - 477B34BD1FFA8820D6EF220B0BC0118F /* DataManager.swift */, - 4C397B78C2E0CE51B2767D2AF1CD9817 /* Extensions.swift */, - 9E6576B5347A8A01F10941469B1EA3EB /* MachineLeanringErrorEnum.swift */, + 788D53525A0B21F8BC8F27DDA78143E6 /* DataManager.swift */, + 4F825E5C5C07AABCDF90FAD0630DA30B /* Extensions.swift */, + F138797CE87D370358418C683E65A0C8 /* MachineLeanringErrorEnum.swift */, ); name = "Helper Classes & Extensions"; - path = "Helper Classes & Extensions"; + path = "MLKit/Classes/Helper Classes & Extensions"; sourceTree = ""; }; - 7DB346D0F39D3F0E887471402A8071AB = { + 3297101FCA0B5EFD82A6C89296B4AF06 /* Upsurge */ = { isa = PBXGroup; children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - BC2B2678BE1390F494E86569403E23DF /* Development Pods */, - FC789AF5844FCEF085DA24E590C6103E /* Frameworks */, - EC0EE2C9C961DB08307B5DAA831499AD /* Pods */, - 8940009BC4C8AC45886903989E2DC4B3 /* Products */, - 1778580F4F8EE091B81F359F5D5D5FBA /* Targets Support Files */, + DC94E0F4BCD7B7FE9B85BA34D118700B /* 2DTensorSlice.swift */, + D083DBFCD198E8DF228467AF0BB09175 /* Arithmetic.swift */, + EC04D0B55B2DF98E82BDFDBDAA249C23 /* Auxiliary.swift */, + 84AEA96C7D58C6932E550A8F5F49CDF2 /* Complex.swift */, + 4BF613065B011698DDBE313953239BF2 /* ComplexArithmetic.swift */, + 8DD06D99DA5CD87A0BF51FB6056AD802 /* ComplexArray.swift */, + 144B5707254D157A52910519D2F17C8D /* ComplexArrayRealSlice.swift */, + 21FC20B789CA93B273E0BC1AA0AB7F7C /* ComplexArraySlice.swift */, + D18C3D56C8E6AC4C4D8AF2D71F127EC2 /* DSP.swift */, + 8E19E5E330F0B730F5C71B8F67C235DA /* Exponential.swift */, + 7285349CCF57C337C73827A7D17A9CEF /* FFT.swift */, + A8A0A7BD8FBCF34C54C12F615A32D045 /* Hyperbolic.swift */, + 5E704933645FA99C8E634547C49786E9 /* Interval.swift */, + 2912F84DAE219F366CB90C00C6248FA6 /* LinearOperators.swift */, + C8DABCC737B4BE064BB957352D867302 /* LinearType.swift */, + 6B26AC147A0657266508051439D0675F /* Matrix.swift */, + 5D5F1F566CEFFF34B2EDFA4761A30736 /* MatrixArithmetic.swift */, + 24359C2419BC40E913F7E18F66162068 /* MatrixSlice.swift */, + 2E5093D5F993BB458C93C325732AC182 /* PointerUtilities.swift */, + 952F2775024622B4796405322A6794DB /* QuadraticType.swift */, + 030A59ECDA8F7D3C591CE152B3BBBA87 /* Real.swift */, + B2D683B1F99B9F712F2EE56447823F6E /* Sequence.swift */, + 197CCEAC9008FEF55260A0F2FF0C7B32 /* Span.swift */, + 8652DE537D4205F41CABDA2982BA1C25 /* Tensor.swift */, + 07E148306C6BA950FCA137CD27AEB033 /* TensorSlice.swift */, + 3D75FB88DD2222A56D717AAF228FFE78 /* TensorType.swift */, + 4B251496F77D014ADC2729BF32DC0756 /* Trigonometric.swift */, + 7C545BAF94B4B6AAF8AE48FFFFE1F791 /* Value.swift */, + 3157754E17798B264F621373EBDE7CBB /* ValueArray.swift */, + D44A37484B179283B009A5229D427246 /* ValueArraySlice.swift */, + 5510A90382E274F2A3E199D10A441D08 /* Support Files */, ); + name = Upsurge; + path = Upsurge; sourceTree = ""; }; - 86A92A0E0B9EA4165121541D41E203EE /* Support Files */ = { + 3DE3A7F69BF58415D468B864706A8F53 /* Pod */ = { isa = PBXGroup; children = ( - DB7D8CD585F3E3E717E1D6C1E2E0094E /* Info.plist */, - CFF92402EDA16EB6806DBA1684B4C0F0 /* Nimble.modulemap */, - ED533B83CC472C5A00FECB4769AAC30A /* Nimble.xcconfig */, - DBD0EB0CE3764BD0D10DF460F60B14F7 /* Nimble-dummy.m */, - C17505640C9782BB9C72471DFBF96025 /* Nimble-prefix.pch */, - 162303716510B6A1AC25BFD0F74F2544 /* Nimble-umbrella.h */, + D1621D3CC99AA55323D74A449B312FCB /* LICENSE */, + 864DD86938280C9A69C5A1E4B9663C84 /* MachineLearningKit.podspec */, + 91CFF7338D8B2EFEE0292C206A40EE84 /* README.md */, ); - name = "Support Files"; - path = "../Target Support Files/Nimble"; + name = Pod; sourceTree = ""; }; - 8940009BC4C8AC45886903989E2DC4B3 /* Products */ = { + 5510A90382E274F2A3E199D10A441D08 /* Support Files */ = { isa = PBXGroup; children = ( - 8D5D6E6E6D3B6CCBD5B8D01D78A6C3A1 /* MachineLearningKit.framework */, - BC1FE7307C927E1E6A92842F57E0C7C9 /* Nimble.framework */, - CA785AB3A9A0B1FEB1F8D8297A1DEB72 /* Pods_MLKit_Example.framework */, - 57189BBB8E0A886933E15F0E294E2908 /* Pods_MLKit_Tests.framework */, - 1CA1E0D7EDD11FD11C55B7AC425EA02C /* Quick.framework */, - 289B26827495B1EA15C10A9AFE473C7A /* Upsurge.framework */, + 2166FFC06EE0F270A009284D29A4995A /* Info.plist */, + 508C55FD4AE738ACC7274ADDBEB2028E /* Upsurge.modulemap */, + 8989F80BF9DE58885C888CAF78A4C095 /* Upsurge.xcconfig */, + C4DD537815AD750380E3798229FAB811 /* Upsurge-dummy.m */, + DB1CB1AFD9F2B0C76F52519316F890D8 /* Upsurge-prefix.pch */, + 37945938F521BFB59BCF46DD7A0BF594 /* Upsurge-umbrella.h */, ); - name = Products; + name = "Support Files"; + path = "../Target Support Files/Upsurge"; sourceTree = ""; }; - A150A522CB01D506F45AAD0F0D18E638 /* Genetic Algorithms */ = { + 5AD1C05961E019BF9DB7CF316E8EA218 /* MachineLearningKit */ = { isa = PBXGroup; children = ( - 224B74EEB01665D46840260470EA4991 /* BiologicalProcessManager.swift */, - 1DAB4E6A2EB3A9C3629C2062F345461A /* Genome.swift */, - 7A45BA6EC001C35D2D0B9BFE6072BD59 /* Population.swift */, + 903B1867081A10809FA5BF96301EAC0E /* CSVReader.swift */, + DB4CCD4C09F2E233F7EA1F7876D2AF18 /* MLKit.h */, + 8BBE0D6BA15F5D3FDE21B715C2EBAE68 /* ANN */, + 93FF52822A5EBE893B03B280227A7504 /* Genetic Algorithms */, + 310CCCD67B366821FCFF08B1D0CE3F34 /* Helper Classes & Extensions */, + E3315A0E863D94D2852A046A57C6381D /* K Means Clustering */, + 3DE3A7F69BF58415D468B864706A8F53 /* Pod */, + C4BB4ABCD345AEF37D6D62D3319D65A0 /* Regression */, + 043EA181C52180C09B04C84EBE7AD5B7 /* Support Files */, ); - name = "Genetic Algorithms"; - path = "Genetic Algorithms"; + name = MachineLearningKit; + path = ../..; sourceTree = ""; }; - A819A510A47562E3C92C1A44685374D7 /* Support Files */ = { + 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( - AD94BC820DCB168006B7673EF857A635 /* Info.plist */, - EDA0AC86CACECCE2595819A08D31B2BE /* Upsurge.modulemap */, - D9452A9050B54245FBAA633769A8E911 /* Upsurge.xcconfig */, - E9C36512E8311F1878F954D885D3EF9B /* Upsurge-dummy.m */, - 918BC97B218D0A8A64BDD621B91F9069 /* Upsurge-prefix.pch */, - 5480FBA1F6D203291F193F6D19878DBA /* Upsurge-umbrella.h */, + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 837D77061913806BBAAF9DC7B85BCA1C /* Development Pods */, + FC789AF5844FCEF085DA24E590C6103E /* Frameworks */, + C07EFE2A3CFEEF2B26E60033417B8717 /* Pods */, + 8940009BC4C8AC45886903989E2DC4B3 /* Products */, + 1778580F4F8EE091B81F359F5D5D5FBA /* Targets Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/Upsurge"; sourceTree = ""; }; - ABCDED8B3EE7643CE616D3F7D8243E3B /* iOS */ = { + 837D77061913806BBAAF9DC7B85BCA1C /* Development Pods */ = { isa = PBXGroup; children = ( - FD3593FEB98ECA8845615527BF4C07B6 /* Accelerate.framework */, - 15E689FA8F35DA0540DAED36BA321F6E /* Foundation.framework */, - 9AEF9A30B4EAA4E623AC004398637120 /* MapKit.framework */, - CE766189385F7E575AD7202D0316AFFC /* UIKit.framework */, - 761E70C09096AF7E9F07C0940571D8E8 /* XCTest.framework */, + 5AD1C05961E019BF9DB7CF316E8EA218 /* MachineLearningKit */, ); - name = iOS; + name = "Development Pods"; sourceTree = ""; }; - ACF52AC05372AE6D4CFF78D07529B37B /* Nimble */ = { + 8940009BC4C8AC45886903989E2DC4B3 /* Products */ = { isa = PBXGroup; children = ( - 7738AD08C39FE55EBEED43F72217AD23 /* AdapterProtocols.swift */, - 424CEA9DC77FE5D725C9551F2ACAA8BA /* AllPass.swift */, - 9F2FFA2871232A17F74D97604A516636 /* AssertionDispatcher.swift */, - CA483EF72520B01CF4A81ED38901CC64 /* AssertionRecorder.swift */, - 256AA66B0C109C259E2D0DDA42B32EDB /* Async.swift */, - D1601B2905CD07F5813DA81623EDCA6C /* AsyncMatcherWrapper.swift */, - D1849FDC7F164FD02BFDF72640C9F951 /* BeAKindOf.swift */, - 3EB4893036DEB2A1EB8B6111A120F5A2 /* BeAnInstanceOf.swift */, - 985F35A8C7BB37C0852C7E45F32619DA /* BeCloseTo.swift */, - 851E4FB881FC4ED5D39D0CBCB7DAA845 /* BeEmpty.swift */, - 26788572C6F366401AFEC63C14A45513 /* BeginWith.swift */, - 46306D0BBA1452AFEA95521C31EF74FD /* BeGreaterThan.swift */, - C77F9745A1AEE0419DE285232F7A4B46 /* BeGreaterThanOrEqualTo.swift */, - E429FE9C8505AE999927833503F9CB86 /* BeIdenticalTo.swift */, - E173D8DBF9F7B3031B549B2E0D20C12A /* BeLessThan.swift */, - CC69007AFC0A65564291043D24B15E3D /* BeLessThanOrEqual.swift */, - 227DDFCD5D9F3918AB624B74E886C8A5 /* BeLogical.swift */, - A8255BF758512319BCEC8A9465100F12 /* BeNil.swift */, - 27B970E9789C66FDD4D00112E12E321A /* BeVoid.swift */, - 95FD3F8CEA2A60510B93CE50FFDAEC43 /* Contain.swift */, - E4891C3E0E5A4953C1B99E8D3D29EE77 /* ContainElementSatisfying.swift */, - BA9401876190B7BA1B70B7A9752180D5 /* CurrentTestCaseTracker.h */, - 3A0C56CEE8C3AD43FF8AE40F6AFFF4C7 /* CwlBadInstructionException.swift */, - 3949269DDD43CCFF544917979779224B /* CwlCatchBadInstruction.h */, - D88E93CB6BC77FCE57F53E52EA5D23E8 /* CwlCatchBadInstruction.m */, - EAC4FF748D013369FE77FEB13FA517D2 /* CwlCatchBadInstruction.swift */, - 50F4D75F4A1D2B2E24633488475931A3 /* CwlCatchException.h */, - 922D9654CE04819948A343CA3B1429F3 /* CwlCatchException.m */, - 40FFCF7710FDE9792C5747C276F2DF4F /* CwlCatchException.swift */, - 8F643B28D12D7235D05A86D94E704075 /* CwlDarwinDefinitions.swift */, - 0874FE88223748474F9540CC3A7B2CDD /* DSL.h */, - 56C0D020BB9A8FA4BD0F26AC76A2E14A /* DSL.m */, - 0912AB47C2FD8B724C2FF78EB04DA146 /* DSL.swift */, - 6F7958F9886E618114345F800A8E55FF /* DSL+Wait.swift */, - 05BA3CAD29488F2C5317D831BB6931BF /* EndWith.swift */, - E91835FDAA353C4CC63023DDB96B91F6 /* Equal.swift */, - A9C1D721B2C6C17E12FA8322E6E16682 /* Errors.swift */, - EC2B937DBAE6CC4BCEE683AA80588DC7 /* Expectation.swift */, - 445AD67BD05424A184443D2B95D450E1 /* Expression.swift */, - 077C0519A2057F471035D14A7027344E /* FailureMessage.swift */, - E2D5869169BD2131A228B383AB451505 /* Functional.swift */, - 07FB5885E183C905F1B353BA590212F0 /* HaveCount.swift */, - 5CEECA1264E2048F119396D446D14C91 /* mach_excServer.c */, - 20BF642EFEB79518E353D7F8F3D860F1 /* mach_excServer.h */, - 7CCCA0D5F8BB724A0B342E39C887F56C /* Match.swift */, - C0CED4BACCDE5B346DA1AF62EB6AF781 /* MatcherFunc.swift */, - CD25694F61A3303C6994E49FD926F60C /* MatcherProtocols.swift */, - 3C9A0B54C6BC094E3CD3A2A61EDA9D85 /* MatchError.swift */, - 124FF2A96FE15393763BC63572EEC184 /* Nimble.h */, - 8E2478F9C2B8F6A4FD3E290EB66D2967 /* NimbleEnvironment.swift */, - A7EC0E4FEBE039947272C3B4A867BE43 /* NimbleXCTestHandler.swift */, - 1CFC980E2966F69FA4D771EB69B2072A /* NMBExceptionCapture.h */, - D90BB83409612B6B1623CBC644ACC3FE /* NMBExceptionCapture.m */, - 60979E4BD68DB0DE4501D0BCC7234D91 /* NMBExpectation.swift */, - 460AA53800E69CBD26BBD78537857F1E /* NMBObjCMatcher.swift */, - 4A7F3D729C82E75AB35940B80EDE5960 /* NMBStringify.h */, - 538A45E8224CD67C4262A9B8B8F1F37D /* NMBStringify.m */, - F6C176A86FD62B15FEA0A36C68FCEBF8 /* PostNotification.swift */, - 13CD84A26A08B3EC263D565FE02D7940 /* RaisesException.swift */, - DCBBD5A13ECC31F538E7CFD189D0DC70 /* SatisfyAnyOf.swift */, - 6030DF38EBDBF336FFAE0120EEA4D959 /* SourceLocation.swift */, - 692BA097D08B9592A8A24370C50D81D0 /* Stringers.swift */, - 564EE9F32DE4725529A52326B19EA90F /* ThrowAssertion.swift */, - E0117B79C919D9B561E2A88CF83B7969 /* ThrowError.swift */, - 38FE998DBDEEBCE33949AAA9F3296550 /* XCTestObservationCenter+Register.m */, - 86A92A0E0B9EA4165121541D41E203EE /* Support Files */, + 8D5D6E6E6D3B6CCBD5B8D01D78A6C3A1 /* MachineLearningKit.framework */, + BC1FE7307C927E1E6A92842F57E0C7C9 /* Nimble.framework */, + CA785AB3A9A0B1FEB1F8D8297A1DEB72 /* Pods_MLKit_Example.framework */, + 57189BBB8E0A886933E15F0E294E2908 /* Pods_MLKit_Tests.framework */, + 1CA1E0D7EDD11FD11C55B7AC425EA02C /* Quick.framework */, + 289B26827495B1EA15C10A9AFE473C7A /* Upsurge.framework */, ); - name = Nimble; - path = Nimble; + name = Products; sourceTree = ""; }; - AE798DB5CB6B3DFD4A133D9CC0382AE8 /* Regression */ = { + 8BBE0D6BA15F5D3FDE21B715C2EBAE68 /* ANN */ = { isa = PBXGroup; children = ( - 436FD53B1F1C37D3650BE5FE2C882A5E /* LassoRegression.swift */, - 9B8C04FE82A09C3FC32594EBFC743E53 /* PolynomialRegression.swift */, - 09DB8A700464608EEC997EB8F70F5A97 /* RidgeRegression.swift */, - 33447FAB1F2844FCF376B75EB97C4666 /* SimpleLinearRegression.swift */, + 99AE607EC3AE432038B8D01ED43874F5 /* ActivationFunctionType.swift */, + 041AFB8E22C5AAD543EDA1F96A9BCBAB /* InputDataType.swift */, + 99CBDFC2C80E00FA020DA53C005E838C /* Layer.swift */, + 45944744A832416BF5020527CAD33A70 /* NeuralNetwork.swift */, ); - name = Regression; - path = Regression; + name = ANN; + path = MLKit/Classes/ANN; sourceTree = ""; }; - BC003FE70FEB7D13ABECA4112A71C975 /* Support Files */ = { + 93FF52822A5EBE893B03B280227A7504 /* Genetic Algorithms */ = { isa = PBXGroup; children = ( - 3AFFFEB5837A94482C2215EB9EFEEEDD /* Info.plist */, - CACBB118DD81CDBEFB6559A57C883F50 /* Quick.modulemap */, - 617F2E0CEEF4C400A8D6EADD86F6145C /* Quick.xcconfig */, - 023DA655BA54CB7DEA97C57AD9725DDE /* Quick-dummy.m */, - 3AE3D8AECCC1ACCEA8F2C3B88B7A5070 /* Quick-prefix.pch */, - C3523CB10A94DA7970870A6190C1CB1C /* Quick-umbrella.h */, + 83BCF2F8D63C19C2434BD6853C915D86 /* BiologicalProcessManager.swift */, + 149C087BF5CF9736F9C47759977B4DCD /* Genome.swift */, + 169BC2DB3712E23D9A69F1AACCD762C0 /* Population.swift */, ); - name = "Support Files"; - path = "../Target Support Files/Quick"; + name = "Genetic Algorithms"; + path = "MLKit/Classes/Genetic Algorithms"; sourceTree = ""; }; - BC2B2678BE1390F494E86569403E23DF /* Development Pods */ = { + C07EFE2A3CFEEF2B26E60033417B8717 /* Pods */ = { isa = PBXGroup; children = ( - 0066F3595AACA5F22AD82B642CFD8ED3 /* MachineLearningKit */, + 2B6CC3750AA37500856DAA883E48FC3A /* Nimble */, + DE8665BBFD8A0E6E3B08DBF7CB1D3C1D /* Quick */, + 3297101FCA0B5EFD82A6C89296B4AF06 /* Upsurge */, ); - name = "Development Pods"; + name = Pods; sourceTree = ""; }; - C33BE72AAA8A6B3C0353F4762B4B7270 /* Pods-MLKit_Example */ = { + C4BB4ABCD345AEF37D6D62D3319D65A0 /* Regression */ = { isa = PBXGroup; children = ( - 98C52913DD43FF732C4CB0156035175F /* Info.plist */, - 08D39735D7DBDB3A52B19BB1A1BEAD08 /* Pods-MLKit_Example.modulemap */, - 6E5F3C7C7DEC67A40AB30E806AC7D1E2 /* Pods-MLKit_Example-acknowledgements.markdown */, - DD78B0C12B597C5AADB88DE894863255 /* Pods-MLKit_Example-acknowledgements.plist */, - 3D5025AF8F620B99C3283F0975D09FE3 /* Pods-MLKit_Example-dummy.m */, - 9C6B6A08749A762D9174E03E4409BD8E /* Pods-MLKit_Example-frameworks.sh */, - 3D34DA76C844CF16C054BA1344541C74 /* Pods-MLKit_Example-resources.sh */, - 9951688C60A46DD572589F5DACF0C4A5 /* Pods-MLKit_Example-umbrella.h */, - 636673BDA1F06E469643F565D84270B5 /* Pods-MLKit_Example.debug.xcconfig */, - CC698E9958DEF380C0198EAA773F7DFF /* Pods-MLKit_Example.release.xcconfig */, + 3A9832ABE1993F30F8D46161D2D60B7F /* LassoRegression.swift */, + F107EA658C6B53E0B84DD2A10C8FCFE8 /* PolynomialRegression.swift */, + D3A75F0368092983A16979F80FBADF25 /* RidgeRegression.swift */, + BC4AC27D0E6B3366260B309A77BF1DEE /* SimpleLinearRegression.swift */, ); - name = "Pods-MLKit_Example"; - path = "Target Support Files/Pods-MLKit_Example"; + name = Regression; + path = MLKit/Classes/Regression; sourceTree = ""; }; - D59683A2F228DFD2049EE3B2C6076128 /* Support Files */ = { + DE8665BBFD8A0E6E3B08DBF7CB1D3C1D /* Quick */ = { isa = PBXGroup; children = ( - D17AF65B06ED8A966DDAA320DDAE3508 /* Info.plist */, - CAC74302C6BE8BE111885420D68AEFA2 /* MachineLearningKit.modulemap */, - 55F8E5E39CFFED8C8B0162606918FB20 /* MachineLearningKit.xcconfig */, - 2D60404BA78CC7BF6C1144F008DDDDBC /* MachineLearningKit-dummy.m */, - 94F560C6B000B2C3D6E49CCFD3562B68 /* MachineLearningKit-prefix.pch */, - 5ECF49E5836E9754AAF942842CE1B960 /* MachineLearningKit-umbrella.h */, + F127827C31D06829D019510F822834F7 /* Behavior.swift */, + 3DAFCD1EAB3A11FCBE8181968A1EF4DC /* Callsite.swift */, + 24B713FD278927D49885E1904255F064 /* Closures.swift */, + 8EC6FB98BC9B9C5A27A8BF747A7F6C7E /* Configuration.swift */, + CC8D67D5F51E353FFEB079CCBB4185AB /* DSL.swift */, + 8C0B466BB0421312D8078CED0B71E6BE /* ErrorUtility.swift */, + 137AA47B11FCF8DFAD21FDBFDF07E50A /* Example.swift */, + 6A9880E45E7F3B3785B9FBFF52CEAA60 /* ExampleGroup.swift */, + DB876AD0511C8EA666EF8E4C0C08E306 /* ExampleHooks.swift */, + 6D6EB106E4321D22F26A52B5B8DE64CD /* ExampleMetadata.swift */, + 7DC137D322A128441EBF52B5FFE5BE58 /* Filter.swift */, + 3CCBBC9C55535D0AC68C2CA15578DA91 /* HooksPhase.swift */, + CA5D01A26D43913794F56D3A7971FF5E /* NSBundle+CurrentTestBundle.swift */, + BD2B7A69A92DA0BFAC01F38D57957048 /* NSString+C99ExtendedIdentifier.swift */, + 035C2EED1791B7BE6BE9D42969BAB1C9 /* QCKDSL.h */, + 16E6DC1E5FD69A192A194383B26C8EC3 /* QCKDSL.m */, + 1D83F506716B92E26EDB9E77BE6F7159 /* Quick.h */, + 038A760F895431B48CEA5B48437243EA /* QuickConfiguration.h */, + 0994970A2155ACFCCAF3F3AF8BE2E5CC /* QuickConfiguration.m */, + B9FE4D96E9551D946E8D2BB7312C0EBD /* QuickSelectedTestSuiteBuilder.swift */, + 34AC4F5E4E39D1C3AF89CEC5B360EA2D /* QuickSpec.h */, + B2D375478530E99780737CD66CD8DD93 /* QuickSpec.m */, + 1F1DAF6BB9F55D39AF40337558D846AE /* QuickSpecBase.h */, + 1142E838EF9E0ECBE2816DC30D200AF0 /* QuickSpecBase.m */, + 7849017A446FAAC1AA464BF30B3DB9A9 /* QuickTestSuite.swift */, + DDF4EB4F151410D97C620DA409F22EFC /* SuiteHooks.swift */, + 0B05419F27BE1D11F326BDE23BEBF0E7 /* URL+FileName.swift */, + FC029CDED30DA7B2ABF33E6954B7EB6D /* World.swift */, + FD7F1CBDC973E32E006EB9A8DCF2B225 /* World+DSL.swift */, + 52F937831EEA31D8B58ACEA667057BEE /* XCTestSuite+QuickTestSuiteBuilder.m */, + 2BC9D7FC0581B53AD03D521F505E91D7 /* Support Files */, ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/MachineLearningKit"; + name = Quick; + path = Quick; sourceTree = ""; }; - EB5A14FBFFD7D19B1C8F35011074CE5C /* ANN */ = { + DF9535B1A88C3A536047C0CAE39F16EC /* Pods-MLKit_Tests */ = { isa = PBXGroup; children = ( - 97CC96CA68BA0815524C996D3FD7D4C8 /* ActivationFunctionType.swift */, - DEA09D70E089028B813F7E3B421C5F78 /* InputDataType.swift */, - C22F81E5621CF7F9199426C6B30396E0 /* Layer.swift */, - 4F8B6CE41AAC2E1823ECFFB4021CC6E2 /* NeuralNetwork.swift */, + 0365A681452A1DA13C0E39C5DC0675EB /* Info.plist */, + E711FA07BCB7DDF1C300B40F196A5A8C /* Pods-MLKit_Tests.modulemap */, + 92787D690F848868A35127DDA567E382 /* Pods-MLKit_Tests-acknowledgements.markdown */, + 78E63F59786E0FA12C7D604E0A89EA14 /* Pods-MLKit_Tests-acknowledgements.plist */, + DF85C3F736F31B6E3DB7DFC71BD097C4 /* Pods-MLKit_Tests-dummy.m */, + E5E37B4BB6EC6AFEFF78D4BA53518B58 /* Pods-MLKit_Tests-frameworks.sh */, + DE2CD684208F87ED0F834DB064BDC989 /* Pods-MLKit_Tests-resources.sh */, + 6183EF695DE254CDFF2B81C50B41F244 /* Pods-MLKit_Tests-umbrella.h */, + 103DE453E6596254E367B645D93B900C /* Pods-MLKit_Tests.debug.xcconfig */, + 82120BC34AAA8690AB35CBC4292002FC /* Pods-MLKit_Tests.release.xcconfig */, ); - name = ANN; - path = ANN; + name = "Pods-MLKit_Tests"; + path = "Target Support Files/Pods-MLKit_Tests"; sourceTree = ""; }; - EC0EE2C9C961DB08307B5DAA831499AD /* Pods */ = { + E3315A0E863D94D2852A046A57C6381D /* K Means Clustering */ = { isa = PBXGroup; children = ( - ACF52AC05372AE6D4CFF78D07529B37B /* Nimble */, - 079067B8263219CD4F9533B01088DD9E /* Quick */, - 3E25486F8A00548F48F062EE3E3C5DA6 /* Upsurge */, + 8CE78F76EE57AA3351A3BDC2DF75A472 /* KMeans.swift */, ); - name = Pods; + name = "K Means Clustering"; + path = "MLKit/Classes/K Means Clustering"; sourceTree = ""; }; - F0131D05BEC2BD586052E0ECAF5DD440 /* Pods-MLKit_Tests */ = { + E9C62807DC6498F4D3C6E96926B82AF7 /* Pods-MLKit_Example */ = { isa = PBXGroup; children = ( - E7B1ECDF505544DD10698F0466B6541D /* Info.plist */, - C7E15AEC4FF3B6933962B82D62626FC0 /* Pods-MLKit_Tests.modulemap */, - 2002FFD090C435360F60A33E88C41DBB /* Pods-MLKit_Tests-acknowledgements.markdown */, - A7A7DD8570BF793B588ADA5EE940E963 /* Pods-MLKit_Tests-acknowledgements.plist */, - 9D3A07F4F6A05CA6A00CF85FDA94AB57 /* Pods-MLKit_Tests-dummy.m */, - ABF3645F0FF96B3623FC6818DA9B5E03 /* Pods-MLKit_Tests-frameworks.sh */, - 2C176355D2DA1EB17207AE84594804D6 /* Pods-MLKit_Tests-resources.sh */, - A6F138A9EBF54B5A06DCE9CD171D6071 /* Pods-MLKit_Tests-umbrella.h */, - 32AA223B57196F7790D905F38D2517BF /* Pods-MLKit_Tests.debug.xcconfig */, - 440AC79C4CAC00E64494654CCFEB3615 /* Pods-MLKit_Tests.release.xcconfig */, + 30C1619989EFFEFB685F646D70830431 /* Info.plist */, + 8964581D635112603B39EFBBF40DE387 /* Pods-MLKit_Example.modulemap */, + 7A0D4F1E4771931E554C14EBD530BBF0 /* Pods-MLKit_Example-acknowledgements.markdown */, + D452C3BB7BB1790D5A4903D0B514CBF0 /* Pods-MLKit_Example-acknowledgements.plist */, + 26B0E28532E762E9902A82E87EC50B64 /* Pods-MLKit_Example-dummy.m */, + 74ADF229929EC6D9711C899553BE6EE1 /* Pods-MLKit_Example-frameworks.sh */, + 76B89ABEC28DF672A809E705A4840A93 /* Pods-MLKit_Example-resources.sh */, + E11A16A5E738A6972FCB39D12D520E9C /* Pods-MLKit_Example-umbrella.h */, + B70FD9CD88E839C57AEB90CE095321E4 /* Pods-MLKit_Example.debug.xcconfig */, + D2BFE4634D330CC7BDB6FD050266645B /* Pods-MLKit_Example.release.xcconfig */, ); - name = "Pods-MLKit_Tests"; - path = "Target Support Files/Pods-MLKit_Tests"; + name = "Pods-MLKit_Example"; + path = "Target Support Files/Pods-MLKit_Example"; sourceTree = ""; }; - F551375ACF695895BAD2B86463E2BE0F /* MLKit */ = { + F78C7557EE1B6D8A7347A3729962D3E0 /* iOS */ = { isa = PBXGroup; children = ( - 4AE7C6F0FD3648726140001A937F65A4 /* Classes */, + CBE1188D696473745440C84BF05C42B7 /* Accelerate.framework */, + D30148A07FBE46E8C69E5F875B9AD8E6 /* Foundation.framework */, + 80DFF51CCA5EBBCE893D89BB5F3498AD /* MapKit.framework */, + C54F7F18FAF0353E348C4DD3B716DB00 /* UIKit.framework */, + E5C08A8967C75927DD6642B47902110B /* XCTest.framework */, ); - name = MLKit; - path = MLKit; + name = iOS; sourceTree = ""; }; FC789AF5844FCEF085DA24E590C6103E /* Frameworks */ = { isa = PBXGroup; children = ( 29E88E2BB63028C27C1E53746F101DF7 /* Upsurge.framework */, - ABCDED8B3EE7643CE616D3F7D8243E3B /* iOS */, + F78C7557EE1B6D8A7347A3729962D3E0 /* iOS */, ); name = Frameworks; sourceTree = ""; @@ -880,88 +895,86 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 25A84B3E3A024D9BF706D46FD80B1BFA /* Headers */ = { + 218360F643848CEAD782B4444605846F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 20C32450383B494CC9EF7F3072369EE0 /* Pods-MLKit_Tests-umbrella.h in Headers */, + 6487761C38E6711E2C194CFDF3BF0447 /* Pods-MLKit_Tests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6715D50B9530063A587A479ADF8A97C0 /* Headers */ = { + 2B487A80240E070C2FF26BD41CAFED64 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - B16340143CE7FF40A32CD8082ED4152D /* CurrentTestCaseTracker.h in Headers */, - 88B771FB81DD05BF7E48A0D9271D9EB4 /* CwlCatchBadInstruction.h in Headers */, - DEF289C7BF4E97D42B06B1EB7CAE0951 /* CwlCatchException.h in Headers */, - 4A17E1DB4EA2CCBF04B76F5F8EB417A1 /* DSL.h in Headers */, - 874EF0A06B9FC80B877261425BAB4ED2 /* mach_excServer.h in Headers */, - 7BD907A708031D5361E1A97CACF9F24E /* Nimble-umbrella.h in Headers */, - 409A3ECDDC680D0BD343E3F203862E25 /* Nimble.h in Headers */, - E9CD7EF9DD6E75404E4264F6F0AC8D26 /* NMBExceptionCapture.h in Headers */, - 926F67C94121C19A959745138E5B42B6 /* NMBStringify.h in Headers */, + B0A24F0E24E02201A246F0D58523ED7E /* CwlCatchException.h in Headers */, + B0C88072D75620D68F7C690CF2CD2D92 /* CwlMachBadInstructionHandler.h in Headers */, + 1CFDB94DFF57F98BA7A40829DDB3CFC0 /* CwlPreconditionTesting.h in Headers */, + 40A171EDCB95C2F32A957676476A25BC /* DSL.h in Headers */, + ED70B4997FC9EEA54B89CBFF3DCC27A9 /* mach_excServer.h in Headers */, + 9108613C28FC0D1A7948C6B4FE64932F /* Nimble-umbrella.h in Headers */, + 1D230EC73A17C8494F279447636B6D51 /* Nimble.h in Headers */, + 1B1A26FD4363A19DEFED48BF5E5341BE /* NMBExceptionCapture.h in Headers */, + 0EFF888E42BD1DF8B77FA6B547BC9149 /* NMBStringify.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7C5B32BF357C66C1587EAF79DA4844AF /* Headers */ = { + 37E3933EAFC38DEA5F8D2568A143F484 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 51CE8C2AEBC657C98FFC03B61E97B412 /* Upsurge-umbrella.h in Headers */, + F714F0DD6B5353FBF76FA23B94519C4E /* MachineLearningKit-umbrella.h in Headers */, + 3D166297C8E5CFF2F002B9CEC9D5C6F1 /* MLKit.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 87CDD88C8BC6FB4A0E318A7AF6364EBF /* Headers */ = { + 7C5B32BF357C66C1587EAF79DA4844AF /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 61554BF9F5D2997AD26BC61F4674CD68 /* Pods-MLKit_Example-umbrella.h in Headers */, + 51CE8C2AEBC657C98FFC03B61E97B412 /* Upsurge-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A1CA5F639B850916A375701104ECB0BE /* Headers */ = { + 87CDD88C8BC6FB4A0E318A7AF6364EBF /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - DA5FD83FA962C78A2484186465AB5AF2 /* MachineLearningKit-umbrella.h in Headers */, - 06701D0572D99FF3577E0C4F3E308FE8 /* MLKit.h in Headers */, + 61554BF9F5D2997AD26BC61F4674CD68 /* Pods-MLKit_Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - F1E8026C9E06D051DD2D14CB16938926 /* Headers */ = { + BBA184D6390CAF591C3ED4020A773FCD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3068D78E8F744939B04CA6B03D3380AA /* QCKDSL.h in Headers */, - DA90A10D3A108672F7D61F8A96C42650 /* Quick-umbrella.h in Headers */, - 15B880A364E4467B8496FB49A27371AA /* Quick.h in Headers */, - 86E4EF6BCCB1EF6E67552FCD7A3B6D6E /* QuickConfiguration.h in Headers */, - 4FDFB4587C55A09C0A2E3A3780568B54 /* QuickSpec.h in Headers */, - 74534A7B8A7904903E206702029453C8 /* QuickSpecBase.h in Headers */, - 4540D4FBCD937483258578DE32634108 /* World+DSL.h in Headers */, - 8E00B22C6FE14FEF9B828106A8B1622F /* World.h in Headers */, + 835ED63895528314B94936A1222496AE /* QCKDSL.h in Headers */, + 8BE24F68EE0482CBCA709E049318823A /* Quick-umbrella.h in Headers */, + B034B1EA1C94BBDFFA3564E010A56A04 /* Quick.h in Headers */, + E693ED027F354D0C0B26BA260073C5D1 /* QuickConfiguration.h in Headers */, + 6021482B94C91267E84D163309B95763 /* QuickSpec.h in Headers */, + 73913EBEE109B560765B9C354EE333DE /* QuickSpecBase.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 0921CC2F4398BE9A4F1CEACB30684B56 /* Nimble */ = { + 0C900B9C11E235F9DF95A64E8C83D049 /* Quick */ = { isa = PBXNativeTarget; - buildConfigurationList = 761C67FF258DB3BE6B2D4612FA9938E8 /* Build configuration list for PBXNativeTarget "Nimble" */; + buildConfigurationList = 4F29BCC7A631798DD7E69AAB9EB114C9 /* Build configuration list for PBXNativeTarget "Quick" */; buildPhases = ( - 41E146CA370726574B1C3087CF111D13 /* Sources */, - A0673853CCFEF089C0BF4D09E710CC4F /* Frameworks */, - 6715D50B9530063A587A479ADF8A97C0 /* Headers */, + E5B61EF4550B15D136D57EE7CA2DEF72 /* Sources */, + E883C83B47F861096C0E2E69092FB001 /* Frameworks */, + BBA184D6390CAF591C3ED4020A773FCD /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = Nimble; - productName = Nimble; - productReference = BC1FE7307C927E1E6A92842F57E0C7C9 /* Nimble.framework */; + name = Quick; + productName = Quick; + productReference = 1CA1E0D7EDD11FD11C55B7AC425EA02C /* Quick.framework */; productType = "com.apple.product-type.framework"; }; 11214F2158317CCF8497B1AFC05251A3 /* Pods-MLKit_Example */ = { @@ -987,9 +1000,9 @@ isa = PBXNativeTarget; buildConfigurationList = 1E2225DCCFCA6849974B71B670645A6C /* Build configuration list for PBXNativeTarget "MachineLearningKit" */; buildPhases = ( - 601A39245B6A4430792A69ED3568C841 /* Sources */, + 537D89B97E31DE3011C2F76992463FCA /* Sources */, F66E990DDCA2AB92E5BE088582FF8849 /* Frameworks */, - A1CA5F639B850916A375701104ECB0BE /* Headers */, + 37E3933EAFC38DEA5F8D2568A143F484 /* Headers */, ); buildRules = ( ); @@ -1001,28 +1014,31 @@ productReference = 8D5D6E6E6D3B6CCBD5B8D01D78A6C3A1 /* MachineLearningKit.framework */; productType = "com.apple.product-type.framework"; }; - 405857F01F82B80417D1BCAA762E7FA5 /* Quick */ = { + 51546CB00C38E8676C273E818A48875F /* Pods-MLKit_Tests */ = { isa = PBXNativeTarget; - buildConfigurationList = 4521CA563498BBBB8638765DDF2E0D43 /* Build configuration list for PBXNativeTarget "Quick" */; + buildConfigurationList = C5C4F6359CB2CD785308C45900AD3C1D /* Build configuration list for PBXNativeTarget "Pods-MLKit_Tests" */; buildPhases = ( - DAACD664EAA3ACAA0A0B897994FBF48E /* Sources */, - E4DCA3407A8C0FB721EDC1348B32DECF /* Frameworks */, - F1E8026C9E06D051DD2D14CB16938926 /* Headers */, + C86DEDD44497AAC99191FB189AC915B3 /* Sources */, + DC385C7AD4FA36B921F14CA4DF14FDF3 /* Frameworks */, + 218360F643848CEAD782B4444605846F /* Headers */, ); buildRules = ( ); dependencies = ( + 54DE40E47A756BEA8F4E1F16710682CE /* PBXTargetDependency */, + C2B0478F257BCC06196A231459EC4CF9 /* PBXTargetDependency */, + 262565959319F45D1859827CB52E66D8 /* PBXTargetDependency */, ); - name = Quick; - productName = Quick; - productReference = 1CA1E0D7EDD11FD11C55B7AC425EA02C /* Quick.framework */; + name = "Pods-MLKit_Tests"; + productName = "Pods-MLKit_Tests"; + productReference = 57189BBB8E0A886933E15F0E294E2908 /* Pods_MLKit_Tests.framework */; productType = "com.apple.product-type.framework"; }; 6C57B4D688C9D6216427DD10ADDFFCB6 /* Upsurge */ = { isa = PBXNativeTarget; buildConfigurationList = 1689072BD2C522D2F716D50D402AEC59 /* Build configuration list for PBXNativeTarget "Upsurge" */; buildPhases = ( - C589758AE8B90E8A34CC11BE88742800 /* Sources */, + 0E2B00E1C4E97300A50735D8F5A52AA7 /* Sources */, 4FA44FA5690174F265A6D6C6A7652A7B /* Frameworks */, 7C5B32BF357C66C1587EAF79DA4844AF /* Headers */, ); @@ -1035,23 +1051,21 @@ productReference = 289B26827495B1EA15C10A9AFE473C7A /* Upsurge.framework */; productType = "com.apple.product-type.framework"; }; - 9E9C8675948A927700EE9576202C417B /* Pods-MLKit_Tests */ = { + BA85E3619866E2EAA8CC3EDE21C659FC /* Nimble */ = { isa = PBXNativeTarget; - buildConfigurationList = 82174FC6C6E04470F8797B33ACE22503 /* Build configuration list for PBXNativeTarget "Pods-MLKit_Tests" */; + buildConfigurationList = 8FC360693D1D0CDE34D2234C9BEDB081 /* Build configuration list for PBXNativeTarget "Nimble" */; buildPhases = ( - 74D078A8B5616E755E7EAA8F963C6FC2 /* Sources */, - B86FB0EBB7F7A201A10E81C25CD1B0E2 /* Frameworks */, - 25A84B3E3A024D9BF706D46FD80B1BFA /* Headers */, + 7D3D6E878E76492930EDEF343B7440E4 /* Sources */, + 574B86180AA21635BD44FF3398DFA2E2 /* Frameworks */, + 2B487A80240E070C2FF26BD41CAFED64 /* Headers */, ); buildRules = ( ); dependencies = ( - FACCEFD04D031E45FBC293233B19F81C /* PBXTargetDependency */, - F4E22DFEB546DDB30C129288CE1D0702 /* PBXTargetDependency */, ); - name = "Pods-MLKit_Tests"; - productName = "Pods-MLKit_Tests"; - productReference = 57189BBB8E0A886933E15F0E294E2908 /* Pods_MLKit_Tests.framework */; + name = Nimble; + productName = Nimble; + productReference = BC1FE7307C927E1E6A92842F57E0C7C9 /* Nimble.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -1060,8 +1074,8 @@ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0700; + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -1076,187 +1090,193 @@ projectRoot = ""; targets = ( 28C1C0C2E20677EBC9884E8E60383F6C /* MachineLearningKit */, - 0921CC2F4398BE9A4F1CEACB30684B56 /* Nimble */, + BA85E3619866E2EAA8CC3EDE21C659FC /* Nimble */, 11214F2158317CCF8497B1AFC05251A3 /* Pods-MLKit_Example */, - 9E9C8675948A927700EE9576202C417B /* Pods-MLKit_Tests */, - 405857F01F82B80417D1BCAA762E7FA5 /* Quick */, + 51546CB00C38E8676C273E818A48875F /* Pods-MLKit_Tests */, + 0C900B9C11E235F9DF95A64E8C83D049 /* Quick */, 6C57B4D688C9D6216427DD10ADDFFCB6 /* Upsurge */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 41E146CA370726574B1C3087CF111D13 /* Sources */ = { + 0E2B00E1C4E97300A50735D8F5A52AA7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D5D4E8223C271A19448FCEAC36A9B441 /* AdapterProtocols.swift in Sources */, - FAACCCDBE0D2785212E37468636AAB0A /* AllPass.swift in Sources */, - 7272DB71A8C5325A0778F63E6F6C9957 /* AssertionDispatcher.swift in Sources */, - B612F1F906E3AF8B1FC6B893229E83B6 /* AssertionRecorder.swift in Sources */, - 0DF2D4E6B55D67E28D8BE9EC5A25F24E /* Async.swift in Sources */, - AA6EAFA71E1A6862AA312D89A601C34F /* AsyncMatcherWrapper.swift in Sources */, - 80D1788131B3D3326041E62364F8C7AA /* BeAKindOf.swift in Sources */, - A87CA098369D61EFC7A05BD61512A3F5 /* BeAnInstanceOf.swift in Sources */, - D7408861438442F67469ACE39D1604C1 /* BeCloseTo.swift in Sources */, - AD2B0E5BFF8EAD0EDF0449F8D198277C /* BeEmpty.swift in Sources */, - 288DBE855F794BA1AE8BC47AA413693E /* BeginWith.swift in Sources */, - 30F80459D8D536D8B99880EDD353987A /* BeGreaterThan.swift in Sources */, - ABEE3775B4FD25B3C86EE712BC2502B2 /* BeGreaterThanOrEqualTo.swift in Sources */, - 5685322E421AB4DA6A91B26C09833B29 /* BeIdenticalTo.swift in Sources */, - 318F9AE6D9561CFB487071A821B4217D /* BeLessThan.swift in Sources */, - 1F707004C05C63F90F0030E8E4902D66 /* BeLessThanOrEqual.swift in Sources */, - AF7F875677FF3EB4B6ADDB1373B34249 /* BeLogical.swift in Sources */, - F100D41C0564EE46CA47DA9E3540DA70 /* BeNil.swift in Sources */, - D6A1634CFD5243D18DB762116C8CEF8F /* BeVoid.swift in Sources */, - C97B9F51427BCD4C63EC7D75AB161833 /* Contain.swift in Sources */, - 2DF80575B9759A9E8004F4F642D0D123 /* ContainElementSatisfying.swift in Sources */, - 0B846370B6EA04F7D7909A403DD16317 /* CwlBadInstructionException.swift in Sources */, - C39921387DA273A0952A999B0CDC03F9 /* CwlCatchBadInstruction.m in Sources */, - 1C37D984F1BBBC7278E1FB6BDB153892 /* CwlCatchBadInstruction.swift in Sources */, - DB5066EBB8C95A3F8818628C9CA6794D /* CwlCatchException.m in Sources */, - 34E0569B2666F68A70EB676EFDCC4434 /* CwlCatchException.swift in Sources */, - B1D876C441B5F61984E35ABB5210AFE6 /* CwlDarwinDefinitions.swift in Sources */, - B138DBC0F7D2656EE7E413BEA735C71D /* DSL+Wait.swift in Sources */, - C9132B1E287B7ECA69A90F4766ADE9C2 /* DSL.m in Sources */, - A279D4DAE8E16C5D8F9019CDBED14D73 /* DSL.swift in Sources */, - 383B3EF018CDFD095EFEB7D74769144A /* EndWith.swift in Sources */, - D9921CDBA36587248C63AFDD5B3C1981 /* Equal.swift in Sources */, - 4B6579FFF0062EEBBABB8336C0871171 /* Errors.swift in Sources */, - D93C5A1929F8FD53F7EF2C3CA16CCC95 /* Expectation.swift in Sources */, - 65335E2F74AE71C270659EC7E8725030 /* Expression.swift in Sources */, - 704DA81E48A5263B35189F36C5247A53 /* FailureMessage.swift in Sources */, - 32AB6828BB98A679D3EBCC16C7BE9566 /* Functional.swift in Sources */, - DC9C69D7524AFEECCDC73D5CF1F4C028 /* HaveCount.swift in Sources */, - F2ED0A18E020A07A092F957B2C7EF0E2 /* mach_excServer.c in Sources */, - A665BE606F6B28E89B531EDE41657ECE /* Match.swift in Sources */, - 0D4B1951108CF54E1968467D30C351B5 /* MatcherFunc.swift in Sources */, - E1554E6ED22E94CAD97E211C7FBA530B /* MatcherProtocols.swift in Sources */, - AF814F353BF9C15BAED3E4067DCC3BF7 /* MatchError.swift in Sources */, - 748BB746CA429F9C5D510EEF3245ECFD /* Nimble-dummy.m in Sources */, - 69F9C31FC991A69337CE9B599993D68D /* NimbleEnvironment.swift in Sources */, - 7276DB3552398200B421D06F207EC0E3 /* NimbleXCTestHandler.swift in Sources */, - 6F36A431DE56B28FD400D20036A23DE4 /* NMBExceptionCapture.m in Sources */, - 9D9155396F48333B854DBE586138EDBF /* NMBExpectation.swift in Sources */, - 2173F4681D2DDDF63A01A7439EDE1FD4 /* NMBObjCMatcher.swift in Sources */, - 123D36BB9CA549C55BBE6FC7D21BAB97 /* NMBStringify.m in Sources */, - 10B953E63951E8DB495AA5B5EBDBBABA /* PostNotification.swift in Sources */, - FD9373DD3C1910FB513089F4CD39613B /* RaisesException.swift in Sources */, - C08FCDC247B35C971F5AE7E58987E8AC /* SatisfyAnyOf.swift in Sources */, - DB039F39038342DE5258F386F694A9A0 /* SourceLocation.swift in Sources */, - 04AE1DC56A0C088489EA27CED5190838 /* Stringers.swift in Sources */, - 11EEDB6DB6F03E2AF3FC368AA32274AC /* ThrowAssertion.swift in Sources */, - B1D59A1BD0FBDF3BA9A5B65ACFC25D56 /* ThrowError.swift in Sources */, - EEACC5B78AFB71C8594380C005C17A4B /* XCTestObservationCenter+Register.m in Sources */, + 26C2857031D2CB5DE4BFC55F71E64229 /* 2DTensorSlice.swift in Sources */, + 8B4A8B4617BE1D9580BC7653ED4E3CCF /* Arithmetic.swift in Sources */, + BA65AB10ECCDF1B685D0BBDE49FF255F /* Auxiliary.swift in Sources */, + 9839BAE4DF6D8962D2BBE8E2DFDD1F08 /* Complex.swift in Sources */, + 2A64C14CA0740E07DF5604A89045B736 /* ComplexArithmetic.swift in Sources */, + 56C429A204D9FC3CA3E5B72C8E93EF9F /* ComplexArray.swift in Sources */, + D000AB338C568FBCCDFAF753350E1E6D /* ComplexArrayRealSlice.swift in Sources */, + FDADDA2F644E74CFFBC21DAE8B34D209 /* ComplexArraySlice.swift in Sources */, + E638C6BA5AF87A5D632C0EF4EC935EDF /* DSP.swift in Sources */, + B88F9184DF2ECC40C8EE0C63EDDCA197 /* Exponential.swift in Sources */, + 1D6F244C93C8350C8BD032AEDC9402C5 /* FFT.swift in Sources */, + CA5821BE1C1F8E0CBC0D1330410FC7C0 /* Hyperbolic.swift in Sources */, + 10C8501040563F6DC661872488E4EE05 /* Interval.swift in Sources */, + C09CE51A451E72D653FD4923A86EB852 /* LinearOperators.swift in Sources */, + 6F5BB0DEDCB97B6CA9BDC6E2BC894BCD /* LinearType.swift in Sources */, + 9D2DB6D873E1BCB6FE2200D4328F675A /* Matrix.swift in Sources */, + 3D3D94A184EB5C93F8887954BFB12C0B /* MatrixArithmetic.swift in Sources */, + 6BD5954D6D97255245EFDA13D419F5D9 /* MatrixSlice.swift in Sources */, + 32303624D5644DFA368BB8ADE56A5A80 /* PointerUtilities.swift in Sources */, + 4998726555D0E6AC12D7683597D6F3F0 /* QuadraticType.swift in Sources */, + 767D96C3DE8A33843E313EC5080E13C9 /* Real.swift in Sources */, + 88F07F135909FB51B8B6DC3E564F94C9 /* Sequence.swift in Sources */, + 1E03644651C38FCCC0C5614DF1CC4541 /* Span.swift in Sources */, + 06A1ED28CC8A4A7AA51A74E3F066B890 /* Tensor.swift in Sources */, + D7540984B876954995215DBAFF52EF9B /* TensorSlice.swift in Sources */, + DE4C1C79903A92287FD102F1E28C3A49 /* TensorType.swift in Sources */, + 924746047825777BE99D81F35E875981 /* Trigonometric.swift in Sources */, + E72A47B4B76741BE1090EED5A84F5A08 /* Upsurge-dummy.m in Sources */, + B76E5CB09EC007EED55BB57E320692AE /* Value.swift in Sources */, + 3D5F2F7E4A2DE9B43A8965BB56179E4A /* ValueArray.swift in Sources */, + C7155137CD896EFAD562C90E1A461EE2 /* ValueArraySlice.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 601A39245B6A4430792A69ED3568C841 /* Sources */ = { + 537D89B97E31DE3011C2F76992463FCA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2DB201D5AC1FCE6C27412155BACDF7F6 /* ActivationFunctionType.swift in Sources */, - 8B633AB7CA7CD7773A1C426781C08948 /* BiologicalProcessManager.swift in Sources */, - 694FFDD18CDDC9EC5B5F52779DEC4133 /* CSVReader.swift in Sources */, - ABE2A268050AA3DEFDF8D945B9930866 /* DataManager.swift in Sources */, - AC3D1B5A37FB49CFDCC4C671C79B020F /* Extensions.swift in Sources */, - F4BD351BF32EA4E81E2971E225914D1E /* Genome.swift in Sources */, - B4590BB72005AC96211E469104D92DB5 /* InputDataType.swift in Sources */, - 5FB36CC3D65A05755802D9EC66B0AEDC /* KMeans.swift in Sources */, - 92EDDC00A5D940D4F7361AEE6644BD30 /* LassoRegression.swift in Sources */, - 48D3AEB90C6F865FB5128840EF13CAC8 /* Layer.swift in Sources */, - 04ADA7ED88E0D419D4DA1DB9DA1A2FF1 /* MachineLeanringErrorEnum.swift in Sources */, - 6B8EEA47C6BE87E17FD2F93747E2A4C5 /* MachineLearningKit-dummy.m in Sources */, - AE7464C0BFB56E8B11B0670A68B9CF12 /* NeuralNetwork.swift in Sources */, - 5B18BC28616DDC2DDE3442B98F00CF09 /* PolynomialRegression.swift in Sources */, - C7D1BAD68F1C67EA9AAE23534D3E9665 /* Population.swift in Sources */, - 6E55E227D9195A39F978F2DC1C408636 /* RidgeRegression.swift in Sources */, - 9FFFDDC2816EEAA4F74BE9FCF9681670 /* SimpleLinearRegression.swift in Sources */, + 0ECBFD6DD2705D603B58B6CDBB4ECB55 /* ActivationFunctionType.swift in Sources */, + DE1AF2FCB9BD497D0A0D866D8895AC3A /* BiologicalProcessManager.swift in Sources */, + 94299DD46562D02D0529FC16C10C39AF /* CSVReader.swift in Sources */, + 8A5B774CBE0C649BD8AE0C6EBD802777 /* DataManager.swift in Sources */, + 38987AF1005F71F197DE94320F9311A0 /* Extensions.swift in Sources */, + DCCC78645AB51BCBDC92B41E7178C5DA /* Genome.swift in Sources */, + BB1F8C46AB981EA52FA280F8E2B8E4AB /* InputDataType.swift in Sources */, + 7C01BD975A436D2AE25C109908B8E519 /* KMeans.swift in Sources */, + D4B3F9CB9B4FF5379324C4D94DE2B189 /* LassoRegression.swift in Sources */, + 51E8ED4E1C9624CEA91CE72E31A77352 /* Layer.swift in Sources */, + 6C761ED9AC2B10745751A1D07ADBFB5A /* MachineLeanringErrorEnum.swift in Sources */, + A5FC691080848921A6D86C349E32AFB3 /* MachineLearningKit-dummy.m in Sources */, + A5A9F8A2E529DDE72AC3A69E1649B607 /* NeuralNetwork.swift in Sources */, + D3F727B55FB86EA9C679DEC4ABF8C136 /* PolynomialRegression.swift in Sources */, + B992D07E451C740A64C11452ADAC34C8 /* Population.swift in Sources */, + 512C40F8402C23DFF6D7C8616B4A752B /* RidgeRegression.swift in Sources */, + 608484BC82ED853B02509AFF26C1DAF7 /* SimpleLinearRegression.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 74D078A8B5616E755E7EAA8F963C6FC2 /* Sources */ = { + 7B8C6AE84F93B90087CCA44B0AF2B2B7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 31DAC2CCBBF3C8BA68AB4DC7912A199B /* Pods-MLKit_Tests-dummy.m in Sources */, + C83188A450E13A233EF77D94306E926D /* Pods-MLKit_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7B8C6AE84F93B90087CCA44B0AF2B2B7 /* Sources */ = { + 7D3D6E878E76492930EDEF343B7440E4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C83188A450E13A233EF77D94306E926D /* Pods-MLKit_Example-dummy.m in Sources */, + B51FCB764739D557C3BB3FDBE8107D39 /* AdapterProtocols.swift in Sources */, + 00D139EEB6792519BEAF55EA35ED8F83 /* AllPass.swift in Sources */, + 11B8DC63427760E55702E36491E82FA5 /* AssertionDispatcher.swift in Sources */, + 4A829DC29EC5600B259E1CA203C7131D /* AssertionRecorder.swift in Sources */, + 3C12D78CF670FBEDBC28AA6ED303CBEA /* Async.swift in Sources */, + 2339AFF95F06AB4A518AAA46A27255D6 /* AsyncMatcherWrapper.swift in Sources */, + 1BBFE5E8E35BF18EC9F4C8BD8EC1C060 /* BeAKindOf.swift in Sources */, + 2A58E899DD8B5F96FE9C3EDE09DA4275 /* BeAnInstanceOf.swift in Sources */, + 619CAC289E6EBE57D6AD4C6C4CA0CD17 /* BeCloseTo.swift in Sources */, + 37B2802744DEADBC4FD37AF8E53EAE8C /* BeEmpty.swift in Sources */, + F5F7F03D04479B0EE47D69DF65EA53B6 /* BeginWith.swift in Sources */, + 28CFC0568B5E674FF8F0AF1CC0E54ADF /* BeGreaterThan.swift in Sources */, + D99EEA3143EABF137D39E3A97FFD84DE /* BeGreaterThanOrEqualTo.swift in Sources */, + 90BA044032941979487072C733619240 /* BeIdenticalTo.swift in Sources */, + 442F136F23EFE21E3975E58EB88FEA2C /* BeLessThan.swift in Sources */, + 004C4A6F461C216F03A05253CA730BEF /* BeLessThanOrEqual.swift in Sources */, + BAABCE6AB9AC7ABC3C9A7CDF8A6FF8A7 /* BeLogical.swift in Sources */, + 258E93DF9434A618A4A4E48C5CAA41CD /* BeNil.swift in Sources */, + F02C4FA6C6F8D9B7C8FECB076DCEC9EE /* BeVoid.swift in Sources */, + 21979416B2B4389E1A489EE0C33A536B /* Contain.swift in Sources */, + 97E3A1B8E5B7EF1D2399B486FE63BCAB /* ContainElementSatisfying.swift in Sources */, + EDC4B37063B934740542A03374BE3DC7 /* CwlBadInstructionException.swift in Sources */, + 057FD6F9061B0A2B9BFE252D3C102A3B /* CwlCatchBadInstruction.swift in Sources */, + 6D35850AE79F6BB1812DB02D1D2C4B95 /* CwlCatchException.m in Sources */, + F7AC37D64DE8E79CC8275835892F4490 /* CwlCatchException.swift in Sources */, + A3F6738E2A7AC46F9C8F091372EB9331 /* CwlDarwinDefinitions.swift in Sources */, + 695BC1AED063402F2284EB3F846EBEB8 /* CwlMachBadInstructionHandler.m in Sources */, + A8F7AF423D60D84B30D46CA84A88819D /* DSL+Wait.swift in Sources */, + 44B5C5D451E86F04D22C0E2132D0424D /* DSL.m in Sources */, + F376FB1DBE7FB046CDA7388B7035FBB5 /* DSL.swift in Sources */, + 1F7C236A1386F8EDED5E6445FD19C9E3 /* EndWith.swift in Sources */, + B0CE1B8655743386970201D46EA88589 /* Equal.swift in Sources */, + 5D25D8140BE47BEDA9E07C8BB641BB4F /* Errors.swift in Sources */, + F82D4E195C2879A141A4DA12CB912078 /* Expectation.swift in Sources */, + 40CD85252642CD7C44BEFA855FF493D4 /* ExpectationMessage.swift in Sources */, + 413C30B3D21CDEA27D0B380A677F42F1 /* Expression.swift in Sources */, + A03E49A483BD40BD3A8B943A8A963764 /* FailureMessage.swift in Sources */, + F969AEB2E68708B5A0B901C7EA6BBD93 /* Functional.swift in Sources */, + 782667D2D5260BAEF7473BC258613D13 /* HaveCount.swift in Sources */, + E6B23012319D7A5969C414F36A2B5DEE /* mach_excServer.c in Sources */, + D4854F8569321A500968B34987FFFB30 /* Match.swift in Sources */, + 53DCB7202178EC5C3E6727168073391F /* MatcherFunc.swift in Sources */, + D69CEF312A13F98B8E5746A02F5A59AB /* MatcherProtocols.swift in Sources */, + 3AD17A92405C1EF8A71E7B2A24C84170 /* MatchError.swift in Sources */, + FF62BEF08E929321B76037A261B9D23C /* Nimble-dummy.m in Sources */, + 73EA7ECA35082C124EB45D82F12D027A /* NimbleEnvironment.swift in Sources */, + CC7D11A33BD4AC9581D2C01C28B26C1D /* NimbleXCTestHandler.swift in Sources */, + D03B3661A806DB01D904EC24E59B7E2E /* NMBExceptionCapture.m in Sources */, + CD780F20B5B520C03C95726C6E23A4A1 /* NMBExpectation.swift in Sources */, + BDA66F64BCBE78B25D470F3184B50532 /* NMBObjCMatcher.swift in Sources */, + BAAD4E7A01DD015FCB6E2AE29462D2EE /* NMBStringify.m in Sources */, + AC0DC051DDF5D34B02E9A4938226F8FC /* PostNotification.swift in Sources */, + 1995EBB8E64C83233C202827D2D642E9 /* Predicate.swift in Sources */, + 320DB9CF630DCAD9F57987783F2BCCA6 /* RaisesException.swift in Sources */, + 4B3023C8B818F53F59316503EA79812C /* SatisfyAllOf.swift in Sources */, + 0B24159FEC50346D438B9E0EECBEE8BE /* SatisfyAnyOf.swift in Sources */, + F6FD9357A3EF5F6736CC2AFA82520534 /* SourceLocation.swift in Sources */, + 12080BB18AFDA64D95FD31E27B28A66D /* Stringers.swift in Sources */, + 9C3FBF83F72E03F08F977DFA1218B5F9 /* ThrowAssertion.swift in Sources */, + FAE9DB89C9544E5C56345A371A49F7FD /* ThrowError.swift in Sources */, + 7322E5D673689B017FCF72610299ECF0 /* ToSucceed.swift in Sources */, + B4984DA0EF9EFB51A61EB447F969389D /* XCTestObservationCenter+Register.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C589758AE8B90E8A34CC11BE88742800 /* Sources */ = { + C86DEDD44497AAC99191FB189AC915B3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A1F2BC02366DABC762E62F506B6D1AC2 /* 2DTensorSlice.swift in Sources */, - 17B85BEE3D018EB0AF42539D1658D24E /* Arithmetic.swift in Sources */, - 2991245B488F3F00EDCFD3EFB2244294 /* Auxiliary.swift in Sources */, - 249AC8A0B6CC8D4D92DA5D841D712900 /* Complex.swift in Sources */, - 6F74F8072E2C42E51624D0B89AB03048 /* ComplexArithmetic.swift in Sources */, - 7E08966D0A420CCE741F608370F4759C /* ComplexArray.swift in Sources */, - 7E950AE4BC7D603625CBFD877F63728C /* ComplexArrayRealSlice.swift in Sources */, - 86D13DA212D4F8A87E212941DF61361D /* ComplexArraySlice.swift in Sources */, - 78726014CB6610CA87B10E02D148478A /* DSP.swift in Sources */, - 519349F9AF137FFAD28A594685046460 /* Exponential.swift in Sources */, - DFA04175FF8EB3DFFA5FFEEF93996E7C /* FFT.swift in Sources */, - 178FA5CACF9ACD91FBBEB0DF8892201F /* Hyperbolic.swift in Sources */, - B1A6D9047AE13EF484B5F58F215440A1 /* Interval.swift in Sources */, - 50471C0EFA0C6F13833F63066765DCFF /* LinearOperators.swift in Sources */, - 3E456278E0D7B190269739DA08693C9E /* LinearType.swift in Sources */, - 153AA07F19B6F56DE6BB54E6D7BBF1E5 /* Matrix.swift in Sources */, - 438262E9AEBC5203D56677E842F563D5 /* MatrixArithmetic.swift in Sources */, - 7900A1BADFEB30B7D803D0869E548E10 /* MatrixSlice.swift in Sources */, - FCB81A907C61E1883C282A0271C05D7E /* PointerUtilities.swift in Sources */, - A711AA562D0AD3092BAF83E2CFCC86A7 /* QuadraticType.swift in Sources */, - 643B6917C3157C68C92A7260459DC694 /* Real.swift in Sources */, - 2B132F4EB4A9D60A8439EFAC1D0D6D2C /* Span.swift in Sources */, - 7F5D5AFA3C84AA582DEDC6A6C78E7533 /* Tensor.swift in Sources */, - D234F610A6025A894A8CF8971A8F96C0 /* TensorSlice.swift in Sources */, - 562D9F54656827753A037634D5385BFD /* TensorType.swift in Sources */, - CC420602CB84B73545CD09A3DAD3F638 /* Trigonometric.swift in Sources */, - 3E699E314F200C3EEF7C7E0D46E26B79 /* Upsurge-dummy.m in Sources */, - A8F199FA1C0D1AD05EADD8EFBC00592B /* Value.swift in Sources */, - BCA0250C524C4316B3D4D6415A4969C8 /* ValueArray.swift in Sources */, - 3C8CBA02B15729E98A0F63382FE6217B /* ValueArraySlice.swift in Sources */, + 9CFDD01A2D0AA56E4A6C72B232021B71 /* Pods-MLKit_Tests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - DAACD664EAA3ACAA0A0B897994FBF48E /* Sources */ = { + E5B61EF4550B15D136D57EE7CA2DEF72 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3FFDB93012DF1EBF973430063D61C96D /* Callsite.swift in Sources */, - 508E5B8353068B37CA6F40E3D7B89D42 /* Closures.swift in Sources */, - F863E54F759068A89CD87B9121C7F6A0 /* Configuration.swift in Sources */, - BD782803F394A708E7D3223EBDE31C95 /* DSL.swift in Sources */, - F96CD569B97BF947F19270C6C1D0FA23 /* ErrorUtility.swift in Sources */, - 7C94AD7C4A4F54FB18623AD4E5CD64F7 /* Example.swift in Sources */, - BCCBC7CED6FB9D71D85D8044B209B09A /* ExampleGroup.swift in Sources */, - 646824AF5ADC1159EBC9CAC023BAED4E /* ExampleHooks.swift in Sources */, - B231D3FAB3CCEF59EC681C7C51C0AE56 /* ExampleMetadata.swift in Sources */, - 88FEF6149AF4FA0DEE3DBCBFD20BE64C /* Filter.swift in Sources */, - C9AAE13CC11B5370479EA08F706EA61F /* HooksPhase.swift in Sources */, - F6947DC02F61303F74AF8602F1A1BE68 /* NSBundle+CurrentTestBundle.swift in Sources */, - 8995462F1A16CFB4BB4B376A1DE531EA /* NSString+C99ExtendedIdentifier.swift in Sources */, - 59667A95671EEAF87FA2272CE0B01451 /* QCKDSL.m in Sources */, - FE877D0C3D6700F0C8E5CCC0C5020462 /* Quick-dummy.m in Sources */, - 387B27F0A4DD48F245FF12E5485FB9BE /* QuickConfiguration.m in Sources */, - 458ECBFAB660567138EFA52210058C36 /* QuickSelectedTestSuiteBuilder.swift in Sources */, - 4D339AFDC6B6AAA44BA5C0CD471B6EA2 /* QuickSpec.m in Sources */, - 46AAFE6E2E75D62AF8DFED367375002C /* QuickSpecBase.m in Sources */, - 6C52EF3CBF595A0DC903558A35E303D9 /* QuickTestSuite.swift in Sources */, - 35E498D7267B6961DED0706D43F883A0 /* SuiteHooks.swift in Sources */, - B18BBE44B0684143A1542A9ADC880697 /* URL+FileName.swift in Sources */, - 0B9A16DAD08AFA59EDD6058831216A70 /* World+DSL.swift in Sources */, - 96154D504405D81853EF3326A10CA05C /* World.swift in Sources */, - 18F58A2CDEFED6B5617F4944FC84DBEE /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, + AE0F790B7BC316B1D8AE83B58753E213 /* Behavior.swift in Sources */, + FD175D10EE7DBD2C7A83BF8BD9125329 /* Callsite.swift in Sources */, + BB11FBD2359EF261F71F076ED124D8B1 /* Closures.swift in Sources */, + 4D0E207D7B0997A03091983024832904 /* Configuration.swift in Sources */, + 46C3577F6C8DB66064E956935F063CB7 /* DSL.swift in Sources */, + E679DCFB9825A7B5B92CF584273D20F7 /* ErrorUtility.swift in Sources */, + 6A6894A8FD8E3A149E513F76A752EC91 /* Example.swift in Sources */, + D61297130E9E49830B044AA557E4A06F /* ExampleGroup.swift in Sources */, + 3C1C9BDF15626EB1AF76EDD10A87F2CA /* ExampleHooks.swift in Sources */, + 13222A32A26429EB6E1D112C5F8B97D4 /* ExampleMetadata.swift in Sources */, + D60BCC22E506E252B7F4C6E9675D7B57 /* Filter.swift in Sources */, + CE0B2DB399E32E476CCC40B18DF1BD3E /* HooksPhase.swift in Sources */, + 22731B945A88C7E0BEE56C04EA79B854 /* NSBundle+CurrentTestBundle.swift in Sources */, + 36803D11BA838FB1E1D131AA6F366EB7 /* NSString+C99ExtendedIdentifier.swift in Sources */, + 8E3B0618CF9A19EE391875415CDD1E2E /* QCKDSL.m in Sources */, + 3623C7E6A6B2657435DC80924EB8DE60 /* Quick-dummy.m in Sources */, + 8995A017033F9847A868FA9B081471B7 /* QuickConfiguration.m in Sources */, + 9F05AD64FA1B9ED2EDD6C485C5E6D296 /* QuickSelectedTestSuiteBuilder.swift in Sources */, + A0A56298A62CC7D47428EAADCB13E913 /* QuickSpec.m in Sources */, + D0FF7942A83B866A85C4EEA65BE2A8BC /* QuickSpecBase.m in Sources */, + AF504059860A2519D681686DC8C56D5A /* QuickTestSuite.swift in Sources */, + 8F3D92A40D06F36E61FD7ED6FBEE69BC /* SuiteHooks.swift in Sources */, + 854787B57491875DFF74CBA89571C9F6 /* URL+FileName.swift in Sources */, + DA2554FF0F87BDD44B56650B7C483B50 /* World+DSL.swift in Sources */, + 6A85BF50303C56690DD0B2B66CBADDA0 /* World.swift in Sources */, + B3091203BBEFA70B87EAC5CCFB28E32C /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1269,6 +1289,18 @@ target = 28C1C0C2E20677EBC9884E8E60383F6C /* MachineLearningKit */; targetProxy = 9438A9C923DBE3D0619348D344A7421F /* PBXContainerItemProxy */; }; + 262565959319F45D1859827CB52E66D8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Quick; + target = 0C900B9C11E235F9DF95A64E8C83D049 /* Quick */; + targetProxy = 197D4E6B5F102611AC7352D8583E7BA3 /* PBXContainerItemProxy */; + }; + 54DE40E47A756BEA8F4E1F16710682CE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Nimble; + target = BA85E3619866E2EAA8CC3EDE21C659FC /* Nimble */; + targetProxy = 61B7CC3502E6878E7FB482C64CEF9454 /* PBXContainerItemProxy */; + }; 90DA5471E0E3538891588E48A4CB29A6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Upsurge; @@ -1281,519 +1313,548 @@ target = 6C57B4D688C9D6216427DD10ADDFFCB6 /* Upsurge */; targetProxy = 0514A879DA60A69D36EBAE4BF82733F3 /* PBXContainerItemProxy */; }; - F4E22DFEB546DDB30C129288CE1D0702 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Quick; - target = 405857F01F82B80417D1BCAA762E7FA5 /* Quick */; - targetProxy = A5D12A1484F74731661DDE4440445475 /* PBXContainerItemProxy */; - }; - FACCEFD04D031E45FBC293233B19F81C /* PBXTargetDependency */ = { + C2B0478F257BCC06196A231459EC4CF9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Nimble; - target = 0921CC2F4398BE9A4F1CEACB30684B56 /* Nimble */; - targetProxy = 6261E54E70518E4B80DE3D3A4B3823C4 /* PBXContainerItemProxy */; + name = "Pods-MLKit_Example"; + target = 11214F2158317CCF8497B1AFC05251A3 /* Pods-MLKit_Example */; + targetProxy = 80173E14C71EB3A528D671C26839B22F /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 17B316A2899598BDD74C55E1B59D82FD /* Release */ = { + 199D972A13F2B4C56847F7A89CCA83BC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CC698E9958DEF380C0198EAA773F7DFF /* Pods-MLKit_Example.release.xcconfig */; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 1B7BE1F6AF0EBCFD15F0D10C2C122C88 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D2BFE4634D330CC7BDB6FD050266645B /* Pods-MLKit_Example.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; INFOPLIST_FILE = "Target Support Files/Pods-MLKit_Example/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_MLKit_Example; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 1F57ADE7C56706080006997E6C275DB3 /* Release */ = { + 3EF2A39388BC610E1725614C8974D8D6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 55F8E5E39CFFED8C8B0162606918FB20 /* MachineLearningKit.xcconfig */; + baseConfigurationReference = 9774CA86DF8D2DC26C4830B97504FBD6 /* Nimble.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MachineLearningKit/MachineLearningKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/MachineLearningKit/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/MachineLearningKit/MachineLearningKit.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = MachineLearningKit; + MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; + PRODUCT_MODULE_NAME = Nimble; + PRODUCT_NAME = Nimble; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 3AE4BFD193087F0DEDCBBAB5132B0402 /* Release */ = { + 5443EAE217639430B12E710CD2C17550 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 617F2E0CEEF4C400A8D6EADD86F6145C /* Quick.xcconfig */; + baseConfigurationReference = 82120BC34AAA8690AB35CBC4292002FC /* Pods-MLKit_Tests.release.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-MLKit_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Quick; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; - 59088DD680854A1D5D3725EA8D8E1AE3 /* Release */ = { + 60B0B87B0EC1875934FA8FBFA62E8DD9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 440AC79C4CAC00E64494654CCFEB3615 /* Pods-MLKit_Tests.release.xcconfig */; + baseConfigurationReference = 8989F80BF9DE58885C888CAF78A4C095 /* Upsurge.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-MLKit_Tests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Upsurge/Upsurge-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Upsurge/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_MLKit_Tests; + MODULEMAP_FILE = "Target Support Files/Upsurge/Upsurge.modulemap"; + PRODUCT_MODULE_NAME = Upsurge; + PRODUCT_NAME = Upsurge; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; - }; - 59B042A655B7C20CBAB90E385BF4E4C7 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - }; name = Debug; }; - 6E0EE5E4D9587D32D46FAB6E0C629563 /* Debug */ = { + 846BDF306D651C13C961DEAFD3774213 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 55F8E5E39CFFED8C8B0162606918FB20 /* MachineLearningKit.xcconfig */; + baseConfigurationReference = 943AC779D543443D52F1E0E5A33E7E8F /* MachineLearningKit.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/MachineLearningKit/MachineLearningKit-prefix.pch"; INFOPLIST_FILE = "Target Support Files/MachineLearningKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/MachineLearningKit/MachineLearningKit.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_MODULE_NAME = MachineLearningKit; PRODUCT_NAME = MachineLearningKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 7517CE46153100DA1635AF3CA5C55694 /* Debug */ = { + 8CDFD459644EDE319B67B65A790E9DD3 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 32AA223B57196F7790D905F38D2517BF /* Pods-MLKit_Tests.debug.xcconfig */; + baseConfigurationReference = F227CF09F2AD26717EECB3B56B8A901A /* Quick.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-MLKit_Tests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_MLKit_Tests; + MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; + PRODUCT_MODULE_NAME = Quick; + PRODUCT_NAME = Quick; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 9BE117501B83DA19687D6FADCC4279F2 /* Debug */ = { + AC538AFD6E4DA8277040622A1D5617A1 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = ED533B83CC472C5A00FECB4769AAC30A /* Nimble.xcconfig */; + baseConfigurationReference = B70FD9CD88E839C57AEB90CE095321E4 /* Pods-MLKit_Example.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-MLKit_Example/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Nimble; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - B18A6CA3C5F89421CF2B850F71721DF9 /* Debug */ = { + C27FFC3800348A6208709B5327ED6588 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 636673BDA1F06E469643F565D84270B5 /* Pods-MLKit_Example.debug.xcconfig */; + baseConfigurationReference = 9774CA86DF8D2DC26C4830B97504FBD6 /* Nimble.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-MLKit_Example/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_MLKit_Example; + MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; + PRODUCT_MODULE_NAME = Nimble; + PRODUCT_NAME = Nimble; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - B7324857C38B065FEB1EEE3105C2367A /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - B8A27CEE87BBFB37CB5E8AB07A8D2FCA /* Debug */ = { + C92CFF6E7D20E5F339324FCF41891631 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D9452A9050B54245FBAA633769A8E911 /* Upsurge.xcconfig */; + baseConfigurationReference = 943AC779D543443D52F1E0E5A33E7E8F /* MachineLearningKit.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Upsurge/Upsurge-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Upsurge/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/MachineLearningKit/MachineLearningKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MachineLearningKit/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Upsurge/Upsurge.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Upsurge; + MODULEMAP_FILE = "Target Support Files/MachineLearningKit/MachineLearningKit.modulemap"; + PRODUCT_MODULE_NAME = MachineLearningKit; + PRODUCT_NAME = MachineLearningKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - BB15404BBBD24D84297323F3F2DF19DB /* Release */ = { + EBB4D54E5C49260056F690F4D42F78B3 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D9452A9050B54245FBAA633769A8E911 /* Upsurge.xcconfig */; + baseConfigurationReference = 103DE453E6596254E367B645D93B900C /* Pods-MLKit_Tests.debug.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Upsurge/Upsurge-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Upsurge/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-MLKit_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Upsurge/Upsurge.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Upsurge; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - DA47FD752D5D7A33A663F9B51F4B3C69 /* Debug */ = { + F4E7DE2A892CD33D33BB3FD481134003 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 617F2E0CEEF4C400A8D6EADD86F6145C /* Quick.xcconfig */; + baseConfigurationReference = F227CF09F2AD26717EECB3B56B8A901A /* Quick.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_MODULE_NAME = Quick; PRODUCT_NAME = Quick; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - EF02B74193B9D2E215CD4A2203BDABE7 /* Release */ = { + F884FBCF1A12E7B94B7E36CC82175FFC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = ED533B83CC472C5A00FECB4769AAC30A /* Nimble.xcconfig */; + baseConfigurationReference = 8989F80BF9DE58885C888CAF78A4C095 /* Upsurge.xcconfig */; buildSettings = { + CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Upsurge/Upsurge-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Upsurge/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Nimble; + MODULEMAP_FILE = "Target Support Files/Upsurge/Upsurge.modulemap"; + PRODUCT_MODULE_NAME = Upsurge; + PRODUCT_NAME = Upsurge; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; + FDB2FC4A1E5891381CD9D922145497F1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_ALLOWED = NO; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1689072BD2C522D2F716D50D402AEC59 /* Build configuration list for PBXNativeTarget "Upsurge" */ = { isa = XCConfigurationList; buildConfigurations = ( - B8A27CEE87BBFB37CB5E8AB07A8D2FCA /* Debug */, - BB15404BBBD24D84297323F3F2DF19DB /* Release */, + 60B0B87B0EC1875934FA8FBFA62E8DD9 /* Debug */, + F884FBCF1A12E7B94B7E36CC82175FFC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1801,8 +1862,8 @@ 1E2225DCCFCA6849974B71B670645A6C /* Build configuration list for PBXNativeTarget "MachineLearningKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6E0EE5E4D9587D32D46FAB6E0C629563 /* Debug */, - 1F57ADE7C56706080006997E6C275DB3 /* Release */, + C92CFF6E7D20E5F339324FCF41891631 /* Debug */, + 846BDF306D651C13C961DEAFD3774213 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1810,44 +1871,44 @@ 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 59B042A655B7C20CBAB90E385BF4E4C7 /* Debug */, - B7324857C38B065FEB1EEE3105C2367A /* Release */, + 199D972A13F2B4C56847F7A89CCA83BC /* Debug */, + FDB2FC4A1E5891381CD9D922145497F1 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4521CA563498BBBB8638765DDF2E0D43 /* Build configuration list for PBXNativeTarget "Quick" */ = { + 4F29BCC7A631798DD7E69AAB9EB114C9 /* Build configuration list for PBXNativeTarget "Quick" */ = { isa = XCConfigurationList; buildConfigurations = ( - DA47FD752D5D7A33A663F9B51F4B3C69 /* Debug */, - 3AE4BFD193087F0DEDCBBAB5132B0402 /* Release */, + 8CDFD459644EDE319B67B65A790E9DD3 /* Debug */, + F4E7DE2A892CD33D33BB3FD481134003 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 761C67FF258DB3BE6B2D4612FA9938E8 /* Build configuration list for PBXNativeTarget "Nimble" */ = { + 8FC360693D1D0CDE34D2234C9BEDB081 /* Build configuration list for PBXNativeTarget "Nimble" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9BE117501B83DA19687D6FADCC4279F2 /* Debug */, - EF02B74193B9D2E215CD4A2203BDABE7 /* Release */, + C27FFC3800348A6208709B5327ED6588 /* Debug */, + 3EF2A39388BC610E1725614C8974D8D6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 82174FC6C6E04470F8797B33ACE22503 /* Build configuration list for PBXNativeTarget "Pods-MLKit_Tests" */ = { + C30EA1DD6F77AFEF81C24D0127F979A4 /* Build configuration list for PBXNativeTarget "Pods-MLKit_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7517CE46153100DA1635AF3CA5C55694 /* Debug */, - 59088DD680854A1D5D3725EA8D8E1AE3 /* Release */, + AC538AFD6E4DA8277040622A1D5617A1 /* Debug */, + 1B7BE1F6AF0EBCFD15F0D10C2C122C88 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C30EA1DD6F77AFEF81C24D0127F979A4 /* Build configuration list for PBXNativeTarget "Pods-MLKit_Example" */ = { + C5C4F6359CB2CD785308C45900AD3C1D /* Build configuration list for PBXNativeTarget "Pods-MLKit_Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( - B18A6CA3C5F89421CF2B850F71721DF9 /* Debug */, - 17B316A2899598BDD74C55E1B59D82FD /* Release */, + EBB4D54E5C49260056F690F4D42F78B3 /* Debug */, + 5443EAE217639430B12E710CD2C17550 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Example/Pods/Quick/Sources/Quick/Behavior.swift b/Example/Pods/Quick/Sources/Quick/Behavior.swift new file mode 100644 index 0000000..1d98702 --- /dev/null +++ b/Example/Pods/Quick/Sources/Quick/Behavior.swift @@ -0,0 +1,17 @@ +/** + A `Behavior` encapsulates a set of examples that can be re-used in several locations using the `itBehavesLike` function with a context instance of the generic type. + */ + +open class Behavior { + + open static var name: String { return String(describing: self) } + /** + override this method in your behavior to define a set of reusable examples. + + This behaves just like an example group defines using `describe` or `context`--it may contain any number of `beforeEach` + and `afterEach` closures, as well as any number of examples (defined using `it`). + + - parameter aContext: A closure that, when evaluated, returns a `Context` instance that provide the information on the subject. + */ + open class func spec(_ aContext: @escaping () -> Context) {} +} diff --git a/Example/Pods/Quick/Sources/Quick/Callsite.swift b/Example/Pods/Quick/Sources/Quick/Callsite.swift index bb5cc0c..f5e3711 100644 --- a/Example/Pods/Quick/Sources/Quick/Callsite.swift +++ b/Example/Pods/Quick/Sources/Quick/Callsite.swift @@ -1,10 +1,23 @@ import Foundation +// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` +// does not work as expected. +#if swift(>=3.2) + #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objcMembers + public class _CallsiteBase: NSObject {} + #else + public class _CallsiteBase: NSObject {} + #endif +#else +public class _CallsiteBase: NSObject {} +#endif + /** An object encapsulating the file and line number at which a particular example is defined. */ -final public class Callsite: NSObject { +final public class Callsite: _CallsiteBase { /** The absolute path of the file in which an example is defined. */ diff --git a/Example/Pods/Quick/Sources/Quick/Configuration/Configuration.swift b/Example/Pods/Quick/Sources/Quick/Configuration/Configuration.swift index 583651b..dbb95f1 100644 --- a/Example/Pods/Quick/Sources/Quick/Configuration/Configuration.swift +++ b/Example/Pods/Quick/Sources/Quick/Configuration/Configuration.swift @@ -72,7 +72,7 @@ final public class Configuration: NSObject { provided with metadata on the example that the closure is being run prior to. */ -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc(beforeEachWithMetadata:) public func beforeEach(_ closure: @escaping BeforeExampleWithMetadataClosure) { exampleHooks.appendBefore(closure) @@ -109,7 +109,7 @@ final public class Configuration: NSObject { is provided with metadata on the example that the closure is being run after. */ -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc(afterEachWithMetadata:) public func afterEach(_ closure: @escaping AfterExampleWithMetadataClosure) { exampleHooks.appendAfter(closure) diff --git a/Example/Pods/Quick/Sources/Quick/DSL/DSL.swift b/Example/Pods/Quick/Sources/Quick/DSL/DSL.swift index 3da2c42..94f20c5 100644 --- a/Example/Pods/Quick/Sources/Quick/DSL/DSL.swift +++ b/Example/Pods/Quick/Sources/Quick/DSL/DSL.swift @@ -167,6 +167,22 @@ public func itBehavesLike(_ name: String, flags: FilterFlags = [:], file: String World.sharedWorld.itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) } +/** + Inserts the examples defined using a `Behavior` into the current example group. + The shared examples are executed at this location, as if they were written out manually. + This function also passes a strongly-typed context that can be evaluated to give the shared examples extra information on the subject of the example. + + - parameter behavior: The type of `Behavior` class defining the example group to be executed. + - parameter context: A closure that, when evaluated, returns an instance of `Behavior`'s context type to provide its example group with extra information on the subject of the example. + - parameter flags: A mapping of string keys to booleans that can be used to filter examples or example groups. + Empty by default. + - parameter file: The absolute path to the file containing the current example group. A sensible default is provided. + - parameter line: The line containing the current example group. A sensible default is provided. + */ +public func itBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, context: @escaping () -> C) { + World.sharedWorld.itBehavesLike(behavior, context: context, flags: flags, file: file, line: line) +} + /** Defines an example or example group that should not be executed. Use `pending` to temporarily disable examples or groups that should not be run yet. @@ -202,6 +218,13 @@ public func xit(_ description: String, flags: FilterFlags = [:], file: String = World.sharedWorld.xit(description, flags: flags, file: file, line: line, closure: closure) } +/** + Use this to quicklu mark an `itBehavesLike` closure as pending. + This disables the example group defined by this behavior and ensures the code within is never run. +*/ +public func xitBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, context: @escaping () -> C) { + World.sharedWorld.xitBehavesLike(behavior, context: context, flags: flags, file: file, line: line) +} /** Use this to quickly focus a `describe` closure, focusing the examples in the closure. If any examples in the test suite are focused, only those examples are executed. @@ -239,3 +262,10 @@ public func fitBehavesLike(_ name: String, flags: FilterFlags = [:], file: Strin public func fitBehavesLike(_ name: String, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, sharedExampleContext: @escaping SharedExampleContext) { World.sharedWorld.fitBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) } + +/** + Use this to quickly focus on `itBehavesLike` closure. + */ +public func fitBehavesLike(_ behavior: Behavior.Type, flags: FilterFlags = [:], file: String = #file, line: UInt = #line, context: @escaping () -> C) { + World.sharedWorld.fitBehavesLike(behavior, context: context, flags: flags, file: file, line: line) +} diff --git a/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift b/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift index 127ca54..942c2e6 100644 --- a/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift +++ b/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift @@ -56,7 +56,7 @@ extension World { currentExampleGroup.hooks.appendBefore(closure) } -#if _runtime(_ObjC) +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE @objc(beforeEachWithMetadata:) internal func beforeEach(closure: @escaping BeforeExampleWithMetadataClosure) { currentExampleGroup.hooks.appendBefore(closure) @@ -74,7 +74,7 @@ extension World { currentExampleGroup.hooks.appendAfter(closure) } -#if _runtime(_ObjC) +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE @objc(afterEachWithMetadata:) internal func afterEach(closure: @escaping AfterExampleWithMetadataClosure) { currentExampleGroup.hooks.appendAfter(closure) @@ -85,6 +85,7 @@ extension World { } #endif + @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { if beforesCurrentlyExecuting { raiseError("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ") @@ -100,18 +101,21 @@ extension World { currentExampleGroup.appendExample(example) } + @nonobjc internal func fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { var focusedFlags = flags focusedFlags[Filter.focused] = true self.it(description, flags: focusedFlags, file: file, line: line, closure: closure) } + @nonobjc internal func xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { var pendingFlags = flags pendingFlags[Filter.pending] = true self.it(description, flags: pendingFlags, file: file, line: line, closure: closure) } + @nonobjc internal func itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { guard currentExampleMetadata == nil else { raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") @@ -131,30 +135,61 @@ extension World { } } + @nonobjc internal func fitBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { var focusedFlags = flags focusedFlags[Filter.focused] = true self.itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: focusedFlags, file: file, line: line) } -#if _runtime(_ObjC) + internal func itBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: String, line: UInt) { + guard currentExampleMetadata == nil else { + raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") + } + let callsite = Callsite(file: file, line: line) + let closure = behavior.spec + let group = ExampleGroup(description: behavior.name, flags: flags) + currentExampleGroup.appendExampleGroup(group) + performWithCurrentExampleGroup(group) { + closure(context) + } + + group.walkDownExamples { (example: Example) in + example.isSharedExample = true + example.callsite = callsite + } + } + + internal func fitBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: String, line: UInt) { + var focusedFlags = flags + focusedFlags[Filter.focused] = true + self.itBehavesLike(behavior, context: context, flags: focusedFlags, file: file, line: line) + } + + internal func xitBehavesLike(_ behavior: Behavior.Type, context: @escaping () -> C, flags: FilterFlags, file: String, line: UInt) { + var pendingFlags = flags + pendingFlags[Filter.pending] = true + self.itBehavesLike(behavior, context: context, flags: pendingFlags, file: file, line: line) + } + +#if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE @objc(itWithDescription:flags:file:line:closure:) - private func objc_it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { it(description, flags: flags, file: file, line: line, closure: closure) } @objc(fitWithDescription:flags:file:line:closure:) - private func objc_fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { fit(description, flags: flags, file: file, line: line, closure: closure) } @objc(xitWithDescription:flags:file:line:closure:) - private func objc_xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { xit(description, flags: flags, file: file, line: line, closure: closure) } @objc(itBehavesLikeSharedExampleNamed:sharedExampleContext:flags:file:line:) - private func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { + internal func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) } #endif diff --git a/Example/Pods/Quick/Sources/Quick/ErrorUtility.swift b/Example/Pods/Quick/Sources/Quick/ErrorUtility.swift index 8405a81..155fefd 100644 --- a/Example/Pods/Quick/Sources/Quick/ErrorUtility.swift +++ b/Example/Pods/Quick/Sources/Quick/ErrorUtility.swift @@ -1,7 +1,7 @@ import Foundation internal func raiseError(_ message: String) -> Never { -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) NSException(name: .internalInconsistencyException, reason: message, userInfo: nil).raise() #endif diff --git a/Example/Pods/Quick/Sources/Quick/Example.swift b/Example/Pods/Quick/Sources/Quick/Example.swift index 56b3303..cf7b4a3 100644 --- a/Example/Pods/Quick/Sources/Quick/Example.swift +++ b/Example/Pods/Quick/Sources/Quick/Example.swift @@ -1,12 +1,26 @@ import Foundation private var numberOfExamplesRun = 0 +private var numberOfIncludedExamples = 0 + +// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` +// does not work as expected. +#if swift(>=3.2) + #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objcMembers + public class _ExampleBase: NSObject {} + #else + public class _ExampleBase: NSObject {} + #endif +#else +public class _ExampleBase: NSObject {} +#endif /** Examples, defined with the `it` function, use assertions to demonstrate how code should behave. These are like "tests" in XCTest. */ -final public class Example: NSObject { +final public class Example: _ExampleBase { /** A boolean indicating whether the example is a shared example; i.e.: whether it is an example defined with `itBehavesLike`. @@ -57,12 +71,19 @@ final public class Example: NSObject { public func run() { let world = World.sharedWorld + if numberOfIncludedExamples == 0 { + numberOfIncludedExamples = world.includedExampleCount + } + if numberOfExamplesRun == 0 { world.suiteHooks.executeBefores() } let exampleMetadata = ExampleMetadata(example: self, exampleIndex: numberOfExamplesRun) world.currentExampleMetadata = exampleMetadata + defer { + world.currentExampleMetadata = nil + } world.exampleHooks.executeBefores(exampleMetadata) group!.phase = .beforesExecuting @@ -82,7 +103,7 @@ final public class Example: NSObject { numberOfExamplesRun += 1 - if !world.isRunningAdditionalSuites && numberOfExamplesRun >= world.includedExampleCount { + if !world.isRunningAdditionalSuites && numberOfExamplesRun >= numberOfIncludedExamples { world.suiteHooks.executeAfters() } } diff --git a/Example/Pods/Quick/Sources/Quick/ExampleGroup.swift b/Example/Pods/Quick/Sources/Quick/ExampleGroup.swift index ca38356..129bed0 100644 --- a/Example/Pods/Quick/Sources/Quick/ExampleGroup.swift +++ b/Example/Pods/Quick/Sources/Quick/ExampleGroup.swift @@ -32,20 +32,16 @@ final public class ExampleGroup: NSObject { or to any of its descendant example groups. */ public var examples: [Example] { - var examples = childExamples - for group in childGroups { - examples.append(contentsOf: group.examples) - } - return examples + return childExamples + childGroups.flatMap { $0.examples } } internal var name: String? { - if let parent = parent { - guard let name = parent.name else { return description } - return "\(name), \(description)" - } else { + guard let parent = parent else { return isInternalRootExampleGroup ? nil : description } + + guard let name = parent.name else { return description } + return "\(name), \(description)" } internal var filterFlags: FilterFlags { diff --git a/Example/Pods/Quick/Sources/Quick/ExampleMetadata.swift b/Example/Pods/Quick/Sources/Quick/ExampleMetadata.swift index e7510f7..3dd28ab 100644 --- a/Example/Pods/Quick/Sources/Quick/ExampleMetadata.swift +++ b/Example/Pods/Quick/Sources/Quick/ExampleMetadata.swift @@ -1,11 +1,24 @@ import Foundation +// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` +// does not work as expected. +#if swift(>=3.2) + #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objcMembers + public class _ExampleMetadataBase: NSObject {} + #else + public class _ExampleMetadataBase: NSObject {} + #endif +#else +public class _ExampleMetadataBase: NSObject {} +#endif + /** A class that encapsulates information about an example, including the index at which the example was executed, as well as the example itself. */ -final public class ExampleMetadata: NSObject { +final public class ExampleMetadata: _ExampleMetadataBase { /** The example for which this metadata was collected. */ diff --git a/Example/Pods/Quick/Sources/Quick/Filter.swift b/Example/Pods/Quick/Sources/Quick/Filter.swift index d452efe..da137f8 100644 --- a/Example/Pods/Quick/Sources/Quick/Filter.swift +++ b/Example/Pods/Quick/Sources/Quick/Filter.swift @@ -1,5 +1,18 @@ import Foundation +// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` +// does not work as expected. +#if swift(>=3.2) + #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objcMembers + public class _FilterBase: NSObject {} + #else + public class _FilterBase: NSObject {} + #endif +#else +public class _FilterBase: NSObject {} +#endif + /** A mapping of string keys to booleans that can be used to filter examples or example groups. For example, a "focused" @@ -11,7 +24,7 @@ public typealias FilterFlags = [String: Bool] A namespace for filter flag keys, defined primarily to make the keys available in Objective-C. */ -final public class Filter: NSObject { +final public class Filter: _FilterBase { /** Example and example groups with [Focused: true] are included in test runs, excluding all other examples without this flag. Use this to only run one or diff --git a/Example/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift b/Example/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift index 994dd72..d7a1442 100644 --- a/Example/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift +++ b/Example/Pods/Quick/Sources/Quick/NSBundle+CurrentTestBundle.swift @@ -1,4 +1,4 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) +#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) import Foundation diff --git a/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift b/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift index 4514863..8d67d8d 100644 --- a/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift +++ b/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift @@ -1,8 +1,7 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) +#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) import Foundation -public extension NSString { - +extension NSString { private static var invalidCharacters: CharacterSet = { var invalidCharacters = CharacterSet() @@ -12,7 +11,7 @@ public extension NSString { .controlCharacters, .punctuationCharacters, .nonBaseCharacters, - .symbols, + .symbols ] for invalidSet in invalidCharacterSets { @@ -22,12 +21,29 @@ public extension NSString { return invalidCharacters }() + /// This API is not meant to be used outside Quick, so will be unavaialbe in + /// a next major version. @objc(qck_c99ExtendedIdentifier) - var c99ExtendedIdentifier: String { + public var c99ExtendedIdentifier: String { let validComponents = components(separatedBy: NSString.invalidCharacters) let result = validComponents.joined(separator: "_") return result.isEmpty ? "_" : result } } + +/// Extension methods or properties for NSObject subclasses are invisible from +/// the Objective-C runtime on static linking unless the consumers add `-ObjC` +/// linker flag, so let's make a wrapper class to mitigate that situation. +/// +/// See: https://github.com/Quick/Quick/issues/785 and https://github.com/Quick/Quick/pull/803 +@objc +class QCKObjCStringUtils: NSObject { + override private init() {} + + @objc + static func c99ExtendedIdentifier(from string: String) -> String { + return string.c99ExtendedIdentifier + } +} #endif diff --git a/Example/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift b/Example/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift index d49e859..415b680 100644 --- a/Example/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift +++ b/Example/Pods/Quick/Sources/Quick/QuickSelectedTestSuiteBuilder.swift @@ -1,4 +1,4 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) +#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) import Foundation /** diff --git a/Example/Pods/Quick/Sources/Quick/QuickTestSuite.swift b/Example/Pods/Quick/Sources/Quick/QuickTestSuite.swift index 0cb5187..0fe76a7 100644 --- a/Example/Pods/Quick/Sources/Quick/QuickTestSuite.swift +++ b/Example/Pods/Quick/Sources/Quick/QuickTestSuite.swift @@ -1,4 +1,4 @@ -#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS) +#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) import XCTest @@ -36,17 +36,17 @@ public class QuickTestSuite: XCTestSuite { It is expected that the first call should return a valid test suite, and all subsequent calls should return `nil`. */ + @objc public static func selectedTestSuite(forTestCaseWithName name: String) -> QuickTestSuite? { guard let builder = QuickSelectedTestSuiteBuilder(forTestCaseWithName: name) else { return nil } - if builtTestSuites.contains(builder.testSuiteClassName) { - return nil - } else { - builtTestSuites.insert(builder.testSuiteClassName) + let (inserted, _) = builtTestSuites.insert(builder.testSuiteClassName) + if inserted { return builder.buildTestSuite() + } else { + return nil } } - } #endif diff --git a/Example/Pods/Quick/Sources/Quick/World.swift b/Example/Pods/Quick/Sources/Quick/World.swift index fb5ec25..59ea7e6 100644 --- a/Example/Pods/Quick/Sources/Quick/World.swift +++ b/Example/Pods/Quick/Sources/Quick/World.swift @@ -12,6 +12,19 @@ public typealias SharedExampleContext = () -> [String: Any] */ public typealias SharedExampleClosure = (@escaping SharedExampleContext) -> Void +// `#if swift(>=3.2) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE` +// does not work as expected. +#if swift(>=3.2) + #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE + @objcMembers + internal class _WorldBase: NSObject {} + #else + internal class _WorldBase: NSObject {} + #endif +#else +internal class _WorldBase: NSObject {} +#endif + /** A collection of state Quick builds up in order to work its magic. World is primarily responsible for maintaining a mapping of QuickSpec @@ -23,7 +36,7 @@ public typealias SharedExampleClosure = (@escaping SharedExampleContext) -> Void You may configure how Quick behaves by calling the -[World configure:] method from within an overridden +[QuickConfiguration configure:] method. */ -final internal class World: NSObject { +final internal class World: _WorldBase { /** The example group that is currently being run. The DSL requires that this group is correctly set in order to build a @@ -44,7 +57,7 @@ final internal class World: NSObject { within this test suite. This is only true within the context of Quick functional tests. */ -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) // Convention of generating Objective-C selector has been changed on Swift 3 @objc(isRunningAdditionalSuites) internal var isRunningAdditionalSuites = false @@ -64,6 +77,7 @@ final internal class World: NSObject { // MARK: Singleton Constructor private override init() {} + static let sharedWorld = World() // MARK: Public Interface @@ -144,9 +158,9 @@ final internal class World: NSObject { } } -#if _runtime(_ObjC) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc(examplesForSpecClass:) - private func objc_examples(_ specClass: AnyClass) -> [Example] { + internal func objc_examples(_ specClass: AnyClass) -> [Example] { return examples(specClass) } #endif diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m b/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m index 937b818..17beaa7 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m @@ -1,7 +1,12 @@ #import "QuickConfiguration.h" -#import "World.h" #import +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else +#import +#endif + typedef void (^QCKClassEnumerationBlock)(Class klass); /** diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m b/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m index 10e8a3d..624832e 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m @@ -1,6 +1,10 @@ #import "QCKDSL.h" -#import "World.h" -#import "World+DSL.h" + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else +#import +#endif void qck_beforeSuite(QCKDSLEmptyBlock closure) { [[World sharedWorld] beforeSuite:closure]; diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h b/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h deleted file mode 100644 index a3b8524..0000000 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface World (SWIFT_EXTENSION(Quick)) -- (void)beforeSuite:(void (^ __nonnull)(void))closure; -- (void)afterSuite:(void (^ __nonnull)(void))closure; -- (void)sharedExamples:(NSString * __nonnull)name closure:(void (^ __nonnull)(NSDictionary * __nonnull (^ __nonnull)(void)))closure; -- (void)describe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)context:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)fdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)xdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)beforeEach:(void (^ __nonnull)(void))closure; -- (void)beforeEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)afterEach:(void (^ __nonnull)(void))closure; -- (void)afterEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)itWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)fitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)xitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)itBehavesLikeSharedExampleNamed:(NSString * __nonnull)name sharedExampleContext:(NSDictionary * __nonnull (^ __nonnull)(void))sharedExampleContext flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line; -- (void)pending:(NSString * __nonnull)description closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h index 105a97e..21bc772 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h @@ -47,4 +47,10 @@ */ - (void)spec; +/** + Returns the currently executing spec. Use in specs that require XCTestCase + methds, e.g. expectationWithDescription. +*/ +@property (class, nonatomic, readonly) QuickSpec *current; + @end diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m index 4891679..ed70d35 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m @@ -1,7 +1,11 @@ #import "QuickSpec.h" #import "QuickConfiguration.h" -#import "World.h" + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else #import +#endif static QuickSpec *currentSpec = nil; @@ -75,6 +79,10 @@ + (NSArray *)testInvocations { - (void)spec { } ++ (QuickSpec*) current { + return currentSpec; +} + #pragma mark - Internal Methods /** @@ -101,8 +109,8 @@ + (SEL)addInstanceMethodForExample:(Example *)example classSelectorNames:(NSMuta }); const char *types = [[NSString stringWithFormat:@"%s%s%s", @encode(void), @encode(id), @encode(SEL)] UTF8String]; - - NSString *originalName = example.name.qck_c99ExtendedIdentifier; + + NSString *originalName = [QCKObjCStringUtils c99ExtendedIdentifierFrom:example.name]; NSString *selectorName = originalName; NSUInteger i = 2; diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/World.h b/Example/Pods/Quick/Sources/QuickObjectiveC/World.h deleted file mode 100644 index e638cf6..0000000 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/World.h +++ /dev/null @@ -1,18 +0,0 @@ -#import - -@class ExampleGroup; -@class ExampleMetadata; - -SWIFT_CLASS("_TtC5Quick5World") -@interface World - -@property (nonatomic) ExampleGroup * __nullable currentExampleGroup; -@property (nonatomic) ExampleMetadata * __nullable currentExampleMetadata; -@property (nonatomic) BOOL isRunningAdditionalSuites; -+ (World * __nonnull)sharedWorld; -- (void)configure:(void (^ __nonnull)(Configuration * __nonnull))closure; -- (void)finalizeConfiguration; -- (ExampleGroup * __nonnull)rootExampleGroupForSpecClass:(Class __nonnull)cls; -- (NSArray * __nonnull)examplesForSpecClass:(Class __nonnull)specClass; -- (void)performWithCurrentExampleGroup:(ExampleGroup * __nonnull)group closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m b/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m index e49939e..ae63036 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m @@ -1,6 +1,11 @@ #import #import + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else #import +#endif @interface XCTestSuite (QuickTestSuiteBuilder) @end diff --git a/Example/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h b/Example/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h index 69e96cc..8881ca0 100644 --- a/Example/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h +++ b/Example/Pods/Quick/Sources/QuickSpecBase/include/QuickSpecBase.h @@ -1,5 +1,5 @@ -@import Foundation; -@import XCTest; +#import +#import @interface _QuickSelectorWrapper : NSObject - (instancetype)initWithSelector:(SEL)selector; diff --git a/Example/Pods/Target Support Files/MachineLearningKit/Info.plist b/Example/Pods/Target Support Files/MachineLearningKit/Info.plist index d79d927..afb198f 100644 --- a/Example/Pods/Target Support Files/MachineLearningKit/Info.plist +++ b/Example/Pods/Target Support Files/MachineLearningKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.1.7 + 0.1.8 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/MachineLearningKit/MachineLearningKit.xcconfig b/Example/Pods/Target Support Files/MachineLearningKit/MachineLearningKit.xcconfig index c8b98d9..fe47eea 100644 --- a/Example/Pods/Target Support Files/MachineLearningKit/MachineLearningKit.xcconfig +++ b/Example/Pods/Target Support Files/MachineLearningKit/MachineLearningKit.xcconfig @@ -1,11 +1,10 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Upsurge" +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" OTHER_LDFLAGS = -framework "MapKit" -framework "UIKit" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Example/Pods/Target Support Files/Nimble/Info.plist b/Example/Pods/Target Support Files/Nimble/Info.plist index 5f6d93f..a49902c 100644 --- a/Example/Pods/Target Support Files/Nimble/Info.plist +++ b/Example/Pods/Target Support Files/Nimble/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 6.0.1 + 7.1.3 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h b/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h index 4b43df9..3a2c2c8 100644 --- a/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h +++ b/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h @@ -10,13 +10,14 @@ #endif #endif -#import "CwlCatchException.h" -#import "CwlCatchBadInstruction.h" -#import "mach_excServer.h" #import "Nimble.h" #import "DSL.h" #import "NMBExceptionCapture.h" #import "NMBStringify.h" +#import "CwlCatchException.h" +#import "CwlMachBadInstructionHandler.h" +#import "mach_excServer.h" +#import "CwlPreconditionTesting.h" FOUNDATION_EXPORT double NimbleVersionNumber; FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig b/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig index 12698c0..ee7d52f 100644 --- a/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig +++ b/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig @@ -1,12 +1,12 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Nimble +APPLICATION_EXTENSION_API_ONLY = YES +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Nimble ENABLE_BITCODE = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_LDFLAGS = -weak-lswiftXCTest -weak_framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +OTHER_LDFLAGS = $(inherited) -Xlinker -no_application_extension -weak-lswiftXCTest -weak_framework "XCTest" +OTHER_SWIFT_FLAGS = $(inherited) -suppress-warnings $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Nimble PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-frameworks.sh index 2fad50d..c6eb500 100755 --- a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-frameworks.sh @@ -1,11 +1,28 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then @@ -23,9 +40,9 @@ install_framework() source="$(readlink "${source}")" fi - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" @@ -54,12 +71,40 @@ install_framework() fi } +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + # Signs a framework with the provided identity code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then code_sign_cmd="$code_sign_cmd &" @@ -72,11 +117,19 @@ code_sign_if_enabled() { # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 stripped="$stripped $arch" @@ -85,16 +138,17 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/MachineLearningKit/MachineLearningKit.framework" - install_framework "$BUILT_PRODUCTS_DIR/Upsurge/Upsurge.framework" + install_framework "${BUILT_PRODUCTS_DIR}/MachineLearningKit/MachineLearningKit.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Upsurge/Upsurge.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/MachineLearningKit/MachineLearningKit.framework" - install_framework "$BUILT_PRODUCTS_DIR/Upsurge/Upsurge.framework" + install_framework "${BUILT_PRODUCTS_DIR}/MachineLearningKit/MachineLearningKit.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Upsurge/Upsurge.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-resources.sh b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-resources.sh index 4602c68..345301f 100755 --- a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-resources.sh +++ b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example-resources.sh @@ -1,5 +1,13 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -8,7 +16,11 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt XCASSET_FILES=() -case "${TARGETED_DEVICE_FAMILY}" in +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in 1,2) TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" ;; @@ -21,6 +33,9 @@ case "${TARGETED_DEVICE_FAMILY}" in 3) TARGET_DEVICE_ARGS="--target-device tv" ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; @@ -41,29 +56,29 @@ EOM fi case $RESOURCE_PATH in *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" ;; *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" ;; *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" ;; *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) @@ -71,7 +86,7 @@ EOM XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) - echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" || true echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" ;; esac @@ -85,7 +100,7 @@ if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then fi rm -f "$RESOURCES_TO_COPY" -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) @@ -95,5 +110,9 @@ then fi done <<<"$OTHER_XCASSETS" - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi fi diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.debug.xcconfig index cfd5698..b4f4c56 100644 --- a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.debug.xcconfig @@ -1,10 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit" "$PODS_CONFIGURATION_BUILD_DIR/Upsurge" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit" "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Upsurge/Upsurge.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge/Upsurge.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "MachineLearningKit" -framework "Upsurge" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.release.xcconfig index cfd5698..b4f4c56 100644 --- a/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.release.xcconfig @@ -1,10 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit" "$PODS_CONFIGURATION_BUILD_DIR/Upsurge" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit" "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Upsurge/Upsurge.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge/Upsurge.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "MachineLearningKit" -framework "Upsurge" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-frameworks.sh index 667ce7c..fe9c268 100755 --- a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-frameworks.sh @@ -1,11 +1,28 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework install_framework() { if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then @@ -23,9 +40,9 @@ install_framework() source="$(readlink "${source}")" fi - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" local basename basename="$(basename -s .framework "$1")" @@ -54,12 +71,40 @@ install_framework() fi } +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + # Signs a framework with the provided identity code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then code_sign_cmd="$code_sign_cmd &" @@ -72,11 +117,19 @@ code_sign_if_enabled() { # Strip invalid architectures strip_invalid_archs() { binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then # Strip non-valid architectures in-place lipo -remove "$arch" -output "$binary" "$binary" || exit 1 stripped="$stripped $arch" @@ -85,16 +138,17 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi + STRIP_BINARY_RETVAL=1 } if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Nimble/Nimble.framework" - install_framework "$BUILT_PRODUCTS_DIR/Quick/Quick.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Nimble/Nimble.framework" - install_framework "$BUILT_PRODUCTS_DIR/Quick/Quick.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework" + install_framework "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-resources.sh index 4602c68..345301f 100755 --- a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-resources.sh +++ b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests-resources.sh @@ -1,5 +1,13 @@ #!/bin/sh set -e +set -u +set -o pipefail + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -8,7 +16,11 @@ RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt XCASSET_FILES=() -case "${TARGETED_DEVICE_FAMILY}" in +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in 1,2) TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" ;; @@ -21,6 +33,9 @@ case "${TARGETED_DEVICE_FAMILY}" in 3) TARGET_DEVICE_ARGS="--target-device tv" ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; @@ -41,29 +56,29 @@ EOM fi case $RESOURCE_PATH in *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} ;; *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" ;; *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" ;; *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" ;; *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) @@ -71,7 +86,7 @@ EOM XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) - echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" || true echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" ;; esac @@ -85,7 +100,7 @@ if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then fi rm -f "$RESOURCES_TO_COPY" -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) @@ -95,5 +110,9 @@ then fi done <<<"$OTHER_XCASSETS" - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi fi diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.debug.xcconfig index 01156eb..d01dc5e 100644 --- a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.debug.xcconfig @@ -1,10 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "$PODS_CONFIGURATION_BUILD_DIR/Nimble" "$PODS_CONFIGURATION_BUILD_DIR/Quick" "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit" "$PODS_CONFIGURATION_BUILD_DIR/Upsurge" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit" "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Nimble/Nimble.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Quick/Quick.framework/Headers" $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Upsurge/Upsurge.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge/Upsurge.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Nimble" -framework "Quick" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.release.xcconfig index 01156eb..d01dc5e 100644 --- a/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-MLKit_Tests/Pods-MLKit_Tests.release.xcconfig @@ -1,10 +1,11 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "$PODS_CONFIGURATION_BUILD_DIR/Nimble" "$PODS_CONFIGURATION_BUILD_DIR/Quick" "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit" "$PODS_CONFIGURATION_BUILD_DIR/Upsurge" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit" "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Nimble/Nimble.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Quick/Quick.framework/Headers" $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Upsurge/Upsurge.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/MachineLearningKit/MachineLearningKit.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Upsurge/Upsurge.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Nimble" -framework "Quick" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Quick/Info.plist b/Example/Pods/Target Support Files/Quick/Info.plist index 21a30b4..10f280e 100644 --- a/Example/Pods/Target Support Files/Quick/Info.plist +++ b/Example/Pods/Target Support Files/Quick/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.1.0 + 1.3.1 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/Quick/Quick.xcconfig b/Example/Pods/Target Support Files/Quick/Quick.xcconfig index 66c8d21..529f2db 100644 --- a/Example/Pods/Target Support Files/Quick/Quick.xcconfig +++ b/Example/Pods/Target Support Files/Quick/Quick.xcconfig @@ -1,12 +1,12 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Quick +APPLICATION_EXTENSION_API_ONLY = YES +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Quick ENABLE_BITCODE = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_LDFLAGS = -framework "XCTest" +OTHER_LDFLAGS = $(inherited) -Xlinker -no_application_extension -framework "XCTest" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Quick PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Example/Pods/Target Support Files/Upsurge/Info.plist b/Example/Pods/Target Support Files/Upsurge/Info.plist index 2cf03a7..5c8750d 100644 --- a/Example/Pods/Target Support Files/Upsurge/Info.plist +++ b/Example/Pods/Target Support Files/Upsurge/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.8.0 + 0.10.2 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/Upsurge/Upsurge.xcconfig b/Example/Pods/Target Support Files/Upsurge/Upsurge.xcconfig index 895b8e8..c39dd6b 100644 --- a/Example/Pods/Target Support Files/Upsurge/Upsurge.xcconfig +++ b/Example/Pods/Target Support Files/Upsurge/Upsurge.xcconfig @@ -1,10 +1,9 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Upsurge +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Upsurge GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" OTHER_LDFLAGS = -framework "Accelerate" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/Upsurge PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} diff --git a/Example/Pods/Upsurge/README.md b/Example/Pods/Upsurge/README.md index 0e3c8bb..848e571 100644 --- a/Example/Pods/Upsurge/README.md +++ b/Example/Pods/Upsurge/README.md @@ -1,7 +1,5 @@ # Upsurge -[![Build Status](https://travis-ci.org/aleph7/Upsurge.svg?branch=master)](https://travis-ci.org/aleph7/Upsurge) - Upsurge is a math utilities library. It provides support for linear operations on vectors and matrices, and slicing of higher-dimensional tensors. It relies on [Accelerate](https://developer.apple.com/library/mac/documentation/Accelerate/Reference/AccelerateFWRef/index.html#//apple_ref/doc/uid/TP40009465), which is a framework that provides high-performance functions for matrix math, digital signal processing, and image manipulation by harnessing [SIMD](http://en.wikipedia.org/wiki/SIMD) instructions available in modern CPUs. Upsurge is a fork of [Surge](https://github.com/mattt/Surge) which was abandoned for a while. Upsurge supports tensors and has better support for matrices and arrays. It provides a custom `ValueArray` class as an alternative to Swift's built-in `Array`. It being a `class` instead of a `struct` means that you can manage when and if it gets copied, making memory management more explicit. This also allows defining the `+=` operator to mean addition instead of concatenation. @@ -17,8 +15,19 @@ Upsurge is a fork of [Surge](https://github.com/mattt/Surge) which was abandoned ## Installation -Upsurge supports both CocoaPods (`pod 'Upsurge'`) and Carthage (`github "aleph7/Upsurge"`). +Upsurge supports both CocoaPods (`pod 'Upsurge'`) and Carthage (`github "aleph7/Upsurge"`). For macOS apps you can use the Swift Package Manager to install Upsurge by adding the proper description to your Package.swift file: +```swift +import PackageDescription + +let package = Package( + name: "YOUR_PROJECT_NAME", + targets: [], + dependencies: [ + .Package(url: "https://github.com/aleph7/Upsurge.git", Version(0,8,.max)), + ] +) +``` ## Usage @@ -86,6 +95,25 @@ let B = inv(A) * C // [2.0, 1.0]′ let r = A*B - C // zero ``` +### Tiling +A block `Matrix` can be formed by repeating a 1-D `ValueArray` or 2-D `Matrix` **mxn** times. + +```swift +import Upsurge + +let a = ValueArray = [1.0, 2.0] +// Tile source array 2 times in each directon, +// returning a 2X4 block matrix +let A = a.tile(2, 2) + +let B = Matrix([ + [1.0, 2.0], + [3.0, 4.0] +)] +// Tile source matrix 2 times in each directon, +// returning a 4x4 block matrix +let r = B.tile(2, 2) +``` ### Tensors diff --git a/Example/Pods/Upsurge/Source/Complex/Complex.swift b/Example/Pods/Upsurge/Source/Complex/Complex.swift deleted file mode 100644 index 3840712..0000000 --- a/Example/Pods/Upsurge/Source/Complex/Complex.swift +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright © 2015 Venture Media Labs. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -import Darwin - -public struct Complex: Value { - public var real: Element = 0.0 - public var imag: Element = 0.0 - - public init() {} - - public init(integerLiteral value: Int) { - real = Element(value) - } - - public init(real: Element, imag: Element) { - self.real = real - self.imag = imag - } - - public var magnitude: Element { - if let real = real as? Double, let imag = imag as? Double { - return hypot(real, imag) as! Element - } else if let real = real as? Float, let imag = imag as? Float { - return hypot(real, imag) as! Element - } - fatalError() - } - - public var phase: Element { - if let real = real as? Double, let imag = imag as? Double { - return atan2(imag, real) as! Element - } else if let real = real as? Float, let imag = imag as? Float { - return atan2(imag, real) as! Element - } - fatalError() - } - - public static func abs(_ x: Complex) -> Complex { - return Complex(real: x.magnitude, imag: 0.0) - } - - public var hashValue: Int { - return real.hashValue ^ imag.hashValue - } - - public var description: String { - return "\(real) + \(imag)i" - } -} - -public func ==(lhs: Complex, rhs: Complex) -> Bool { - return lhs.real == rhs.real && lhs.imag == rhs.imag -} - -public func <(lhs: Complex, rhs: Complex) -> Bool { - return lhs.real < rhs.real || (lhs.real == rhs.real && lhs.imag < rhs.imag) -} - -// MARK: - Double - -public func +(lhs: Complex, rhs: Complex) -> Complex { - return Complex(real: lhs.real + rhs.real, imag: lhs.imag + rhs.imag) -} - -public func -(lhs: Complex, rhs: Complex) -> Complex { - return Complex(real: lhs.real - rhs.real, imag: lhs.imag - rhs.imag) -} - -public func *(lhs: Complex, rhs: Complex) -> Complex { - return Complex(real: lhs.real * rhs.real - lhs.imag * rhs.imag, imag: lhs.real * rhs.imag + lhs.imag * rhs.real) -} - -public func *(x: Complex, a: Double) -> Complex { - return Complex(real: x.real * a, imag: x.imag * a) -} - -public func *(a: Double, x: Complex) -> Complex { - return Complex(real: x.real * a, imag: x.imag * a) -} - -public func /(lhs: Complex, rhs: Complex) -> Complex { - let rhsMagSq = rhs.real*rhs.real + rhs.imag*rhs.imag - return Complex( - real: (lhs.real*rhs.real + lhs.imag*rhs.imag) / rhsMagSq, - imag: (lhs.imag*rhs.real - lhs.real*rhs.imag) / rhsMagSq) -} - -public func /(x: Complex, a: Double) -> Complex { - return Complex(real: x.real / a, imag: x.imag / a) -} - -public func /(a: Double, x: Complex) -> Complex { - let xMagSq = x.real*x.real + x.imag*x.imag - return Complex(real: a*x.real / xMagSq, imag: -a*x.imag / xMagSq) -} - -// MARK: - Float - -public func +(lhs: Complex, rhs: Complex) -> Complex { - return Complex(real: lhs.real + rhs.real, imag: lhs.imag + rhs.imag) -} - -public func -(lhs: Complex, rhs: Complex) -> Complex { - return Complex(real: lhs.real - rhs.real, imag: lhs.imag - rhs.imag) -} - -public func *(lhs: Complex, rhs: Complex) -> Complex { - return Complex(real: lhs.real * rhs.real - lhs.imag * rhs.imag, imag: lhs.real * rhs.imag + lhs.imag * rhs.real) -} - -public func *(x: Complex, a: Float) -> Complex { - return Complex(real: x.real * a, imag: x.imag * a) -} - -public func *(a: Float, x: Complex) -> Complex { - return Complex(real: x.real * a, imag: x.imag * a) -} - -public func /(lhs: Complex, rhs: Complex) -> Complex { - let rhsMagSq = rhs.real*rhs.real + rhs.imag*rhs.imag - return Complex( - real: (lhs.real*rhs.real + lhs.imag*rhs.imag) / rhsMagSq, - imag: (lhs.imag*rhs.real - lhs.real*rhs.imag) / rhsMagSq) -} - -public func /(x: Complex, a: Float) -> Complex { - return Complex(real: x.real / a, imag: x.imag / a) -} - -public func /(a: Float, x: Complex) -> Complex { - let xMagSq = x.real*x.real + x.imag*x.imag - return Complex(real: a*x.real / xMagSq, imag: -a*x.imag / xMagSq) -} diff --git a/Example/Pods/Upsurge/Source/2D/2DTensorSlice.swift b/Example/Pods/Upsurge/Sources/Upsurge/2DTensorSlice.swift similarity index 84% rename from Example/Pods/Upsurge/Source/2D/2DTensorSlice.swift rename to Example/Pods/Upsurge/Sources/Upsurge/2DTensorSlice.swift index fa69c75..e735fdd 100644 --- a/Example/Pods/Upsurge/Source/2D/2DTensorSlice.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/2DTensorSlice.swift @@ -18,10 +18,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -open class TwoDimensionalTensorSlice: MutableQuadraticType, Equatable { +open class TwoDimensionalTensorSlice: MutableQuadraticType, Equatable { public typealias Index = [Int] public typealias Slice = TwoDimensionalTensorSlice - public typealias Element = T open var arrangement: QuadraticArrangement { return .rowMajor @@ -29,10 +28,10 @@ open class TwoDimensionalTensorSlice: MutableQuadraticType, Equatable open let rows: Int open let columns: Int - open var stride: Int + open let stride: Int - var base: Tensor - open var span: Span + let base: Tensor + open let span: Span open func withUnsafeBufferPointer(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { return try base.withUnsafeBufferPointer(body) @@ -60,15 +59,12 @@ open class TwoDimensionalTensorSlice: MutableQuadraticType, Equatable self.span = span assert(base.spanIsValid(span)) - assert(span.dimensions.reduce(0) { $0.1 > 1 ? $0.0 + 1 : $0.0 } <= 2) + assert(span.dimensions.reduce(0) { $1 > 1 ? $0 + 1 : $0 } <= 2) assert(span.dimensions.last! >= 1) - var rowIndex: Int - if let index = span.dimensions.index(where: { $0 > 1 }) { - rowIndex = index - } else { - rowIndex = span.dimensions.count - 2 - } + let rowIndex: Int = span.dimensions.index { $0 > 1 } ?? + (span.dimensions.count - 2) + rows = span.dimensions[rowIndex] columns = span.dimensions.last! @@ -137,16 +133,11 @@ open class TwoDimensionalTensorSlice: MutableQuadraticType, Equatable } open var isContiguous: Bool { - let onesCount: Int - if let index = dimensions.index(where: { $0 != 1 }) { - onesCount = index - } else { - onesCount = rank - } + let onesCount: Int = (dimensions.index { $0 != 1 }) ?? rank let diff = (0..: MutableQuadraticType, Equatable open func indexIsValid(_ indices: [Int]) -> Bool { assert(indices.count == rank) - for (i, index) in indices.enumerated() { - if index < span[i].lowerBound || span[i].upperBound < index { - return false - } + return indices.enumerated().all { (i, index) in + self.span[i].contains(index) } - return true } } diff --git a/Example/Pods/Upsurge/Source/Operations/Arithmetic.swift b/Example/Pods/Upsurge/Sources/Upsurge/Arithmetic.swift similarity index 98% rename from Example/Pods/Upsurge/Source/Operations/Arithmetic.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Arithmetic.swift index 0708b89..63999b3 100644 --- a/Example/Pods/Upsurge/Source/Operations/Arithmetic.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/Arithmetic.swift @@ -136,8 +136,9 @@ public func sqrt(_ x: M) -> ValueArray where M.Element == public func sqrt(_ x: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.step == 1, "sqrt doesn't support step values other than 1") precondition(results.count == x.count, "The number of elements in x and y should match") + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvsqrt(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvsqrt(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -267,8 +268,9 @@ public func sqrt(_ x: M) -> ValueArray where M.Element == public func sqrt(_ x: MI, y: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.step == 1, "sqrt doesn't support step values other than 1") precondition(y.count == x.count, "The number of elements in x and y should match") + let startIndex = y.startIndex withPointers(x, &y) { xp, yp in - vvsqrtf(yp + y.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvsqrtf(yp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } diff --git a/Example/Pods/Upsurge/Source/Operations/Auxiliary.swift b/Example/Pods/Upsurge/Sources/Upsurge/Auxiliary.swift similarity index 86% rename from Example/Pods/Upsurge/Source/Operations/Auxiliary.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Auxiliary.swift index b3f41d8..2917f7d 100644 --- a/Example/Pods/Upsurge/Source/Operations/Auxiliary.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/Auxiliary.swift @@ -34,8 +34,10 @@ public func abs(_ x: M) -> ValueArray where M.Element == /// Compute the absolute value for each element in `x`, store the results in `results` public func abs(_ x: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.count == results.count) + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_vabsD(xp + x.startIndex, x.step, rp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vabsD(xp + x.startIndex, x.step, rp + startIndex, step, vDSP_Length(x.count)) } } @@ -53,8 +55,9 @@ public func ceil(_ x: M) -> ValueArray where M.Element == public func ceil(_ x: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.step == 1, "ceil doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvceil(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvceil(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -71,8 +74,10 @@ public func clip(_ x: M, low: Double, high: Double) -> ValueArray public func clip(_ x: MI, low: Double, high: Double, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.count == results.count) var l = low, h = high + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, yp in - vDSP_vclipD(xp + x.startIndex, x.step, &l, &h, yp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vclipD(xp + x.startIndex, x.step, &l, &h, yp + startIndex, step, vDSP_Length(x.count)) } } @@ -100,8 +105,9 @@ public func floor(_ x: M) -> ValueArray where M.Element = public func floor(_ x: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.step == 1, "floor doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvfloor(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvfloor(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -117,8 +123,10 @@ public func neg(_ x: M) -> ValueArray where M.Element == /// Compute the negative of each element in `x`, store the results in `results` public func neg(_ x: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.count == results.count) + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_vnegD(xp + x.startIndex, x.step, rp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vnegD(xp + x.startIndex, x.step, rp + startIndex, step, vDSP_Length(x.count)) } } @@ -136,8 +144,9 @@ public func rec(_ x: M) -> ValueArray where M.Element == public func rec(_ x: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.step == 1, "rec doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvrec(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvrec(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -155,8 +164,9 @@ public func round(_ x: M) -> ValueArray where M.Element = public func round(_ x: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.step == 1, "round doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvnint(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvnint(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -173,8 +183,10 @@ public func threshold(_ x: M, low: Double) -> ValueArray public func threshold(_ x: MI, low: Double, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.count == results.count) var l = low + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_vthrD(xp + x.startIndex, x.step, &l, rp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vthrD(xp + x.startIndex, x.step, &l, rp + startIndex, step, vDSP_Length(x.count)) } } @@ -192,8 +204,9 @@ public func trunc(_ x: M) -> ValueArray where M.Element = public func trunc(_ x: MI, low: Double, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.step == 1, "trunc doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvint(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvint(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -210,8 +223,9 @@ public func pow(_ x: M, _ y: M) -> ValueArray where M.Ele /// Compute `x^y` for each element of `x` and `y`, store the results in `results` public func pow(_ x: MI, _ y: MI, results: inout MO) where MI.Element == Double, MO.Element == Double { precondition(x.step == 1, "pow doesn't support step values other than 1") + let startIndex = results.startIndex withPointers(x, y, &results) { xp, yp, rp in - vvpow(rp + results.startIndex, xp + x.startIndex, yp + y.startIndex, [Int32(x.count)]) + vvpow(rp + startIndex, xp + x.startIndex, yp + y.startIndex, [Int32(x.count)]) } } @@ -229,8 +243,10 @@ public func abs(_ x: M) -> ValueArray where M.Element == F /// Compute the absolute value for each element in `x`, store the results in `results` public func abs(_ x: MI, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.count == results.count) + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_vabs(xp + x.startIndex, x.step, rp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vabs(xp + x.startIndex, x.step, rp + startIndex, step, vDSP_Length(x.count)) } } @@ -238,8 +254,9 @@ public func abs(_ x: MI, results: inout M public func ceil(_ x: M) -> ValueArray where M.Element == Float { precondition(x.step == 1, "ceil doesn't support step values other than 1") let results = ValueArray(count: x.count) + let startIndex = results.startIndex withPointer(x) { p in - vvceilf(results.mutablePointer + results.startIndex, p + x.startIndex, [Int32(x.count)]) + vvceilf(results.mutablePointer + startIndex, p + x.startIndex, [Int32(x.count)]) } return results } @@ -248,8 +265,9 @@ public func ceil(_ x: M) -> ValueArray where M.Element == public func ceil(_ x: MI, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.step == 1, "ceil doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvceilf(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvceilf(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -266,8 +284,10 @@ public func clip(_ x: M, low: Float, high: Float) -> ValueArray(_ x: MI, low: Float, high: Float, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.count == results.count) var l = low, h = high + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, yp in - vDSP_vclip(xp + x.startIndex, x.step, &l, &h, yp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vclip(xp + x.startIndex, x.step, &l, &h, yp + startIndex, step, vDSP_Length(x.count)) } } @@ -295,8 +315,9 @@ public func floor(_ x: M) -> ValueArray where M.Element == public func floor(_ x: MI, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.step == 1, "floor doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvfloorf(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvfloorf(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -312,8 +333,10 @@ public func neg(_ x: M) -> ValueArray where M.Element == F /// Compute the negative of each element in `x`, store the results in `results` public func neg(_ x: MI, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.count == results.count) + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_vneg(xp + x.startIndex, x.step, rp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vneg(xp + x.startIndex, x.step, rp + startIndex, step, vDSP_Length(x.count)) } } @@ -331,8 +354,9 @@ public func rec(_ x: M) -> ValueArray where M.Element == F public func rec(_ x: MI, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.step == 1, "rec doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvrecf(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvrecf(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -350,8 +374,9 @@ public func round(_ x: M) -> ValueArray where M.Element == public func round(_ x: MI, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.step == 1, "round doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvnintf(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvnintf(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -368,8 +393,10 @@ public func threshold(_ x: M, low: Float) -> ValueArray wh public func threshold(_ x: MI, low: Float, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.count == results.count) var l = low + let startIndex = results.startIndex + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_vthr(xp + x.startIndex, x.step, &l, rp + results.startIndex, results.step, vDSP_Length(x.count)) + vDSP_vthr(xp + x.startIndex, x.step, &l, rp + startIndex, step, vDSP_Length(x.count)) } } @@ -387,8 +414,9 @@ public func trunc(_ x: M) -> ValueArray where M.Element == public func trunc(_ x: MI, low: Float, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.step == 1, "trunc doesn't support step values other than 1") precondition(x.count == results.count) + let startIndex = results.startIndex withPointers(x, &results) { xp, rp in - vvintf(rp + results.startIndex, xp + x.startIndex, [Int32(x.count)]) + vvintf(rp + startIndex, xp + x.startIndex, [Int32(x.count)]) } } @@ -405,7 +433,8 @@ public func pow(_ x: M, _ y: M) -> ValueArray where M.Elem /// Compute `x^y` for each element of `x` and `y`, store the results in `results` public func pow(_ x: MI, _ y: MI, results: inout MO) where MI.Element == Float, MO.Element == Float { precondition(x.step == 1, "pow doesn't support step values other than 1") + let startIndex = results.startIndex withPointers(x, y, &results) { xp, yp, rp in - vvpowf(rp + results.startIndex, xp + x.startIndex, yp + y.startIndex, [Int32(x.count)]) + vvpowf(rp + startIndex, xp + x.startIndex, yp + y.startIndex, [Int32(x.count)]) } } diff --git a/Example/Pods/Upsurge/Sources/Upsurge/Complex.swift b/Example/Pods/Upsurge/Sources/Upsurge/Complex.swift new file mode 100644 index 0000000..a06bda9 --- /dev/null +++ b/Example/Pods/Upsurge/Sources/Upsurge/Complex.swift @@ -0,0 +1,113 @@ +// Copyright © 2015 Venture Media Labs. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import Darwin + +public struct Complex: Value { + public var real: Element + public var imag: Element + + public init() { + self.init(real: 0, imag: 0) + } + + public init(integerLiteral value: Int) { + self.init(real: Element(value), imag: 0) + } + + public init(real: Element, imag: Element) { + self.real = real + self.imag = imag + } + + public var magnitude: Element { + if let real = real as? Double, let imag = imag as? Double { + return hypot(real, imag) as! Element + } else if let real = real as? Float, let imag = imag as? Float { + return hypot(real, imag) as! Element + } + fatalError() + } + + public var phase: Element { + if let real = real as? Double, let imag = imag as? Double { + return atan2(imag, real) as! Element + } else if let real = real as? Float, let imag = imag as? Float { + return atan2(imag, real) as! Element + } + fatalError() + } + + public static func abs(_ x: Complex) -> Complex { + return Complex(real: x.magnitude, imag: 0.0) + } + + public var hashValue: Int { + return real.hashValue ^ imag.hashValue + } + + public var description: String { + return "\(real) + \(imag)i" + } + + public static func == (lhs: Complex, rhs: Complex) -> Bool { + return lhs.real == rhs.real && lhs.imag == rhs.imag + } + + public static func < (lhs: Complex, rhs: Complex) -> Bool { + return lhs.real < rhs.real || (lhs.real == rhs.real && lhs.imag < rhs.imag) + } + + public static func + (lhs: Complex, rhs: Complex) -> Complex { + return Complex(real: lhs.real + rhs.real, imag: lhs.imag + rhs.imag) + } + + public static func - (lhs: Complex, rhs: Complex) -> Complex { + return Complex(real: lhs.real - rhs.real, imag: lhs.imag - rhs.imag) + } + + public static func * (lhs: Complex, rhs: Complex) -> Complex { + return Complex(real: lhs.real * rhs.real - lhs.imag * rhs.imag, imag: lhs.real * rhs.imag + lhs.imag * rhs.real) + } + + public static func * (x: Complex, a: Element) -> Complex { + return Complex(real: x.real * a, imag: x.imag * a) + } + + public static func * (a: Element, x: Complex) -> Complex { + return Complex(real: x.real * a, imag: x.imag * a) + } + + public static func / (lhs: Complex, rhs: Complex) -> Complex { + let rhsMagSq = rhs.real*rhs.real + rhs.imag*rhs.imag + return Complex( + real: (lhs.real*rhs.real + lhs.imag*rhs.imag) / rhsMagSq, + imag: (lhs.imag*rhs.real - lhs.real*rhs.imag) / rhsMagSq) + } + + public static func / (x: Complex, a: Element) -> Complex { + return Complex(real: x.real / a, imag: x.imag / a) + } + + public static func / (a: Element, x: Complex) -> Complex { + let xMagSq = x.real*x.real + x.imag*x.imag + return Complex(real: a*x.real / xMagSq, imag: -a*x.imag / xMagSq) + } +} diff --git a/Example/Pods/Upsurge/Source/Complex/ComplexArithmetic.swift b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArithmetic.swift similarity index 57% rename from Example/Pods/Upsurge/Source/Complex/ComplexArithmetic.swift rename to Example/Pods/Upsurge/Sources/Upsurge/ComplexArithmetic.swift index cf08a15..42ab58d 100644 --- a/Example/Pods/Upsurge/Source/Complex/ComplexArithmetic.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArithmetic.swift @@ -21,85 +21,85 @@ // MARK: - Double public func sum(_ x: ComplexArray) -> Complex { - return Complex(real: sum(x.reals), imag: sum(x.imags)) + return Complex(real: sum(x.reals), imag: sum(x.imags)) } // MARK: Operators -public func +=(lhs: inout ComplexArray, rhs: ComplexArray) { +public func += (lhs: inout ComplexArray, rhs: ComplexArray) { lhs.reals += rhs.reals lhs.imags += rhs.imags } -public func +(lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { +public func + (lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(lhs) results += rhs return results } -public func -=(lhs: inout ComplexArray, rhs: ComplexArray) { +public func -= (lhs: inout ComplexArray, rhs: ComplexArray) { lhs.reals -= rhs.reals lhs.imags -= rhs.imags } -public func -(lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { +public func - (lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(lhs) results -= rhs return results } -public func +=(lhs: inout ComplexArray, rhs: Complex) { +public func += (lhs: inout ComplexArray, rhs: Complex) { lhs.reals += rhs.real lhs.imags += rhs.imag } -public func +(lhs: ComplexArray, rhs: Complex) -> ComplexArray { +public func + (lhs: ComplexArray, rhs: Complex) -> ComplexArray { var results = ComplexArray(lhs) results += rhs return results } -public func +(lhs: Complex, rhs: ComplexArray) -> ComplexArray { +public func + (lhs: Complex, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(rhs) results += lhs return results } -public func -=(lhs: inout ComplexArray, rhs: Complex) { +public func -= (lhs: inout ComplexArray, rhs: Complex) { lhs.reals -= rhs.real lhs.imags -= rhs.imag } -public func -(lhs: ComplexArray, rhs: Complex) -> ComplexArray { +public func - (lhs: ComplexArray, rhs: Complex) -> ComplexArray { var results = ComplexArray(lhs) results -= rhs return results } -public func -(lhs: Complex, rhs: ComplexArray) -> ComplexArray { +public func - (lhs: Complex, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(rhs) results -= lhs return results } -public func *=(lhs: inout ComplexArray, rhs: Double) { +public func *= (lhs: inout ComplexArray, rhs: Double) { lhs.reals *= rhs lhs.imags *= rhs } -public func *(lhs: ComplexArray, rhs: Double) -> ComplexArray { +public func * (lhs: ComplexArray, rhs: Double) -> ComplexArray { var results = ComplexArray(lhs) results *= rhs return results } -public func /=(lhs: inout ComplexArray, rhs: Double) { +public func /= (lhs: inout ComplexArray, rhs: Double) { lhs.reals /= rhs lhs.imags /= rhs } -public func /(lhs: ComplexArray, rhs: Double) -> ComplexArray { - var results = ComplexArray(lhs) +public func / (lhs: ComplexArray, rhs: Double) -> ComplexArray { + var results = ComplexArray(lhs) results /= rhs return results } @@ -112,80 +112,80 @@ public func sum(_ x: ComplexArray) -> Complex { // MARK: Operators -public func +=(lhs: inout ComplexArray, rhs: ComplexArray) { +public func += (lhs: inout ComplexArray, rhs: ComplexArray) { lhs.reals += rhs.reals lhs.imags += rhs.imags } -public func +(lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { +public func + (lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(lhs) results += rhs return results } -public func -=(lhs: inout ComplexArray, rhs: ComplexArray) { +public func -= (lhs: inout ComplexArray, rhs: ComplexArray) { lhs.reals -= rhs.reals lhs.imags -= rhs.imags } -public func -(lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { +public func - (lhs: ComplexArray, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(lhs) results -= rhs return results } -public func +=(lhs: inout ComplexArray, rhs: Complex) { +public func += (lhs: inout ComplexArray, rhs: Complex) { lhs.reals += rhs.real lhs.imags += rhs.imag } -public func +(lhs: ComplexArray, rhs: Complex) -> ComplexArray { +public func + (lhs: ComplexArray, rhs: Complex) -> ComplexArray { var results = ComplexArray(lhs) results += rhs return results } -public func +(lhs: Complex, rhs: ComplexArray) -> ComplexArray { +public func + (lhs: Complex, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(rhs) results += lhs return results } -public func -=(lhs: inout ComplexArray, rhs: Complex) { +public func -= (lhs: inout ComplexArray, rhs: Complex) { lhs.reals -= rhs.real lhs.imags -= rhs.imag } -public func -(lhs: ComplexArray, rhs: Complex) -> ComplexArray { +public func - (lhs: ComplexArray, rhs: Complex) -> ComplexArray { var results = ComplexArray(lhs) results -= rhs return results } -public func -(lhs: Complex, rhs: ComplexArray) -> ComplexArray { +public func - (lhs: Complex, rhs: ComplexArray) -> ComplexArray { var results = ComplexArray(rhs) results -= lhs return results } -public func *=(lhs: inout ComplexArray, rhs: Float) { +public func *= (lhs: inout ComplexArray, rhs: Float) { lhs.reals *= rhs lhs.imags *= rhs } -public func *(lhs: ComplexArray, rhs: Float) -> ComplexArray { +public func * (lhs: ComplexArray, rhs: Float) -> ComplexArray { var results = ComplexArray(lhs) results *= rhs return results } -public func /=(lhs: inout ComplexArray, rhs: Float) { +public func /= (lhs: inout ComplexArray, rhs: Float) { lhs.reals /= rhs lhs.imags /= rhs } -public func /(lhs: ComplexArray, rhs: Float) -> ComplexArray { - var results = ComplexArray(lhs) +public func / (lhs: ComplexArray, rhs: Float) -> ComplexArray { + var results = ComplexArray(lhs) results /= rhs return results } diff --git a/Example/Pods/Upsurge/Source/Complex/ComplexArray.swift b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArray.swift similarity index 73% rename from Example/Pods/Upsurge/Source/Complex/ComplexArray.swift rename to Example/Pods/Upsurge/Sources/Upsurge/ComplexArray.swift index fa79b31..5c1b38e 100644 --- a/Example/Pods/Upsurge/Source/Complex/ComplexArray.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArray.swift @@ -18,12 +18,12 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -open class ComplexArray: MutableLinearType, ExpressibleByArrayLiteral { +open class ComplexArray: MutableLinearType, ExpressibleByArrayLiteral, RangeReplaceableCollection { public typealias Index = Int public typealias Element = Complex public typealias Slice = ComplexArraySlice - var elements: ValueArray> + private var elements: ValueArray> open var count: Int { get { @@ -50,14 +50,6 @@ open class ComplexArray: MutableLinearType, ExpressibleByArrayLiteral { return 1 } - open func index(after i: Index) -> Index { - return i + 1 - } - - open func formIndex(after i: inout Index) { - i += 1 - } - open var span: Span { return Span(zeroTo: [endIndex]) } @@ -80,52 +72,66 @@ open class ComplexArray: MutableLinearType, ExpressibleByArrayLiteral { open var reals: ComplexArrayRealSlice { get { - return ComplexArrayRealSlice(base: self, startIndex: startIndex, endIndex: 2*endIndex - 1, step: 2) + return ComplexArrayRealSlice(base: self, startIndex: startIndex, endIndex: 2*endIndex - 1, step: 2) } set { - precondition(newValue.count == reals.count) - for i in 0.. { get { - return ComplexArrayRealSlice(base: self, startIndex: startIndex + 1, endIndex: 2*endIndex, step: 2) + return ComplexArrayRealSlice(base: self, startIndex: startIndex + 1, endIndex: 2*endIndex, step: 2) } set { - precondition(newValue.count == imags.count) - for i in 0..>(capacity: capacity) + elements = ValueArray(capacity: capacity) } /// Construct an uninitialized ComplexArray with the given size public required init(count: Int) { - elements = ValueArray>(count: count) + elements = ValueArray(count: count) } /// Construct a ComplexArray from an array literal public required init(arrayLiteral elements: Element...) { - self.elements = ValueArray>(count: elements.count) - self.elements.mutablePointer.initialize(from: elements) + self.elements = ValueArray(elements) } /// Construct a ComplexArray from contiguous memory public required init(_ values: C) where C.Element == Element { - elements = ValueArray>(values) + elements = ValueArray(values) + } + + /// Construct a ComplexArray from a sequence + public required init(_ elements: S) where ComplexArray.Element == S.Element { + self.elements = ValueArray(elements) } /// Construct a ComplexArray of `count` elements, each initialized to `repeatedValue`. public required init(count: Int, repeatedValue: Element) { - elements = ValueArray>(count: count, repeatedValue: repeatedValue) + elements = ValueArray(count: count, repeatedValue: repeatedValue) + } + + public func assign(_ new: C) where C.Element == Element { + for (i, value) in zip(elements.indices, new) { + elements[i] = value + } } open subscript(index: Index) -> Element { @@ -174,16 +180,16 @@ open class ComplexArray: MutableLinearType, ExpressibleByArrayLiteral { return ComplexArray(elements) } - open func append(_ value: Element) { - elements.append(value) + open func append(_ newElement: Element) { + elements.append(newElement) } - open func appendContentsOf(_ values: C) where C.Iterator.Element == Element { - elements.appendContentsOf(values) + open func append(contentsOf newElements: S) where S.Iterator.Element == Element { + elements.append(contentsOf: newElements) } - open func replaceRange(_ subRange: Range, with newElements: C) where C.Iterator.Element == Element { - elements.replaceRange(subRange, with: newElements) + open func replaceSubrange(_ subRange: Range, with newElements: C) where C.Iterator.Element == Element { + elements.replaceSubrange(subRange, with: newElements) } open func toRowMatrix() -> Matrix { @@ -193,17 +199,8 @@ open class ComplexArray: MutableLinearType, ExpressibleByArrayLiteral { open func toColumnMatrix() -> Matrix { return Matrix(rows: count, columns: 1, elements: self) } -} -public func ==(lhs: ComplexArray, rhs: ComplexArray) -> Bool { - if lhs.count != rhs.count { - return false - } - - for i in 0.. Bool { + return lhs.count == rhs.count && lhs.elementsEqual(rhs) } - return true } diff --git a/Example/Pods/Upsurge/Source/Complex/ComplexArrayRealSlice.swift b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArrayRealSlice.swift similarity index 73% rename from Example/Pods/Upsurge/Source/Complex/ComplexArrayRealSlice.swift rename to Example/Pods/Upsurge/Sources/Upsurge/ComplexArrayRealSlice.swift index 3a1cbfe..03bef6d 100644 --- a/Example/Pods/Upsurge/Source/Complex/ComplexArrayRealSlice.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArrayRealSlice.swift @@ -24,42 +24,47 @@ public struct ComplexArrayRealSlice: MutableLinearType { public typealias Element = T public typealias Slice = ComplexArrayRealSlice - var base: ComplexArray - public var startIndex: Int - public var endIndex: Int - public var step: Int + public let base: ComplexArray + public let baseStartIndex: Index + public let baseEndIndex: Index + public let step: Int + + public var startIndex: Index { + return 0 + } + + public var endIndex: Index { + return (baseEndIndex - baseStartIndex + step - 1) / step + } + public var span: Span { - return Span(ranges: [startIndex ... endIndex - 1]) + return Span(ranges: [startIndex ..< endIndex]) } public func withUnsafeBufferPointer(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { - return try base.withUnsafeBufferPointer { pointer in - return try pointer.baseAddress!.withMemoryRebound(to: Element.self, capacity: base.capacity) { pointer in - return try body(UnsafeBufferPointer(start: pointer, count: count)) - } + return try withUnsafePointer { pointer in + return try body(UnsafeBufferPointer(start: pointer, count: count)) } } public func withUnsafePointer(_ body: (UnsafePointer) throws -> R) rethrows -> R { return try base.withUnsafePointer { pointer in return try pointer.withMemoryRebound(to: Element.self, capacity: base.capacity) { pointer in - return try body(pointer) + try body(pointer + baseStartIndex) } } } public func withUnsafeMutableBufferPointer(_ body: (UnsafeMutableBufferPointer) throws -> R) rethrows -> R { - return try base.withUnsafeMutableBufferPointer { pointer in - return try pointer.baseAddress!.withMemoryRebound(to: Element.self, capacity: base.capacity) { pointer in - return try body(UnsafeMutableBufferPointer(start: pointer, count: count)) - } + return try withUnsafeMutablePointer { pointer in + return try body(UnsafeMutableBufferPointer(start: pointer, count: count)) } } public func withUnsafeMutablePointer(_ body: (UnsafeMutablePointer) throws -> R) rethrows -> R { return try base.withUnsafeMutablePointer { pointer in return try pointer.withMemoryRebound(to: Element.self, capacity: base.capacity) { pointer in - return try body(pointer) + try body(pointer + baseStartIndex) } } } @@ -67,21 +72,29 @@ public struct ComplexArrayRealSlice: MutableLinearType { init(base: ComplexArray, startIndex: Int, endIndex: Int, step: Int) { assert(2 * base.startIndex <= startIndex && endIndex <= 2 * base.endIndex) self.base = base - self.startIndex = startIndex - self.endIndex = endIndex + self.baseStartIndex = startIndex + self.baseEndIndex = endIndex self.step = step } + public func assign(_ elements: C) where C.Element == Element { + withUnsafeMutablePointer { pointer in + for (i, value) in zip(stride(from: baseStartIndex, to: baseEndIndex, by: step), elements) { + pointer[i] = value + } + } + } + public subscript(index: Int) -> Element { get { - let baseIndex = startIndex + index * step + let baseIndex = startIndex + index precondition(0 <= baseIndex && baseIndex < 2 * base.count) return withUnsafePointer { pointer in - return pointer[baseIndex] + pointer[baseIndex] } } set { - let baseIndex = startIndex + index * step + let baseIndex = startIndex + index precondition(0 <= baseIndex && baseIndex < base.count) withUnsafeMutablePointer { pointer in pointer[baseIndex] = newValue @@ -119,23 +132,10 @@ public struct ComplexArrayRealSlice: MutableLinearType { } public func index(after i: Index) -> Index { - return i + 1 - } - - public func formIndex(after i: inout Index) { - i += 1 - } -} - -public func ==(lhs: ComplexArrayRealSlice, rhs: ComplexArrayRealSlice) -> Bool { - if lhs.count != rhs.count { - return false + return i + step } - for i in 0.. Bool { + return lhs.count == rhs.count && lhs.elementsEqual(rhs) } - return true } diff --git a/Example/Pods/Upsurge/Source/Complex/ComplexArraySlice.swift b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArraySlice.swift similarity index 53% rename from Example/Pods/Upsurge/Source/Complex/ComplexArraySlice.swift rename to Example/Pods/Upsurge/Sources/Upsurge/ComplexArraySlice.swift index 3aee688..86ad62e 100644 --- a/Example/Pods/Upsurge/Source/Complex/ComplexArraySlice.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/ComplexArraySlice.swift @@ -18,40 +18,55 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -open class ComplexArraySlice: MutableLinearType { +public class ComplexArraySlice: MutableLinearType { public typealias Index = Int public typealias Element = Complex public typealias Slice = ComplexArraySlice - var base: ComplexArray + public let base: ComplexArray + public let baseStartIndex: Index + public let baseEndIndex: Index + public let step: Index - open var startIndex: Index - open var endIndex: Index - open var step: Index + public var startIndex: Index { + return 0 + } - open var span: Span { - return Span(ranges: [startIndex ... endIndex - 1]) + public var endIndex: Index { + return (baseEndIndex - baseStartIndex + step - 1) / step } - open func withUnsafeBufferPointer(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { - return try base.withUnsafeBufferPointer(body) + public var span: Span { + return Span(ranges: [startIndex ..< endIndex]) } - open func withUnsafePointer(_ body: (UnsafePointer) throws -> R) rethrows -> R { - return try base.withUnsafePointer(body) + public func withUnsafeBufferPointer(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { + return try base.withUnsafeBufferPointer { p in + return try body(UnsafeBufferPointer(rebasing: p[baseStartIndex ..< baseEndIndex])) + } } - open func withUnsafeMutableBufferPointer(_ body: (UnsafeMutableBufferPointer) throws -> R) rethrows -> R { - return try base.withUnsafeMutableBufferPointer(body) + public func withUnsafePointer(_ body: (UnsafePointer) throws -> R) rethrows -> R { + return try base.withUnsafePointer { p in + return try body(p + baseStartIndex) + } } - open func withUnsafeMutablePointer(_ body: (UnsafeMutablePointer) throws -> R) rethrows -> R { - return try base.withUnsafeMutablePointer(body) + public func withUnsafeMutableBufferPointer(_ body: (UnsafeMutableBufferPointer) throws -> R) rethrows -> R { + return try base.withUnsafeMutableBufferPointer { p in + return try body(UnsafeMutableBufferPointer(rebasing: p[baseStartIndex ..< baseEndIndex])) + } } - open var reals: ComplexArrayRealSlice { + public func withUnsafeMutablePointer(_ body: (UnsafeMutablePointer) throws -> R) rethrows -> R { + return try base.withUnsafeMutablePointer { p in + return try body(p + baseStartIndex) + } + } + + public var reals: ComplexArrayRealSlice { get { - return ComplexArrayRealSlice(base: base, startIndex: startIndex, endIndex: 2*endIndex - 1, step: 2) + return ComplexArrayRealSlice(base: base, startIndex: startIndex, endIndex: 2*endIndex - 1, step: 2) } set { precondition(newValue.count == reals.count) @@ -61,9 +76,9 @@ open class ComplexArraySlice: MutableLinearType { } } - open var imags: ComplexArrayRealSlice { + public var imags: ComplexArrayRealSlice { get { - return ComplexArrayRealSlice(base: base, startIndex: startIndex + 1, endIndex: 2*endIndex, step: 2) + return ComplexArrayRealSlice(base: base, startIndex: startIndex + 1, endIndex: 2*endIndex, step: 2) } set { precondition(newValue.count == imags.count) @@ -76,23 +91,29 @@ open class ComplexArraySlice: MutableLinearType { public required init(base: ComplexArray, startIndex: Index, endIndex: Index, step: Int) { assert(base.startIndex <= startIndex && endIndex <= base.endIndex) self.base = base - self.startIndex = startIndex - self.endIndex = endIndex + self.baseStartIndex = startIndex + self.baseEndIndex = endIndex self.step = step } - open subscript(index: Index) -> Element { + public func assign(_ elements: C) where C.Element == Element { + for (i, value) in zip(stride(from: baseStartIndex, to: baseEndIndex, by: step), elements) { + base[i] = value + } + } + + public subscript(index: Index) -> Element { get { precondition(0 <= index && index < count) - return base[index] + return base[baseStartIndex + index * step] } set { precondition(0 <= index && index < count) - base[index] = newValue + base[baseStartIndex + index * step] = newValue } } - open subscript(indices: [Int]) -> Element { + public subscript(indices: [Int]) -> Element { get { assert(indices.count == 1) return self[indices[0]] @@ -103,57 +124,32 @@ open class ComplexArraySlice: MutableLinearType { } } - open subscript(intervals: [IntervalType]) -> Slice { + public subscript(intervals: [IntervalType]) -> Slice { get { + assert(span.contains(intervals)) assert(intervals.count == 1) let start = intervals[0].start ?? startIndex let end = intervals[0].end ?? endIndex return Slice(base: base, startIndex: start, endIndex: end, step: step) } set { + assert(span.contains(intervals)) assert(intervals.count == 1) let start = intervals[0].start ?? startIndex let end = intervals[0].end ?? endIndex - assert(startIndex <= start && end <= endIndex) for i in start.. Index { - return i + 1 - } - - open func formIndex(after i: inout Index) { - i += 1 - } -} - -// MARK: - Equatable + // MARK: - Equatable -public func ==(lhs: ComplexArraySlice, rhs: ComplexArraySlice) -> Bool { - if lhs.count != rhs.count { - return false + public static func == (lhs: ComplexArraySlice, rhs: ComplexArraySlice) -> Bool { + return lhs.count == rhs.count && lhs.elementsEqual(rhs) } - for (i, v) in lhs.enumerated() { - if v != rhs[i] { - return false - } - } - return true -} - -public func ==(lhs: ComplexArraySlice, rhs: ComplexArray) -> Bool { - if lhs.count != rhs.count { - return false - } - - for i in 0..) -> Bool { + return lhs.count == rhs.count && lhs.elementsEqual(rhs) } - return true } diff --git a/Example/Pods/Upsurge/Source/DSP/DSP.swift b/Example/Pods/Upsurge/Sources/Upsurge/DSP.swift similarity index 100% rename from Example/Pods/Upsurge/Source/DSP/DSP.swift rename to Example/Pods/Upsurge/Sources/Upsurge/DSP.swift diff --git a/Example/Pods/Upsurge/Source/Operations/Exponential.swift b/Example/Pods/Upsurge/Sources/Upsurge/Exponential.swift similarity index 100% rename from Example/Pods/Upsurge/Source/Operations/Exponential.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Exponential.swift diff --git a/Example/Pods/Upsurge/Source/DSP/FFT.swift b/Example/Pods/Upsurge/Sources/Upsurge/FFT.swift similarity index 86% rename from Example/Pods/Upsurge/Source/DSP/FFT.swift rename to Example/Pods/Upsurge/Sources/Upsurge/FFT.swift index 001469f..9232d5e 100644 --- a/Example/Pods/Upsurge/Source/DSP/FFT.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/FFT.swift @@ -28,7 +28,8 @@ open class FFTDouble { fileprivate var imag: ValueArray public init(inputLength: Int) { - let maxLengthLog2 = vDSP_Length(ceil(log2(Double(inputLength)))) + assert(inputLength.nonzeroBitCount == 1, "input length must be a power of 2") + let maxLengthLog2 = vDSP_Length(log2(Double(inputLength))) + 1 maxLength = vDSP_Length(exp2(Double(maxLengthLog2))) setup = vDSP_create_fftsetupD(maxLengthLog2, FFTRadix(kFFTRadix2))! @@ -53,7 +54,7 @@ open class FFTDouble { open func forward(_ input: M, results: inout ComplexArray) where M.Element == Double { let lengthLog2 = vDSP_Length(log2(Double(input.count))) let length = vDSP_Length(exp2(Double(lengthLog2))) - precondition(length <= maxLength, "Input should have at most \(maxLength) elements") + precondition(length <= maxLength/2, "Input should have at most \(maxLength/2) elements") real.assignFrom(input) for i in 0..= Int(length) / 2) + let capacity = results.capacity + precondition(capacity >= Int(length) / 2) results.count = Int(length) / 2 withPointer(&results) { pointer in - pointer.withMemoryRebound(to: DSPDoubleComplex.self, capacity: results.capacity) { resultsPointer in + pointer.withMemoryRebound(to: DSPDoubleComplex.self, capacity: capacity) { resultsPointer in vDSP_ztocD(&splitComplex, 1, resultsPointer, 1, length/2) } } @@ -79,7 +81,7 @@ open class FFTDouble { open func forwardMags(_ input: M) -> ValueArray where M.Element == Double { let lengthLog2 = vDSP_Length(log2(Double(input.count))) let length = vDSP_Length(exp2(Double(lengthLog2))) - var results = ValueArray(count: Int(length) / 2) + var results = ValueArray(count: Int(length)) forwardMags(input, results: &results) return results } @@ -88,7 +90,7 @@ open class FFTDouble { open func forwardMags(_ input: M, results: inout ValueArray) where M.Element == Double { let lengthLog2 = vDSP_Length(log2(Double(input.count))) let length = vDSP_Length(exp2(Double(lengthLog2))) - precondition(length <= maxLength, "Input should have at most \(maxLength) elements") + precondition(length <= maxLength/2, "Input should have at most \(maxLength/2) elements") real.assignFrom(input) for i in 0.. public init(inputLength: Int) { - let maxLengthLog2 = vDSP_Length(ceil(log2(Float(inputLength)))) + assert(inputLength.nonzeroBitCount == 1, "input length must be a power of 2") + let maxLengthLog2 = vDSP_Length(log2(Float(inputLength))) + 1 maxLength = vDSP_Length(exp2(Float(maxLengthLog2))) - setup = vDSP_create_fftsetupD(maxLengthLog2, FFTRadix(kFFTRadix2))! + setup = vDSP_create_fftsetup(maxLengthLog2, FFTRadix(kFFTRadix2))! real = ValueArray(count: Int(maxLength)) imag = ValueArray(count: Int(maxLength)) @@ -131,7 +134,7 @@ open class FFTFloat { open func forward(_ input: M) -> ComplexArray where M.Element == Float { let lengthLog2 = vDSP_Length(log2(Float(input.count))) let length = vDSP_Length(exp2(Float(lengthLog2))) - precondition(length <= maxLength, "Input should have at most \(maxLength) elements") + precondition(length <= maxLength/2, "Input should have at most \(maxLength/2) elements") real.assignFrom(input) for i in 0..(count: Int(length)/2) withPointer(&result) { pointer in - pointer.withMemoryRebound(to: DSPComplex.self, capacity: result.count) { pointer in + pointer.withMemoryRebound(to: DSPComplex.self, capacity: Int(length)/2) { pointer in vDSP_ztoc(&splitComplex, 1, pointer, 1, length/2) } } @@ -156,7 +159,7 @@ open class FFTFloat { open func forwardMags(_ input: M) -> ValueArray where M.Element == Float { let lengthLog2 = vDSP_Length(log2(Float(input.count))) let length = vDSP_Length(exp2(Float(lengthLog2))) - precondition(length <= maxLength, "Input should have at most \(maxLength) elements") + precondition(length <= maxLength/2, "Input should have at most \(maxLength/2) elements") real.assignFrom(input) for i in 0..(lhs: inout ML, rhs: MR) where ML.Element == Double, MR.Element == Double { assert(lhs.count >= rhs.count) let count = min(lhs.count, rhs.count) + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vaddD(lhsp + lhs.startIndex, lhs.step, rhsp + rhs.startIndex, rhs.step, lhsp, lhs.step, vDSP_Length(count)) + vDSP_vaddD(lhsp + lhsStart, lhsStep, rhsp + rhs.startIndex, rhs.step, lhsp, lhsStep, vDSP_Length(count)) } } @@ -40,9 +42,12 @@ public func +(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Double) where ML.Element == Double { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in var scalar = rhs - vDSP_vsaddD(lhsp + lhs.startIndex, lhs.step, &scalar, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsaddD(lhsp + lhsStart, lhsStep, &scalar, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -55,14 +60,16 @@ public func +(lhs: ML, rhs: Double) -> ValueArray where return results } -public func +(lhs: Double, rhs: MR) -> ValueArray where ML.Element == Double, MR.Element == Double { +public func +(lhs: Double, rhs: MR) -> ValueArray where MR.Element == Double { return rhs + lhs } public func -=(lhs: inout ML, rhs: MR) where ML.Element == Double, MR.Element == Double { let count = min(lhs.count, rhs.count) + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vsubD(rhsp + rhs.startIndex, rhs.step, lhsp + lhs.startIndex, lhs.step, lhsp + lhs.startIndex, lhs.step, vDSP_Length(count)) + vDSP_vsubD(rhsp + rhs.startIndex, rhs.step, lhsp + lhsStart, lhsStep, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -77,8 +84,11 @@ public func -(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Double) where ML.Element == Double { var scalar: Double = -rhs + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in - vDSP_vsaddD(lhsp + lhs.startIndex, lhs.step, &scalar, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsaddD(lhsp + lhsStart, lhsStep, &scalar, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -95,7 +105,7 @@ public func -(lhs: Double, rhs: ML) -> ValueArray where let results = ValueArray(count: rhs.count) withPointer(rhs) { rhsp in var scalarm: Double = -1 - var scalara: Double = 0 + var scalara: Double = lhs vDSP_vsmsaD(rhsp + rhs.startIndex, rhs.step, &scalarm, &scalara, results.mutablePointer + results.startIndex, results.step, vDSP_Length(rhs.count)) } return results @@ -103,8 +113,10 @@ public func -(lhs: Double, rhs: ML) -> ValueArray where public func /=(lhs: inout ML, rhs: MR) where ML.Element == Double, MR.Element == Double { let count = min(lhs.count, rhs.count) + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vdivD(rhsp + rhs.startIndex, rhs.step, lhsp + lhs.startIndex, lhs.step, lhsp + lhs.startIndex, lhs.step, vDSP_Length(count)) + vDSP_vdivD(rhsp + rhs.startIndex, rhs.step, lhsp + lhsStart, lhsStep, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -118,9 +130,12 @@ public func /(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Double) where ML.Element == Double { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in var scalar = rhs - vDSP_vsdivD(lhsp + lhs.startIndex, lhs.step, &scalar, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsdivD(lhsp + lhsStart, lhsStep, &scalar, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -143,8 +158,11 @@ public func /(lhs: Double, rhs: ML) -> ValueArray where } public func *=(lhs: inout ML, rhs: MR) where ML.Element == Double, MR.Element == Double { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vmulD(lhsp + lhs.startIndex, lhs.step, rhsp + rhs.startIndex, rhs.step, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vmulD(lhsp + lhsStart, lhsStep, rhsp + rhs.startIndex, rhs.step, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -158,8 +176,11 @@ public func *(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Double) where ML.Element == Double { var rhs = rhs + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in - vDSP_vsmulD(lhsp + lhs.startIndex, lhs.step, &rhs, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsmulD(lhsp + lhsStart, lhsStep, &rhs, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -194,8 +215,10 @@ public func •(lhs: ML, rhs: MR) -> Double wher public func +=(lhs: inout ML, rhs: MR) where ML.Element == Float, MR.Element == Float { assert(lhs.count >= rhs.count) let count = min(lhs.count, rhs.count) + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vadd(lhsp + lhs.startIndex, lhs.step, rhsp + rhs.startIndex, rhs.step, lhsp, lhs.step, vDSP_Length(count)) + vDSP_vadd(lhsp + lhsStart, lhsStep, rhsp + rhs.startIndex, rhs.step, lhsp, lhsStep, vDSP_Length(count)) } } @@ -209,9 +232,12 @@ public func +(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Float) where ML.Element == Float { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in var scalar = rhs - vDSP_vsadd(lhsp + lhs.startIndex, lhs.step, &scalar, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsadd(lhsp + lhsStart, lhsStep, &scalar, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -224,14 +250,16 @@ public func +(lhs: ML, rhs: Float) -> ValueArray where ML return results } -public func +(lhs: Float, rhs: MR) -> ValueArray where ML.Element == Float, MR.Element == Float { +public func +(lhs: Float, rhs: MR) -> ValueArray where MR.Element == Float { return rhs + lhs } public func -=(lhs: inout ML, rhs: MR) where ML.Element == Float, MR.Element == Float { let count = min(lhs.count, rhs.count) + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vsub(rhsp + rhs.startIndex, rhs.step, lhsp + lhs.startIndex, lhs.step, lhsp + lhs.startIndex, lhs.step, vDSP_Length(count)) + vDSP_vsub(rhsp + rhs.startIndex, rhs.step, lhsp + lhsStart, lhsStep, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -245,9 +273,12 @@ public func -(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Float) where ML.Element == Float { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in var scalar: Float = -rhs - vDSP_vsadd(lhsp + lhs.startIndex, lhs.step, &scalar, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsadd(lhsp + lhsStart, lhsStep, &scalar, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -264,7 +295,7 @@ public func -(lhs: Float, rhs: ML) -> ValueArray where ML let results = ValueArray(count: rhs.count) withPointer(rhs) { rhsp in var scalarm: Float = -1 - var scalara: Float = 0 + var scalara: Float = lhs vDSP_vsmsa(rhsp + rhs.startIndex, rhs.step, &scalarm, &scalara, results.mutablePointer + results.startIndex, results.step, vDSP_Length(rhs.count)) } return results @@ -272,8 +303,10 @@ public func -(lhs: Float, rhs: ML) -> ValueArray where ML public func /=(lhs: inout ML, rhs: MR) where ML.Element == Float, MR.Element == Float { let count = min(lhs.count, rhs.count) + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vdiv(rhsp + rhs.startIndex, rhs.step, lhsp + lhs.startIndex, lhs.step, lhsp + lhs.startIndex, lhs.step, vDSP_Length(count)) + vDSP_vdiv(rhsp + rhs.startIndex, rhs.step, lhsp + lhsStart, lhsStep, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -287,9 +320,12 @@ public func /(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Float) where ML.Element == Float { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in var scalar = rhs - vDSP_vsdiv(lhsp + lhs.startIndex, lhs.step, &scalar, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsdiv(lhsp + lhsStart, lhsStep, &scalar, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -312,8 +348,11 @@ public func /(lhs: Float, rhs: ML) -> ValueArray where ML } public func *=(lhs: inout ML, rhs: MR) where ML.Element == Float, MR.Element == Float { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointers(rhs, &lhs) { rhsp, lhsp in - vDSP_vmul(lhsp + lhs.startIndex, lhs.step, rhsp + rhs.startIndex, rhs.step, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vmul(lhsp + lhsStart, lhsStep, rhsp + rhs.startIndex, rhs.step, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } @@ -326,9 +365,12 @@ public func *(lhs: ML, rhs: MR) -> ValueArray(lhs: inout ML, rhs: Float) where ML.Element == Float { + let count = lhs.count + let lhsStart = lhs.startIndex + let lhsStep = lhs.step withPointer(&lhs) { lhsp in var scalar = rhs - vDSP_vsmul(lhsp + lhs.startIndex, lhs.step, &scalar, lhsp + lhs.startIndex, lhs.step, vDSP_Length(lhs.count)) + vDSP_vsmul(lhsp + lhsStart, lhsStep, &scalar, lhsp + lhsStart, lhsStep, vDSP_Length(count)) } } diff --git a/Example/Pods/Upsurge/Source/1D/LinearType.swift b/Example/Pods/Upsurge/Sources/Upsurge/LinearType.swift similarity index 79% rename from Example/Pods/Upsurge/Source/1D/LinearType.swift rename to Example/Pods/Upsurge/Sources/Upsurge/LinearType.swift index 99b4085..2b035f8 100644 --- a/Example/Pods/Upsurge/Source/1D/LinearType.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/LinearType.swift @@ -19,8 +19,7 @@ // THE SOFTWARE. /// The `LinearType` protocol should be implemented by any collection that stores its values in a contiguous memory block. This is the building block for one-dimensional operations that are single-instruction, multiple-data (SIMD). -public protocol LinearType: Collection, TensorType { - associatedtype Element +public protocol LinearType: TensorType, CustomStringConvertible, CustomDebugStringConvertible, BidirectionalCollection { /// The index of the first valid element var startIndex: Int { get } @@ -31,30 +30,39 @@ public protocol LinearType: Collection, TensorType { /// The step size between valid elements var step: Int { get } - var span: Span { get } - subscript(position: Int) -> Element { get } } public extension LinearType { - /// The number of valid element in the memory block, taking into account the step size. - public var count: Int { - return (endIndex - startIndex + step - 1) / step - } - public var dimensions: [Int] { return [count] } -} -internal extension LinearType { - func indexIsValid(_ index: Int) -> Bool { - return startIndex <= index && index < endIndex + public func index(after i: Int) -> Int { + return i + 1 + } + + public func index(before i: Int) -> Int { + return i - 1 + } + + public func formIndex(after i: inout Int) { + i += 1 + } + + public var description: String { + return "[\(map { "\($0)" }.joined(separator: ", "))]" + } + + public var debugDescription: String { + return description } } public protocol MutableLinearType: LinearType, MutableTensorType { subscript(position: Int) -> Element { get set } + + mutating func assign(_ elements: C) where C.Element == Element } extension Array: LinearType { @@ -65,18 +73,14 @@ extension Array: LinearType { } public var span: Span { - return Span(ranges: [startIndex ... endIndex - 1]) + return Span(ranges: [startIndex ..< endIndex]) } - public init(other: C) where C.Iterator.Element == Array.Element { - self.init() - - for v in other { - self.append(v) - } + public init(other: C) where C.Iterator.Element == Element { + self = Array(other) } - public subscript(indices: [Int]) -> Element { + public subscript(indices: [Index]) -> Element { get { assert(indices.count == 1) return self[indices[0]] @@ -104,7 +108,7 @@ extension Array: LinearType { public func withUnsafePointer(_ body: (UnsafePointer) throws -> R) rethrows -> R { return try withUnsafeBufferPointer { pointer in - return try body(pointer.baseAddress!) + try body(pointer.baseAddress!) } } } diff --git a/Example/Pods/Upsurge/Source/2D/Matrix.swift b/Example/Pods/Upsurge/Sources/Upsurge/Matrix.swift similarity index 64% rename from Example/Pods/Upsurge/Source/2D/Matrix.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Matrix.swift index 69e281c..da7c613 100644 --- a/Example/Pods/Upsurge/Source/2D/Matrix.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/Matrix.swift @@ -20,10 +20,9 @@ import Accelerate -open class Matrix: MutableQuadraticType, Equatable, CustomStringConvertible { +open class Matrix: MutableQuadraticType, Equatable, CustomStringConvertible { public typealias Index = (Int, Int) public typealias Slice = MatrixSlice - public typealias Element = T open var rows: Int open var columns: Int @@ -91,10 +90,8 @@ open class Matrix: MutableQuadraticType, Equatable, CustomStringConver } /// Construct a Matrix of `rows` by `columns` with elements initialized to repeatedValue - public init(rows: Int, columns: Int, repeatedValue: Element) { - self.rows = rows - self.columns = columns - self.elements = ValueArray(count: rows * columns, repeatedValue: repeatedValue) + public convenience init(rows: Int, columns: Int, repeatedValue: Element) { + self.init(rows: rows, columns: columns) { repeatedValue } } /// Construct a Matrix from an array of rows @@ -102,11 +99,33 @@ open class Matrix: MutableQuadraticType, Equatable, CustomStringConver let rows = contents.count let cols = contents[0].count + for element in contents { + precondition(element.count == cols) + } + + self.init(rows: rows, columns: cols) + + for (i, row) in contents.enumerated() { + elements.replaceSubrange(i*cols..(_ contents: [M]) where M.Element == Element { + + let rows = contents.count + let cols = Int(contents[0].count) + + for element in contents { + precondition(element.count == cols) + } + self.init(rows: rows, columns: cols) for (i, row) in contents.enumerated() { - elements.replaceRange(i*cols..: MutableQuadraticType, Equatable, CustomStringConver } } - open subscript(intervals: IntervalType...) -> Slice { + public subscript(intervals: IntervalType...) -> Slice { get { return self[intervals] } @@ -147,7 +166,7 @@ open class Matrix: MutableQuadraticType, Equatable, CustomStringConver } } - open subscript(intervals: [IntervalType]) -> Slice { + public subscript(intervals: [IntervalType]) -> Slice { get { let span = Span(dimensions: dimensions, intervals: intervals) return self[span] @@ -158,6 +177,26 @@ open class Matrix: MutableQuadraticType, Equatable, CustomStringConver } } + public subscript(ranges: CountableRange...) -> Slice { + get { + return self[ranges] + } + set { + self[ranges] = newValue + } + } + + public subscript(ranges: [CountableRange]) -> Slice { + get { + let span = Span(dimensions: dimensions, intervals: ranges) + return self[span] + } + set { + let span = Span(dimensions: dimensions, intervals: ranges) + self[span] = newValue + } + } + subscript(span: Span) -> Slice { get { return MatrixSlice(base: self, span: span) @@ -171,11 +210,11 @@ open class Matrix: MutableQuadraticType, Equatable, CustomStringConver } open func row(_ index: Int) -> ValueArraySlice { - return ValueArraySlice(base: elements, startIndex: index * columns, endIndex: (index + 1) * columns, step: 1) + return ValueArraySlice(base: elements, startIndex: index * columns, endIndex: (index + 1) * columns, step: 1) } open func column(_ index: Int) -> ValueArraySlice { - return ValueArraySlice(base: elements, startIndex: index, endIndex: rows * columns - columns + index + 1, step: columns) + return ValueArraySlice(base: elements, startIndex: index, endIndex: rows * columns, step: columns) } open func copy() -> Matrix { @@ -184,7 +223,7 @@ open class Matrix: MutableQuadraticType, Equatable, CustomStringConver } open func indexIsValidForRow(_ row: Int, column: Int) -> Bool { - return row >= 0 && row < rows && column >= 0 && column < columns + return (0..: MutableQuadraticType, Equatable, CustomStringConver return description } -} -// MARK: - Equatable + open func tile(_ m: Int, _ n: Int) -> Matrix { + // Construct a block matrix of size m by n, with a copy of source matrix as each element. + // m: Specifies the number of times to copy along the vertical axis. + // n: Specifies the number of times to copy along the horizontal axis. + precondition(m > 0 && n > 0, "Minimum of 1 repeat in each direction is required") + let results = Matrix(rows: m*rows, columns: n*columns) + let typeMemorySize = MemoryLayout.size + let bytesInOneSourceRow = columns*typeMemorySize + let bytesInOneResultsRow = results.columns*typeMemorySize + for i in 0..(lhs: Matrix, rhs: Matrix) -> Bool { - return lhs.elements == rhs.elements -} + // MARK: - Equatable -public func ==(lhs: Matrix, rhs: MatrixSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: Matrix, rhs: Matrix) -> Bool { + return lhs.elements == rhs.elements } - return true -} -public func ==(lhs: Matrix, rhs: Tensor) -> Bool { - return lhs.elements == rhs.elements -} + public static func == (lhs: Matrix, rhs: Slice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } + } -public func ==(lhs: Matrix, rhs: TensorSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: Matrix, rhs: Tensor) -> Bool { + return lhs.elements == rhs.elements } - return true -} -public func ==(lhs: Matrix, rhs: TwoDimensionalTensorSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: Matrix, rhs: TensorSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } + } + + public static func == (lhs: Matrix, rhs: TwoDimensionalTensorSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true } // MARK: - diff --git a/Example/Pods/Upsurge/Source/2D/MatrixArithmetic.swift b/Example/Pods/Upsurge/Sources/Upsurge/MatrixArithmetic.swift similarity index 88% rename from Example/Pods/Upsurge/Source/2D/MatrixArithmetic.swift rename to Example/Pods/Upsurge/Sources/Upsurge/MatrixArithmetic.swift index 5d797cd..631fd26 100644 --- a/Example/Pods/Upsurge/Source/2D/MatrixArithmetic.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/MatrixArithmetic.swift @@ -39,8 +39,9 @@ public func gemm< let atrans = a.arrangement == c.arrangement ? CblasNoTrans : CblasTrans let btrans = b.arrangement == c.arrangement ? CblasNoTrans : CblasTrans + let cStride = Int32(c.stride) withPointers(a, b, &c) { pa, pb, pc in - cblas_dgemm(order, atrans, btrans, Int32(a.rows), Int32(b.columns), Int32(a.columns), α, pa, Int32(a.stride), pb, Int32(b.stride), β, pc, Int32(c.stride)) + cblas_dgemm(order, atrans, btrans, Int32(a.rows), Int32(b.columns), Int32(a.columns), α, pa, Int32(a.stride), pb, Int32(b.stride), β, pc, cStride) } } @@ -56,9 +57,11 @@ public func inv(_ x: M) -> Matrix where M.Element == D var error: __CLPK_integer = 0 var nc = __CLPK_integer(x.columns) - withPointer(&results) { pointer in - dgetrf_(&nc, &nc, pointer, &nc, &ipiv, &error) - dgetri_(&nc, pointer, &nc, &ipiv, &work, &lwork, &error) + withUnsafeMutablePointersTo(&nc, &lwork, &error) { nc, lwork, error in + withPointer(&results) { pointer in + dgetrf_(nc, nc, pointer, nc, &ipiv, error) + dgetri_(nc, pointer, nc, &ipiv, &work, lwork, error) + } } assert(error == 0, "Matrix not invertible") @@ -69,28 +72,31 @@ public func inv(_ x: M) -> Matrix where M.Element == D public func normalize(_ x: M) -> Matrix where M.Element == Double { let inputMatrix = Matrix(x) + var individualVectors: [[Double]] = [] - for i in (0..(inputMatrix.column(i)/Double(two_norm)) + let normalizedVector = [Double](inputMatrix.column(i)/Double(two_norm)) individualVectors.append(normalizedVector) } // Create a new matrix that will hold the normalized individual columns - let results = Matrix(individualVectors) - return results + return Matrix(individualVectors) } public func transpose(_ x: M) -> Matrix where M.Element == Double { - var results = Matrix(rows: x.columns, columns: x.rows, repeatedValue: 0.0) + let rows = x.columns + let columns = x.rows + var results = Matrix(rows: rows, columns: columns, repeatedValue: 0.0) + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_mtransD(xp, x.step, rp, results.step, vDSP_Length(results.rows), vDSP_Length(results.columns)) + vDSP_mtransD(xp, x.step, rp, step, vDSP_Length(rows), vDSP_Length(columns)) } return results } @@ -180,8 +186,9 @@ public func gemm< let order = c.arrangement == .rowMajor ? CblasRowMajor : CblasColMajor let atrans = a.arrangement == c.arrangement ? CblasNoTrans : CblasTrans let btrans = b.arrangement == c.arrangement ? CblasNoTrans : CblasTrans + let cStride = Int32(c.stride) withPointers(a, b, &c) { pa, pb, pc in - cblas_sgemm(order, atrans, btrans, Int32(a.rows), Int32(b.columns), Int32(a.columns), α, pa, Int32(a.stride), pb, Int32(b.stride), β, pc, Int32(c.stride)) + cblas_sgemm(order, atrans, btrans, Int32(a.rows), Int32(b.columns), Int32(a.columns), α, pa, Int32(a.stride), pb, Int32(b.stride), β, pc, cStride) } } @@ -197,9 +204,11 @@ public func inv(_ x: M) -> Matrix where M.Element == Fl var error: __CLPK_integer = 0 var nc = __CLPK_integer(x.columns) - withPointer(&results) { pointer in - sgetrf_(&nc, &nc, pointer, &nc, &ipiv, &error) - sgetri_(&nc, pointer, &nc, &ipiv, &work, &lwork, &error) + withUnsafeMutablePointersTo(&nc, &lwork, &error) { nc, lwork, error in + withPointer(&results) { pointer in + sgetrf_(nc, nc, pointer, nc, &ipiv, error) + sgetri_(nc, pointer, nc, &ipiv, &work, lwork, error) + } } assert(error == 0, "Matrix not invertible") @@ -210,15 +219,16 @@ public func inv(_ x: M) -> Matrix where M.Element == Fl public func normalize(_ x: M) -> Matrix where M.Element == Float { let inputMatrix = Matrix(x) + var individualVectors: [[Float]] = [] - for i in (0..(inputMatrix.column(i)/two_norm) + let normalizedVector = [Float](inputMatrix.column(i)/two_norm) individualVectors.append(normalizedVector) } @@ -230,8 +240,9 @@ public func normalize(_ x: M) -> Matrix where M.Element public func transpose(_ x: M) -> Matrix where M.Element == Float { var results = Matrix(rows: x.columns, columns: x.rows, repeatedValue: 0.0) + let step = results.step withPointers(x, &results) { xp, rp in - vDSP_mtrans(xp, x.step, rp, results.step, vDSP_Length(results.rows), vDSP_Length(results.columns)) + vDSP_mtrans(xp, x.step, rp, step, vDSP_Length(x.columns), vDSP_Length(x.rows)) } return results } diff --git a/Example/Pods/Upsurge/Source/2D/MatrixSlice.swift b/Example/Pods/Upsurge/Sources/Upsurge/MatrixSlice.swift similarity index 68% rename from Example/Pods/Upsurge/Source/2D/MatrixSlice.swift rename to Example/Pods/Upsurge/Sources/Upsurge/MatrixSlice.swift index 4f8609f..08cba77 100644 --- a/Example/Pods/Upsurge/Source/2D/MatrixSlice.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/MatrixSlice.swift @@ -20,16 +20,15 @@ import Foundation -open class MatrixSlice: MutableQuadraticType, CustomStringConvertible, Equatable { +open class MatrixSlice: MutableQuadraticType, CustomStringConvertible, Equatable { public typealias Index = (Int, Int) public typealias Slice = MatrixSlice - public typealias Element = T - open var rows: Int - open var columns: Int + open let rows: Int + open let columns: Int - open var base: Matrix - open var span: Span + open let base: Matrix + open let span: Span open func withUnsafeBufferPointer(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { let index = linearIndex(span.startIndex) @@ -42,7 +41,7 @@ open class MatrixSlice: MutableQuadraticType, CustomStringConvertible, open func withUnsafePointer(_ body: (UnsafePointer) throws -> R) rethrows -> R { let index = linearIndex(span.startIndex) return try base.withUnsafePointer { pointer in - return try body(pointer + index) + try body(pointer + index) } } @@ -57,7 +56,7 @@ open class MatrixSlice: MutableQuadraticType, CustomStringConvertible, open func withUnsafeMutablePointer(_ body: (UnsafeMutablePointer) throws -> R) rethrows -> R { let index = linearIndex(span.startIndex) return try base.withUnsafeMutablePointer { pointer in - return try body(pointer + index) + try body(pointer + index) } } @@ -104,12 +103,12 @@ open class MatrixSlice: MutableQuadraticType, CustomStringConvertible, fileprivate subscript(span: Span) -> Slice { get { - assert(self.span.contains(span)) + assert(span.contains(span)) return MatrixSlice(base: base, span: span) } set { - assert(self.span.contains(span)) - assert(self.span ≅ newValue.span) + assert(span.contains(span)) + assert(span ≅ newValue.span) for (lhsIndex, rhsIndex) in zip(span, newValue.span) { self[lhsIndex] = newValue[rhsIndex] } @@ -138,21 +137,21 @@ open class MatrixSlice: MutableQuadraticType, CustomStringConvertible, open func indexIsValid(_ indices: [Int]) -> Bool { assert(indices.count == dimensions.count) - for (i, index) in indices.enumerated() { - if index < span[i].lowerBound || span[i].upperBound < index { - return false - } + return indices.enumerated().all { (i, index) in + self.span[i].contains(index) } - return true } open var description: String { var description = "" - for i in 0..: MutableQuadraticType, CustomStringConvertible, return description } } +extension MatrixSlice { + // MARK: - Equatable -// MARK: - Equatable - -public func ==(lhs: MatrixSlice, rhs: Matrix) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: MatrixSlice, rhs: Matrix) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true -} -public func ==(lhs: MatrixSlice, rhs: MatrixSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: MatrixSlice, rhs: MatrixSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true -} -public func ==(lhs: MatrixSlice, rhs: Tensor) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: MatrixSlice, rhs: Tensor) -> Bool { + assert(lhs.span ≅ rhs.span) + + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true -} -public func ==(lhs: MatrixSlice, rhs: TensorSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: MatrixSlice, rhs: TensorSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true -} -public func ==(lhs: MatrixSlice, rhs: TwoDimensionalTensorSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: MatrixSlice, rhs: TwoDimensionalTensorSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true } diff --git a/Example/Pods/Upsurge/Source/Operations/PointerUtilities.swift b/Example/Pods/Upsurge/Sources/Upsurge/PointerUtilities.swift similarity index 52% rename from Example/Pods/Upsurge/Source/Operations/PointerUtilities.swift rename to Example/Pods/Upsurge/Sources/Upsurge/PointerUtilities.swift index b61241b..893270f 100644 --- a/Example/Pods/Upsurge/Source/Operations/PointerUtilities.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/PointerUtilities.swift @@ -34,11 +34,34 @@ public func withPointer(_ t: inout T, body: (UnsafeMuta // MARK: Two parameters +/// Invokes the given closure with pointers to the given arguments (2 parameter version). +/// +/// - See: `withUnsafePointer(to:body:)` +@discardableResult +public func withUnsafePointersTo(_ a: inout A, _ b: inout B, body: (UnsafePointer, UnsafePointer) throws -> Result) rethrows -> Result { + return try withUnsafePointer(to: &a) { (a: UnsafePointer) throws -> Result in + return try withUnsafePointer(to: &b) { (b: UnsafePointer) throws -> Result in + return try body(a, b) + } + } +} + +/// Invokes the given closure with mutable pointers to the given arguments (2 parameter version). +/// +/// - See: `withUnsafeMutablePointer(to:body:)` +@discardableResult +public func withUnsafeMutablePointersTo(_ a: inout A, _ b: inout B, body: (UnsafeMutablePointer, UnsafeMutablePointer) throws -> Result) rethrows -> Result { + return try withUnsafeMutablePointer(to: &a) { (a: UnsafeMutablePointer) throws -> Result in + return try withUnsafeMutablePointer(to: &b) { (b: UnsafeMutablePointer) throws -> Result in + return try body(a, b) + } + } +} /// Call `body(p1, p2)` with the pointers for the two types public func withPointers(_ t1: T1, _ t2: T2, body: (UnsafePointer, UnsafePointer) throws -> R) rethrows -> R where T1.Element == T2.Element { return try t1.withUnsafeBufferPointer { p1 in - return try t2.withUnsafeBufferPointer { p2 in - return try body(p1.baseAddress!, p2.baseAddress!) + try t2.withUnsafeBufferPointer { p2 in + try body(p1.baseAddress!, p2.baseAddress!) } } } @@ -46,8 +69,8 @@ public func withPointers(_ t1: T1, _ t2: T2, /// Call `body(p1, p2)` with the pointers for the two types public func withPointers(_ t1: T1, _ t2: inout T2, body: (UnsafePointer, UnsafeMutablePointer) throws -> R) rethrows -> R where T1.Element == T2.Element { return try t1.withUnsafeBufferPointer { p1 in - return try t2.withUnsafeMutableBufferPointer { p2 in - return try body(p1.baseAddress!, p2.baseAddress!) + try t2.withUnsafeMutableBufferPointer { p2 in + try body(p1.baseAddress!, p2.baseAddress!) } } } @@ -55,8 +78,8 @@ public func withPointers(_ t1: T1, _ t /// Call `body(p1, p2)` with the pointers for the two types public func withPointers(_ t1: inout T1, _ t2: T2, body: (UnsafeMutablePointer, UnsafePointer) throws -> R) rethrows -> R where T1.Element == T2.Element { return try t1.withUnsafeMutableBufferPointer { p1 in - return try t2.withUnsafeBufferPointer { p2 in - return try body(p1.baseAddress!, p2.baseAddress!) + try t2.withUnsafeBufferPointer { p2 in + try body(p1.baseAddress!, p2.baseAddress!) } } } @@ -64,8 +87,8 @@ public func withPointers(_ t1: inout T /// Call `body(p1, p2)` with the pointers for the two types public func withPointers(_ t1: inout T1, _ t2: inout T2, body: (UnsafeMutablePointer, UnsafeMutablePointer) throws -> R) rethrows -> R where T1.Element == T2.Element { return try t1.withUnsafeMutableBufferPointer { p1 in - return try t2.withUnsafeMutableBufferPointer { p2 in - return try body(p1.baseAddress!, p2.baseAddress!) + try t2.withUnsafeMutableBufferPointer { p2 in + try body(p1.baseAddress!, p2.baseAddress!) } } } @@ -75,9 +98,37 @@ public func withPointers(_ t1: /// Call `body(p1, p2, p3)` with the pointers for the three types public func withPointers(_ t1: T1, _ t2: T2, _ t3: inout T3, body: (UnsafePointer, UnsafePointer, UnsafeMutablePointer) throws -> R) rethrows -> R where T1.Element == T2.Element, T2.Element == T3.Element { return try t1.withUnsafeBufferPointer { p1 in - return try t2.withUnsafeBufferPointer { p2 in - return try t3.withUnsafeMutableBufferPointer { p3 in - return try body(p1.baseAddress!, p2.baseAddress!, p3.baseAddress!) + try t2.withUnsafeBufferPointer { p2 in + try t3.withUnsafeMutableBufferPointer { p3 in + try body(p1.baseAddress!, p2.baseAddress!, p3.baseAddress!) + } + } + } +} + +/// Invokes the given closure with pointers to the given arguments (3 parameter version). +/// +/// - See: `withUnsafePointer(to:body:)` +@discardableResult +public func withUnsafePointersTo(_ a: inout A, _ b: inout B, _ c: inout C, body: (UnsafePointer, UnsafePointer, UnsafePointer) throws -> Result) rethrows -> Result { + return try withUnsafePointer(to: &a) { (a: UnsafePointer) throws -> Result in + return try withUnsafePointer(to: &b) { (b: UnsafePointer) throws -> Result in + return try withUnsafePointer(to: &c) { (c: UnsafePointer) throws -> Result in + return try body(a, b, c) + } + } + } +} + +/// Invokes the given closure with mutable pointers to the given arguments (3 parameter version). +/// +/// - See: `withUnsafeMutablePointer(to:body:)` +@discardableResult +public func withUnsafeMutablePointersTo(_ a: inout A, _ b: inout B, _ c: inout C, body: (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) throws -> Result) rethrows -> Result { + return try withUnsafeMutablePointer(to: &a) { (a: UnsafeMutablePointer) throws -> Result in + return try withUnsafeMutablePointer(to: &b) { (b: UnsafeMutablePointer) throws -> Result in + return try withUnsafeMutablePointer(to: &c) { (c: UnsafeMutablePointer) throws -> Result in + return try body(a, b, c) } } } diff --git a/Example/Pods/Upsurge/Source/2D/QuadraticType.swift b/Example/Pods/Upsurge/Sources/Upsurge/QuadraticType.swift similarity index 98% rename from Example/Pods/Upsurge/Source/2D/QuadraticType.swift rename to Example/Pods/Upsurge/Sources/Upsurge/QuadraticType.swift index 6940c91..3768f43 100644 --- a/Example/Pods/Upsurge/Source/2D/QuadraticType.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/QuadraticType.swift @@ -27,7 +27,6 @@ public enum QuadraticArrangement { } public protocol QuadraticType: TensorType { - associatedtype Element /// The arrangement of rows and columns var arrangement: QuadraticArrangement { get } diff --git a/Example/Pods/Upsurge/Source/Types/Real.swift b/Example/Pods/Upsurge/Sources/Upsurge/Real.swift similarity index 93% rename from Example/Pods/Upsurge/Source/Types/Real.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Real.swift index b0cfcc5..5e20f9c 100644 --- a/Example/Pods/Upsurge/Source/Types/Real.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/Real.swift @@ -19,7 +19,7 @@ // THE SOFTWARE. /// A real number -public protocol Real: FloatingPoint, ExpressibleByFloatLiteral, ExpressibleByIntegerLiteral, Comparable, CustomStringConvertible, Equatable, Hashable {} +public protocol Real: FloatingPoint, ExpressibleByFloatLiteral, CustomStringConvertible {} extension Double: Real {} extension Float: Real {} diff --git a/Example/Pods/Upsurge/Sources/Upsurge/Sequence.swift b/Example/Pods/Upsurge/Sources/Upsurge/Sequence.swift new file mode 100644 index 0000000..06146bf --- /dev/null +++ b/Example/Pods/Upsurge/Sources/Upsurge/Sequence.swift @@ -0,0 +1,36 @@ +// Copyright © 2015 Venture Media Labs. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +import Foundation + +extension Sequence { + func all(predicate: (Iterator.Element) -> Bool) -> Bool { + for e in self where !predicate(e) { + return false + } + return true + } +} + +internal extension Collection { + func indexIsValid(_ index: Index) -> Bool { + return (startIndex.. + public typealias ElementType = CountableRange - var ranges: [Element] + private var ranges: [ElementType] - var startIndex: [Int] { + public var startIndex: [Int] { return ranges.map { $0.lowerBound } } - var endIndex: [Int] { - return ranges.map { $0.upperBound + 1 } + public var endIndex: [Int] { + return ranges.map { $0.upperBound } } - var count: Int { + public var count: Int { return dimensions.reduce(1, *) } - var rank: Int { + public var rank: Int { return ranges.count } - var dimensions: [Int] { + public var dimensions: [Int] { return ranges.map { $0.count } } - init(ranges: [Element]) { + public init(ranges: [ElementType]) { self.ranges = ranges } - public init(arrayLiteral elements: Element...) { + public init(ranges: [CountableClosedRange]) { + self.ranges = ranges.map({ CountableRange($0) }) + } + + public init(arrayLiteral elements: ElementType...) { self.init(ranges: elements) } - init(base: Span, intervals: [IntervalType]) { + public init(base: Span, intervals: [IntervalType]) { assert(base.contains(intervals)) - var ranges = [Element]() - for i in 0.. Element { - return self.ranges[index] + public subscript(index: Int) -> ElementType { + return ranges[index] } - subscript(range: ClosedRange) -> ArraySlice { - return self.ranges[range] + public subscript(range: ClosedRange) -> ArraySlice { + return ranges[range] } - subscript(range: Range) -> ArraySlice { - return self.ranges[range] + public subscript(range: Range) -> ArraySlice { + return ranges[range] } - func contains(_ other: Span) -> Bool { - for i in 0.. Bool { + return (0.. Bool { + public func contains(_ intervals: [IntervalType]) -> Bool { assert(dimensions.count == intervals.count) for i in 0.. [Int]? { - return incrementIndex(presentIndex.count - 1) + public func next() -> [Int]? { + if presentIndex.isEmpty { + return nil + } + if first { + first = false + return presentIndex + } + if !incrementIndex(presentIndex.count - 1) { + return nil + } + return presentIndex } - func incrementIndex(_ position: Int) -> [Int]? { - if position < 0 || span.count <= position || kill { - return nil - } else if presentIndex[position] < span[position].upperBound { - let result = presentIndex + private func incrementIndex(_ position: Int) -> Bool { + if position < 0 || span.count <= position { + return false + } + + if presentIndex[position] < span[position].upperBound - 1 { presentIndex[position] += 1 - return result } else { - guard let result = incrementIndex(position - 1) else { - kill = true - return presentIndex + if !incrementIndex(position - 1) { + return false } presentIndex[position] = span[position].lowerBound - return result } + + return true } } diff --git a/Example/Pods/Upsurge/Source/ND/Tensor.swift b/Example/Pods/Upsurge/Sources/Upsurge/Tensor.swift similarity index 87% rename from Example/Pods/Upsurge/Source/ND/Tensor.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Tensor.swift index 06179c0..7573b7a 100644 --- a/Example/Pods/Upsurge/Source/ND/Tensor.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/Tensor.swift @@ -45,6 +45,10 @@ open class Tensor: MutableTensorType, Equatable { open var span: Span + open var count: Int { + return span.count + } + public init(dimensions: [Int], elements: M) where M.Element == Element { assert(dimensions.reduce(1, *) == elements.count) self.span = Span(zeroTo: dimensions) @@ -164,7 +168,7 @@ open class Tensor: MutableTensorType, Equatable { extension Tensor { /** Extract a matrix from the tensor. - + - Precondition: All but the last two intervals must be a specific index, not a range. The last interval must either span the full dimension, or the second-last interval count must be 1. */ func asMatrix(_ span: Span) -> TwoDimensionalTensorSlice { @@ -188,40 +192,27 @@ public func swap(_ lhs: Tensor, rhs: Tensor) { // MARK: - Equatable -public func ==(lhs: Tensor, rhs: Tensor) -> Bool { - return lhs.elements == rhs.elements -} +extension Tensor { + public static func == (lhs: Tensor, rhs: Tensor) -> Bool { + return lhs.elements == rhs.elements + } -public func ==(lhs: Tensor, rhs: TensorSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: Tensor, rhs: TensorSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true -} -public func ==(lhs: Tensor, rhs: Matrix) -> Bool { - return lhs.elements == rhs.elements -} + public static func == (lhs: Tensor, rhs: Matrix) -> Bool { + return lhs.elements == rhs.elements + } -public func ==(lhs: Tensor, rhs: MatrixSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: Tensor, rhs: MatrixSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true -} -public func ==(lhs: Tensor, rhs: TwoDimensionalTensorSlice) -> Bool { - assert(lhs.span ≅ rhs.span) - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } + public static func == (lhs: Tensor, rhs: TwoDimensionalTensorSlice) -> Bool { + assert(lhs.span ≅ rhs.span) + return zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } - return true } diff --git a/Example/Pods/Upsurge/Source/ND/TensorSlice.swift b/Example/Pods/Upsurge/Sources/Upsurge/TensorSlice.swift similarity index 83% rename from Example/Pods/Upsurge/Source/ND/TensorSlice.swift rename to Example/Pods/Upsurge/Sources/Upsurge/TensorSlice.swift index f63eef6..e41035c 100644 --- a/Example/Pods/Upsurge/Source/ND/TensorSlice.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/TensorSlice.swift @@ -22,9 +22,13 @@ open class TensorSlice: MutableTensorType, Equatable { public typealias Index = [Int] public typealias Slice = TensorSlice - var base: Tensor + open let base: Tensor - open var span: Span + open let span: Span + + open var count: Int { + return span.count + } open func withUnsafeBufferPointer(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { return try base.withUnsafeBufferPointer(body) @@ -99,11 +103,11 @@ open class TensorSlice: MutableTensorType, Equatable { subscript(span: Span) -> Slice { get { - assert(self.span.contains(span)) + assert(span.contains(span)) return TensorSlice(base: base, span: span) } set { - assert(self.span.contains(span)) + assert(span.contains(span)) assert(span ≅ newValue.span) for (lhsIndex, rhsIndex) in zip(span, newValue.span) { base[lhsIndex] = newValue[rhsIndex] @@ -112,16 +116,10 @@ open class TensorSlice: MutableTensorType, Equatable { } open var isContiguous: Bool { - let onesCount: Int - if let index = dimensions.index(where: { $0 != 1 }) { - onesCount = index - } else { - onesCount = rank - } - - let diff = (0..: MutableTensorType, Equatable { open func indexIsValid(_ indices: [Int]) -> Bool { assert(indices.count == dimensions.count) - for (i, index) in indices.enumerated() { - if index < span[i].lowerBound || span[i].upperBound < index { - return false - } - } - return true + return indices.enumerated().all { (i, index) in self.span[i].contains(index) } } } // MARK: - Equatable public func ==(lhs: L, rhs: R) -> Bool where L.Element == R.Element, L.Element: Equatable { - if !(lhs.span ≅ rhs.span) { - return false - } - - for (lhsIndex, rhsIndex) in zip(lhs.span, rhs.span) { - if lhs[lhsIndex] != rhs[rhsIndex] { - return false - } - } - return true + return lhs.span ≅ rhs.span && zip(lhs.span, rhs.span).all { lhs[$0] == rhs[$1] } } diff --git a/Example/Pods/Upsurge/Source/ND/TensorType.swift b/Example/Pods/Upsurge/Sources/Upsurge/TensorType.swift similarity index 89% rename from Example/Pods/Upsurge/Source/ND/TensorType.swift rename to Example/Pods/Upsurge/Sources/Upsurge/TensorType.swift index 82b6856..ed29fcb 100644 --- a/Example/Pods/Upsurge/Source/ND/TensorType.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/TensorType.swift @@ -24,6 +24,7 @@ public protocol TensorType { /// A description of the dimensions over which the TensorType spans var span: Span { get } + var count: Int { get } subscript(intervals: [IntervalType]) -> Slice { get } subscript(intervals: [Int]) -> Element { get } @@ -41,11 +42,6 @@ public extension TensorType { return span.dimensions } - /// The number of valid element in the memory block, taking into account the step size. - public var count: Int { - return span.count - } - /// The number of dimensions public var rank: Int { return span.rank @@ -63,16 +59,9 @@ public extension TensorType { /// Check that an index falls within the span public func indexIsValid(_ indices: [Int]) -> Bool { - if indices.count != rank { - return false - } - - for (i, index) in indices.enumerated() { - if index < span[i].lowerBound || span[i].upperBound < index { - return false - } + return indices.count == rank && indices.enumerated().all { (i, index) in + self.span[i].contains(index) } - return true } } @@ -92,6 +81,7 @@ public extension MutableTensorType { /// /// - precondition: The available space on `self` is greater than or equal to the number of elements on `lhs` mutating func assignFrom(_ rhs: T) where T.Element == Element { + let count = self.count precondition(rhs.count <= count) withPointers(&self, rhs) { lhsp, rhsp in lhsp.assign(from: UnsafeMutablePointer(mutating: rhsp), count: count) diff --git a/Example/Pods/Upsurge/Source/Operations/Trigonometric.swift b/Example/Pods/Upsurge/Sources/Upsurge/Trigonometric.swift similarity index 97% rename from Example/Pods/Upsurge/Source/Operations/Trigonometric.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Trigonometric.swift index 6fe611b..7566fc9 100644 --- a/Example/Pods/Upsurge/Source/Operations/Trigonometric.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/Trigonometric.swift @@ -114,7 +114,7 @@ func rad2deg(_ x: M) -> ValueArray where M.Element == Dou precondition(x.step == 1, "rad2deg doesn't support step values other than 1") let results = ValueArray(count: x.count) - let divisor = ValueArray(count: x.count, repeatedValue: M_PI / 180.0) + let divisor = ValueArray(count: x.count, repeatedValue: Double.pi / 180.0) withPointer(x) { xp in vvdiv(results.mutablePointer + results.startIndex, xp + x.startIndex, divisor.pointer, [Int32(x.count)]) } @@ -127,7 +127,7 @@ func deg2rad(_ x: M) -> ValueArray where M.Element == Dou precondition(x.step == 1, "deg2rad doesn't support step values other than 1") let results = ValueArray(count: x.count) - let divisor = ValueArray(count: x.count, repeatedValue: 180.0 / M_PI) + let divisor = ValueArray(count: x.count, repeatedValue: 180.0 / Double.pi) withPointer(x) { xp in vvdiv(results.mutablePointer + results.startIndex, xp + x.startIndex, divisor.pointer, [Int32(x.count)]) } @@ -229,7 +229,7 @@ func rad2deg(_ x: M) -> ValueArray where M.Element == Floa precondition(x.step == 1, "rad2deg doesn't support step values other than 1") let results = ValueArray(count: x.count) - let divisor = ValueArray(count: x.count, repeatedValue: Float(M_PI / 180.0)) + let divisor = ValueArray(count: x.count, repeatedValue: Float.pi / 180.0) withPointer(x) { xp in vvdivf(results.mutablePointer + results.startIndex, xp + x.startIndex, divisor.pointer, [Int32(x.count)]) } @@ -242,7 +242,7 @@ func deg2rad(_ x: M) -> ValueArray where M.Element == Floa precondition(x.step == 1, "deg2rad doesn't support step values other than 1") let results = ValueArray(count: x.count) - let divisor = ValueArray(count: x.count, repeatedValue: Float(180.0 / M_PI)) + let divisor = ValueArray(count: x.count, repeatedValue: 180.0 / Float.pi) withPointer(x) { xp in vvdivf(results.mutablePointer + results.startIndex, xp + x.startIndex, divisor.pointer, [Int32(x.count)]) } diff --git a/Example/Pods/Upsurge/Source/Types/Value.swift b/Example/Pods/Upsurge/Sources/Upsurge/Value.swift similarity index 93% rename from Example/Pods/Upsurge/Source/Types/Value.swift rename to Example/Pods/Upsurge/Sources/Upsurge/Value.swift index 6912bf6..2cdf258 100644 --- a/Example/Pods/Upsurge/Source/Types/Value.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/Value.swift @@ -20,7 +20,7 @@ import Foundation -public protocol Value: Comparable, CustomStringConvertible, Equatable, Hashable {} +public protocol Value: Comparable, CustomStringConvertible, Hashable {} extension Double: Value {} extension Float: Value {} diff --git a/Example/Pods/Upsurge/Source/1D/ValueArray.swift b/Example/Pods/Upsurge/Sources/Upsurge/ValueArray.swift similarity index 61% rename from Example/Pods/Upsurge/Source/1D/ValueArray.swift rename to Example/Pods/Upsurge/Sources/Upsurge/ValueArray.swift index f7e0831..74d8a21 100644 --- a/Example/Pods/Upsurge/Source/1D/ValueArray.swift +++ b/Example/Pods/Upsurge/Sources/Upsurge/ValueArray.swift @@ -18,14 +18,21 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. +import Accelerate + /// A `ValueArray` is similar to an `Array` but it's a `class` instead of a `struct` and it has a fixed size. As opposed to an `Array`, assigning a `ValueArray` to a new variable will not create a copy, it only creates a new reference. If any reference is modified all other references will reflect the change. To copy a `ValueArray` you have to explicitly call `copy()`. open class ValueArray: MutableLinearType, ExpressibleByArrayLiteral, CustomStringConvertible, Equatable { public typealias Index = Int + public typealias IndexDistance = Int public typealias Slice = ValueArraySlice - var mutablePointer: UnsafeMutablePointer - open internal(set) var capacity: Int - open var count: Int + convenience required public init() { + self.init(count: 0) + } + + internal(set) var mutablePointer: UnsafeMutablePointer + open internal(set) var capacity: IndexDistance + open internal(set) var count: IndexDistance open var startIndex: Index { return 0 @@ -35,7 +42,7 @@ open class ValueArray: MutableLinearType, ExpressibleByArrayLite return count } - open var step: Index { + open var step: IndexDistance { return 1 } @@ -60,34 +67,34 @@ open class ValueArray: MutableLinearType, ExpressibleByArrayLite } open var pointer: UnsafePointer { - return UnsafePointer(mutablePointer) + return UnsafePointer(mutablePointer) } /// Construct an uninitialized ValueArray with the given capacity - public required init(capacity: Int) { - mutablePointer = UnsafeMutablePointer.allocate(capacity: capacity) + public required init(capacity: IndexDistance) { + mutablePointer = UnsafeMutablePointer.allocate(capacity: capacity) self.capacity = capacity self.count = 0 } /// Construct an uninitialized ValueArray with the given size - public required init(count: Int) { - mutablePointer = UnsafeMutablePointer.allocate(capacity: count) + public required init(count: IndexDistance) { + mutablePointer = UnsafeMutablePointer.allocate(capacity: count) self.capacity = count self.count = count } /// Construct a ValueArray from an array literal public required init(arrayLiteral elements: Element...) { - mutablePointer = UnsafeMutablePointer.allocate(capacity: elements.count) + mutablePointer = UnsafeMutablePointer.allocate(capacity: elements.count) self.capacity = elements.count self.count = elements.count - mutablePointer.initialize(from: elements) + _ = UnsafeMutableBufferPointer(start: mutablePointer, count: count).initialize(from: elements) } /// Construct a ValueArray from contiguous memory public required init(_ values: C) where C.Element == Element { - mutablePointer = UnsafeMutablePointer.allocate(capacity: values.count) + mutablePointer = UnsafeMutablePointer.allocate(capacity: values.count) capacity = values.count count = values.count values.withUnsafeBufferPointer { pointer in @@ -97,19 +104,25 @@ open class ValueArray: MutableLinearType, ExpressibleByArrayLite } } - /// Construct a ValueArray of `count` elements, each initialized to `repeatedValue`. - public required init(count: Int, repeatedValue: Element) { - mutablePointer = UnsafeMutablePointer.allocate(capacity: count) - capacity = count - self.count = count - for i in 0..(_ values: S) where ValueArray.Element == S.Element { + let array = Array(values) + mutablePointer = UnsafeMutablePointer.allocate(capacity: array.count) + capacity = array.count + count = array.count + for (i, value) in zip(array.indices, array) { + mutablePointer[i] = value } } + /// Construct a ValueArray of `count` elements, each initialized to `repeatedValue`. + public required convenience init(count: IndexDistance, repeatedValue: Element) { + self.init(count: count) { repeatedValue } + } + /// Construct a ValueArray of `count` elements, each initialized with `initializer`. - public required init(count: Int, initializer: () -> Element) { - mutablePointer = UnsafeMutablePointer.allocate(capacity: count) + public required init(count: IndexDistance, initializer: () -> Element) { + mutablePointer = UnsafeMutablePointer.allocate(capacity: count) capacity = count self.count = count for i in 0..: MutableLinearType, ExpressibleByArrayLite } deinit { - mutablePointer.deallocate(capacity: capacity) + mutablePointer.deallocate() + } + + public func assign(_ elements: C) where C.Element == Element { + for (i, value) in zip(indices, elements) { + mutablePointer[i] = value + } } open subscript(index: Index) -> Element { get { assert(indexIsValid(index)) - return pointer[index * step] + return pointer[index] } set { assert(indexIsValid(index)) - mutablePointer[index * step] = newValue + mutablePointer[index] = newValue } } @@ -170,36 +189,29 @@ open class ValueArray: MutableLinearType, ExpressibleByArrayLite } } - open func index(after i: Int) -> Int { - return i + 1 - } - - open func formIndex(after i: inout Int) { - i += 1 - } - open func copy() -> ValueArray { let copy = ValueArray(count: capacity) copy.mutablePointer.initialize(from: mutablePointer, count: count) return copy } - open func append(_ value: Element) { + open func append(_ newElement: Element) { precondition(count + 1 <= capacity) - mutablePointer[count] = value + mutablePointer[count] = newElement count += 1 } - open func appendContentsOf(_ values: C) where C.Iterator.Element == Element { - precondition(count + Int(values.count.toIntMax()) <= capacity) + open func append(contentsOf newElements: S) where S.Iterator.Element == Element { + let a = Array(newElements) + precondition(count + a.count <= capacity) let endPointer = mutablePointer + count - endPointer.initialize(from: values) - count += Int(values.count.toIntMax()) + _ = UnsafeMutableBufferPointer(start: endPointer, count: capacity - count).initialize(from: a) + count += a.count } - open func replaceRange(_ subRange: Range, with newElements: C) where C.Iterator.Element == Element { - assert(subRange.lowerBound >= startIndex && subRange.upperBound <= endIndex) - (mutablePointer + subRange.lowerBound).initialize(from: newElements) + open func replaceSubrange(_ subrange: Range, with newElements: C) where C.Iterator.Element == Element { + assert(subrange.lowerBound >= startIndex && subrange.upperBound <= endIndex) + _ = UnsafeMutableBufferPointer(start: mutablePointer + subrange.lowerBound, count: capacity - subrange.lowerBound).initialize(from: newElements) } open func toRowMatrix() -> Matrix { @@ -210,22 +222,33 @@ open class ValueArray: MutableLinearType, ExpressibleByArrayLite return Matrix(rows: count, columns: 1, elements: self) } - open var description: String { - var string = "[" - for v in self { - string += "\(v.description), " - } - if string.distance(from: string.startIndex, to: string.endIndex) > 1 { - let range = string.index(string.endIndex, offsetBy: -2).. Matrix { + precondition(rows*columns == count, "Element count must equal rows*columns") + return Matrix(rows: rows, columns: columns, elements: self) + } + + open func tile(_ m: Int, _ n: Int) -> Matrix { + // Construct a block matrix of size m by n, with a copy of source as each element. + // m: Specifies the number of times to copy along the vertical axis. + // n: Specifies the number of times to copy along the horizontal axis. + precondition(m > 0 && n > 0, "Minimum of 1 repeat in each direction is required") + let results = ValueArray(count: m*n*count) + let typeMemorySize = MemoryLayout.size + let bytesInSource = count*typeMemorySize + for i in 0.. Bool { + return lhs.count == rhs.count && lhs.elementsEqual(rhs) } - open var debugDescription: String { - return description + public static func == (lhs: ValueArray, rhs: Slice) -> Bool { + return lhs.count == rhs.count && lhs.elementsEqual(rhs) } } @@ -236,31 +259,3 @@ public func swap(_ lhs: inout ValueArray, rhs: inout ValueArray) { swap(&lhs.capacity, &rhs.capacity) swap(&lhs.count, &rhs.count) } - -// MARK: - Equatable - -public func ==(lhs: ValueArray, rhs: ValueArray) -> Bool { - if lhs.count != rhs.count { - return false - } - - for i in 0..(lhs: ValueArray, rhs: ValueArraySlice) -> Bool { - if lhs.count != rhs.count { - return false - } - - for (lhsIndex, rhsIndex) in zip(0..: MutableLinearType, CustomStringConvertible, Equatable { public typealias Index = Int + public typealias IndexDistance = Int public typealias Slice = ValueArraySlice + public typealias Base = ValueArray - var base: ValueArray - public var startIndex: Int - public var endIndex: Int - public var step: Int + public let base: Base + public let baseStartIndex: Index + public let baseEndIndex: Index + public let step: IndexDistance + + public var startIndex: Index { + return 0 + } + + public var endIndex: Index { + return (baseEndIndex - baseStartIndex + step - 1) / step + } public var span: Span { - return Span(ranges: [startIndex ... endIndex - 1]) + return Span(ranges: [startIndex ..< endIndex]) } public func withUnsafeBufferPointer(_ body: (UnsafeBufferPointer) throws -> R) rethrows -> R { - return try base.withUnsafeBufferPointer(body) + return try base.withUnsafeBufferPointer { p in + return try body(UnsafeBufferPointer(rebasing: p[baseStartIndex ..< baseEndIndex])) + } } public func withUnsafePointer(_ body: (UnsafePointer) throws -> R) rethrows -> R { - return try base.withUnsafePointer(body) + return try base.withUnsafePointer { p in + return try body(p + baseStartIndex) + } } public func withUnsafeMutableBufferPointer(_ body: (UnsafeMutableBufferPointer) throws -> R) rethrows -> R { - return try base.withUnsafeMutableBufferPointer(body) + return try base.withUnsafeMutableBufferPointer { p in + return try body(UnsafeMutableBufferPointer(rebasing: p[baseStartIndex ..< baseEndIndex])) + } } public func withUnsafeMutablePointer(_ body: (UnsafeMutablePointer) throws -> R) rethrows -> R { - return try base.withUnsafeMutablePointer(body) + return try base.withUnsafeMutablePointer { p in + return try body(p + baseStartIndex) + } } - public init(base: ValueArray, startIndex: Int, endIndex: Int, step: Int) { + public init(base: Base, startIndex: Index, endIndex: Index, step: IndexDistance) { assert(base.startIndex <= startIndex && endIndex <= base.endIndex) self.base = base - self.startIndex = startIndex - self.endIndex = endIndex + self.baseStartIndex = startIndex + self.baseEndIndex = endIndex self.step = step } + public func assign(_ elements: C) where C.Element == Element { + for (i, value) in zip(stride(from: baseStartIndex, to: baseEndIndex, by: step), elements) { + base[i] = value + } + } + public subscript(index: Index) -> Element { get { - assert(indexIsValid(index)) - return base[index * step] + assert(index >= startIndex && index < endIndex) + return base[baseStartIndex + index * step] } set { - assert(indexIsValid(index)) - base[index * step] = newValue + assert(index >= startIndex && index < endIndex) + base[baseStartIndex + index * step] = newValue } } public subscript(intervals: [IntervalType]) -> Slice { get { - assert(self.span.contains(intervals)) + assert(span.contains(intervals)) assert(intervals.count == 1) let start = intervals[0].start ?? startIndex let end = intervals[0].end ?? endIndex return Slice(base: base, startIndex: start, endIndex: end, step: step) } set { - assert(self.span.contains(intervals)) + assert(span.contains(intervals)) assert(intervals.count == 1) let start = intervals[0].start ?? startIndex let end = intervals[0].end ?? endIndex @@ -97,53 +121,15 @@ public struct ValueArraySlice: MutableLinearType, CustomStringCo } } - public func index(after i: Index) -> Index { - return i + 1 - } - - public func formIndex(after i: inout Index) { - i += 1 - } - public var description: String { - var string = "[" - for i in stride(from: startIndex, to: endIndex, by: step) { - string += "\(base[i]), " - } - if string.distance(from: string.startIndex, to: string.endIndex) > 1 { - let range = string.index(string.endIndex, offsetBy: -2)..(lhs: ValueArraySlice, rhs: ValueArray) -> Bool { - if lhs.count != rhs.count { - return false - } - - for (lhsIndex, rhsIndex) in zip(lhs.startIndex..(lhs: ValueArraySlice, rhs: ValueArraySlice) -> Bool { - if lhs.count != rhs.count { - return false - } + // MARK: - Equatable - for (lhsIndex, rhsIndex) in zip(lhs.startIndex.. Bool { + return lhs.count == rhs.count && zip(lhs.indices, rhs.indices).all { + lhs[$0] == rhs[$1] } } - return true } diff --git a/MLKit-PlayGround.playground/Contents.swift b/MLKit-PlayGround.playground/Contents.swift deleted file mode 100644 index ff8403c..0000000 --- a/MLKit-PlayGround.playground/Contents.swift +++ /dev/null @@ -1,357 +0,0 @@ -//: Playground - noun: a place where people can play - -import UIKit -import Upsurge -import MachineLearningKit -/* Already implemented in MachineLearningKit -extension Collection { - /// Return a copy of `self` with its elements shuffled - func shuffle() -> [Iterator.Element] { - var list = Array(self) - list.shuffle() - return list - } -} - -extension MutableCollection where Indices.Iterator.Element == Index { - /// Shuffles the contents of this collection. - mutating func shuffle() { - let c = count - guard c > 1 else { return } - - for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) { - let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount))) - guard d != 0 else { continue } - let i = index(firstUnshuffled, offsetBy: d) - swap(&self[firstUnshuffled], &self[i]) - } - } -} - - -struct InputDataType { - - var data: [(input: [Float], target:[Float])] - - var lengthOfTrainingData: Int { - get { - return data.count - } - } -} - - -class Layer { - - - var layerSize: (rows: Int, columns: Int)? - - public var bias: Matrix? - - public var weights: Matrix? - - public var input: Matrix? - - public var zValues: Matrix? - - public var activationValues: Matrix? - - public var Δw: Matrix? - - public var Δb: Matrix? - - public var activationFnc: Bool = false - - - init(size: (rows: Int, columns: Int)){ - - self.layerSize = size - - self.bias = generateRandomBiases() - - self.weights = generateRandomWeights() - - self.Δb = Matrix([Array(repeating: 0.0, count: (self.bias?.elements.count)!)]) - - self.Δw = Matrix([Array(repeating: 0.0, count: (self.weights?.elements.count)!)]) - } - - public func fncStep(val: Float) -> Float { - return val >= 0 ? 1.0 : 0.0 - } - - - func forward(activation:Matrix) -> Matrix { - - var a = activation - - self.input = activation - - a = (self.weights! * a) - - a = Matrix(rows: a.rows, columns: a.columns, elements: a.elements + self.bias!.elements) - - self.zValues = a - - if activationFnc == true { - a = Matrix(rows: a.rows, columns: a.columns, elements: a.elements.map(fncStep)) - }else{ - a = Matrix(rows: a.rows, columns: a.columns, elements: a.elements.map(fncSigLog)) - } - - - self.activationValues = a - - - return a - } - - - func produceOuputError(cost: Matrix) -> Matrix { - - var z = self.zValues - - z = Matrix(rows: (z?.rows)!, columns: (z?.columns)!, elements:ValueArray(z!.elements.map(derivativeOfSigLog))) - - var sigmaPrime = z - - var Δ = cost * sigmaPrime! - - return Δ - } - - - func propagateError(previousLayerDelta: Matrix, nextLayer: Layer) -> Matrix { - - // Compute the current layers δ value. - var nextLayerWeightTranspose = transpose(nextLayer.weights!) - - var deltaMultipliedBywT = nextLayerWeightTranspose * previousLayerDelta - - var sigmaPrime = Matrix(rows: (self.zValues?.rows)!, columns: (self.zValues?.columns)!, elements: ValueArray(self.zValues!.elements.map(derivativeOfSigLog))) - - var currentLayerDelta = Matrix(rows: deltaMultipliedBywT.rows, columns: deltaMultipliedBywT.columns, elements: ValueArray(deltaMultipliedBywT.elements * sigmaPrime.elements)) - - // Update the current layers weights - var inputTranspose = transpose(self.input!) - - var updatedWeights = currentLayerDelta * inputTranspose - - self.Δw = updatedWeights - - // Update the current layers bias - self.Δb = currentLayerDelta - - return currentLayerDelta - } - - - func updateWeights(miniBatchSize: Int, eta: Float){ - - var learningRate = eta/Float(miniBatchSize) - - var changeInWeights = learningRate * self.Δw! - - var changedBiases = learningRate * self.Δb! - - self.weights = self.weights! - changeInWeights - - self.bias = self.bias! - changedBiases - } - - // TODO: Make private method - func generateRandomBiases() -> Matrix { - - var biasValues: [Float] = [] - - for i in 0..(rows: (layerSize?.columns)!, columns: 1, elements: ValueArray(biasValues)) - } - - func generateRandomWeights() -> Matrix{ - var weightValues: [Float] = [] - - for i in 0..<(layerSize!.rows * layerSize!.columns) { - var weightValue = generateRandomNumber() - - weightValues.append(weightValue) - } - - - return Matrix(rows: layerSize!.columns, columns: layerSize!.rows, elements: ValueArray(weightValues)) - } - - /** - The generateRandomNumber generates a random number (normal distribution using Box-Muller tranform). - - - returns: A random number (normal distribution). - */ - func generateRandomNumber() -> Float{ - let u = Float(arc4random()) / Float(UINT32_MAX) - let v = Float(arc4random()) / Float(UINT32_MAX) - let randomNum = sqrt( -2 * log(u) ) * cos( Float(2) * Float(M_PI) * v ) - - return randomNum - } - - public func fncSigLog(val: Float) -> Float { - return 1.0 / (1.0 + exp(-val)) - } - - public func derivativeOfSigLog(val: Float) -> Float { - return fncSigLog(val: val) * (1.0 - fncSigLog(val: val)) - } - -} - - - - - - - - -// Feed Forward Implementation -class NeuralNetwork { - - public var layers: [Layer] = [] - public var numberOfLayers: Int? - public var networkSize: (inputLayerSize:Int, outputLayerSize:Int)? - - init(size:(Int, Int)){ - - self.networkSize = size - - } - - func addLayer(layer: Layer){ - - self.layers.append(layer) - } - - public func feedforward(input:Matrix) -> Matrix { - - var a = input - - for l in layers { - a = l.forward(activation: a) - } - - return a - } - - - public func SGD(trainingData: InputDataType, epochs: Int, miniBatchSize: Int, eta: Float, testData: InputDataType? = nil){ - - for i in 0..(rows: batch.input.count, columns: 1, elements: batch.input) - var outputMatrix = Matrix(rows: batch.target.count, columns: 1, elements: batch.target) - - self.backpropagate(input: inputMatrix, target: outputMatrix) - } - - for layer in layers { - - layer.updateWeights(miniBatchSize: miniBatch.lengthOfTrainingData, eta: eta) - - } - - } - - public func backpropagate(input: Matrix, target: Matrix){ - - // Feedforward - let feedForwardOutput = feedforward(input: input) - - // Output Error - let outputError = Matrix(rows: feedForwardOutput.rows, columns: feedForwardOutput.columns, elements: feedForwardOutput.elements - target.elements) - - // Output Layer Delta - var delta = layers.last?.produceOuputError(cost: outputError) - - // Set the change in weights and bias for the last layer - self.layers.last?.Δb = delta - - var activationValuesforTheSecondToLastLayer = layers[layers.count-2].activationValues - - self.layers.last?.Δw = delta! * transpose(activationValuesforTheSecondToLastLayer!) - - // Propogate error through each layer (except last) - for i in (0..(rows: 2, columns: 1, elements: [2.0,10.0]) -var trainingData = InputDataType( data: [ ([0.0,0.0], [0.0]), ([1.0,1.0],[1.0]) ] ) -print(nn.weights?[0]) -print("\n") -print(Layer(size: (2,3)).generateRandomWeights()) -*/ - - - -/* -var bias = nn.bias -var weights = nn.weights -var a = Matrix(rows: 2, columns: 1, elements: [1.0,1.0]) - -var b = weights![0] * a -var c = (b + bias![0]) -c.elements.map(nn.fncSigLog) - -//print(c) - - var d = weights![1] * c - var e = (d + bias![1]) - e.elements.map(nn.fncSigLog) - - print(e) - -*/ - -/* -var nn = NeuralNetwork(size: (2,1)) -nn.addLayer(layer: Layer(size: (2,3))) -nn.addLayer(layer: Layer(size: (3,1))) -var trainingData = InputDataType(data: [ ([0.0, 0.0], [0.0]), ([1.0, 1.0], [1.0]), ([1.0, 0.0], [0.0]), ([0.0, 1.0], [0.0])]) -var input1 = Matrix(rows: 2, columns: 1, elements: [0.0,0.0]) -var input2 = Matrix(rows: 2, columns: 1, elements: [0.0,1.0]) -var input3 = Matrix(rows: 2, columns: 1, elements: [1.0,0.0]) -var input4 = Matrix(rows: 2, columns: 1, elements: [1.0,1.0]) -nn.layers[0].activationFnc = false -nn.layers[1].activationFnc = true -nn.SGD(trainingData: trainingData, epochs: 200, miniBatchSize: 3, eta: 0.5) -print(nn.feedforward(input: input1)) -print(nn.feedforward(input: input2)) -print(nn.feedforward(input: input3)) -print(nn.feedforward(input: input4)) -*/ - -*/ diff --git a/MLKit-PlayGround.playground/contents.xcplayground b/MLKit-PlayGround.playground/contents.xcplayground deleted file mode 100644 index 5da2641..0000000 --- a/MLKit-PlayGround.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/MLKit-PlayGround.playground/playground.xcworkspace/contents.xcworkspacedata b/MLKit-PlayGround.playground/playground.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/MLKit-PlayGround.playground/playground.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/MLKit-PlayGround.playground/timeline.xctimeline b/MLKit-PlayGround.playground/timeline.xctimeline deleted file mode 100644 index cb15561..0000000 --- a/MLKit-PlayGround.playground/timeline.xctimeline +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - diff --git a/MLKit/Classes/ANN/Layer.swift b/MLKit/Classes/ANN/Layer.swift index df9ddd8..46a2517 100644 --- a/MLKit/Classes/ANN/Layer.swift +++ b/MLKit/Classes/ANN/Layer.swift @@ -130,9 +130,9 @@ open class Layer { z = Matrix(rows: (z?.rows)!, columns: (z?.columns)!, elements:ValueArray(z!.elements.map((activationType?.derivative())!))) - var sigmaPrime = z + let sigmaPrime = z - var Δ = cost * sigmaPrime! + let Δ = cost * sigmaPrime! return Δ } @@ -147,18 +147,18 @@ open class Layer { public func propagateError(previousLayerDelta: Matrix, nextLayer: Layer) -> Matrix { // Compute the current layers δ value. - var nextLayerWeightTranspose = transpose(nextLayer.weights!) + let nextLayerWeightTranspose = transpose(nextLayer.weights!) - var deltaMultipliedBywT = nextLayerWeightTranspose * previousLayerDelta + let deltaMultipliedBywT = nextLayerWeightTranspose * previousLayerDelta - var sigmaPrime = Matrix(rows: (self.zValues?.rows)!, columns: (self.zValues?.columns)!, elements: ValueArray(self.zValues!.elements.map((activationType?.derivative())!))) + let sigmaPrime = Matrix(rows: (self.zValues?.rows)!, columns: (self.zValues?.columns)!, elements: ValueArray(self.zValues!.elements.map((activationType?.derivative())!))) - var currentLayerDelta = Matrix(rows: deltaMultipliedBywT.rows, columns: deltaMultipliedBywT.columns, elements: ValueArray(deltaMultipliedBywT.elements * sigmaPrime.elements)) + let currentLayerDelta = Matrix(rows: deltaMultipliedBywT.rows, columns: deltaMultipliedBywT.columns, elements: ValueArray(deltaMultipliedBywT.elements * sigmaPrime.elements)) // Update the current layers weights - var inputTranspose = transpose(self.input!) + let inputTranspose = transpose(self.input!) - var updatedWeights = currentLayerDelta * inputTranspose + let updatedWeights = currentLayerDelta * inputTranspose self.Δw = updatedWeights @@ -177,11 +177,11 @@ open class Layer { */ public func updateWeights(miniBatchSize: Int, eta: Float) { - var learningRate = eta/Float(miniBatchSize) + let learningRate = eta/Float(miniBatchSize) - var changeInWeights = learningRate * self.Δw! + let changeInWeights = learningRate * self.Δw! - var changedBiases = learningRate * self.Δb! + let changedBiases = learningRate * self.Δb! self.weights = self.weights! - changeInWeights @@ -193,8 +193,8 @@ open class Layer { var biasValues: [Float] = [] - for i in 0.. Matrix { var weightValues: [Float] = [] - for i in 0..<(layerSize!.numberOfNeurons * layerSize!.outgoingSynapsesForEachNeuron) { - var weightValue = generateRandomNumber() + for _ in 0..<(layerSize!.numberOfNeurons * layerSize!.outgoingSynapsesForEachNeuron) { + let weightValue = generateRandomNumber() weightValues.append(weightValue) } @@ -223,7 +223,7 @@ open class Layer { private func generateRandomNumber() -> Float { let u = Float(arc4random()) / Float(UINT32_MAX) let v = Float(arc4random()) / Float(UINT32_MAX) - let randomNum = sqrt( -2 * log(u) ) * cos( Float(2) * Float(M_PI) * v ) + let randomNum = sqrt( -2 * log(u) ) * cos( Float(2) * Float.pi * v ) return randomNum } diff --git a/MLKit/Classes/ANN/NeuralNetwork.swift b/MLKit/Classes/ANN/NeuralNetwork.swift index 17fa7fb..b2ace2b 100644 --- a/MLKit/Classes/ANN/NeuralNetwork.swift +++ b/MLKit/Classes/ANN/NeuralNetwork.swift @@ -72,14 +72,14 @@ open class NeuralNetwork { */ public func SGD(trainingData: InputDataType, epochs: Int, miniBatchSize: Int, eta: Float, testData: InputDataType? = nil) { - for i in 0..(rows: batch.input.count, columns: 1, elements: batch.input) - var outputMatrix = Matrix(rows: batch.target.count, columns: 1, elements: batch.target) + let inputMatrix = Matrix(rows: batch.input.count, columns: 1, elements: batch.input) + let outputMatrix = Matrix(rows: batch.target.count, columns: 1, elements: batch.target) self.backpropagate(input: inputMatrix, target: outputMatrix) } @@ -132,7 +132,7 @@ open class NeuralNetwork { // Set the change in weights and bias for the last layer self.layers.last?.Δb = delta - var activationValuesforTheSecondToLastLayer = layers[layers.count-2].activationValues + let activationValuesforTheSecondToLastLayer = layers[layers.count-2].activationValues self.layers.last?.Δw = delta! * transpose(activationValuesforTheSecondToLastLayer!) diff --git a/MLKit/Classes/Genetic Algorithms/BiologicalProcessManager.swift b/MLKit/Classes/Genetic Algorithms/BiologicalProcessManager.swift index 12f29cf..5c85b60 100644 --- a/MLKit/Classes/Genetic Algorithms/BiologicalProcessManager.swift +++ b/MLKit/Classes/Genetic Algorithms/BiologicalProcessManager.swift @@ -24,19 +24,19 @@ open class BiologicalProcessManager { */ open static func onePointCrossover(crossoverRate: Float, parentOneGenotype: [Float], parentTwoGenotype: [Float]) -> ([Float], [Float]) { - var randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) + let randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) if randomProbability < crossoverRate { - var pivot: Int = Int(arc4random_uniform(UInt32(parentOneGenotype.count))) + let pivot: Int = Int(arc4random_uniform(UInt32(parentOneGenotype.count))) - var newGenotypeForChild1 = parentOneGenotype[0..(newGenotypeForChild1) + let child1Genotype = Array(newGenotypeForChild1) - var child2Genotype = Array(newGenotypeForChild2) + let child2Genotype = Array(newGenotypeForChild2) return (child1Genotype, child2Genotype) @@ -57,7 +57,7 @@ open class BiologicalProcessManager { */ private static func generateRandomIndexes(genotypeCount: Int) -> (Int, Int) { - var randomIndexOne = Int(arc4random_uniform(UInt32(genotypeCount))) + let randomIndexOne = Int(arc4random_uniform(UInt32(genotypeCount))) var randomIndexTwo = Int(arc4random_uniform(UInt32(genotypeCount))) if randomIndexOne == randomIndexTwo { @@ -87,7 +87,7 @@ open class BiologicalProcessManager { */ open static func bitFlipMutation(mutationRate: Float, genotype:inout [Float]) { - var randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) + let randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) if randomProbability < mutationRate { @@ -111,13 +111,13 @@ open class BiologicalProcessManager { */ open static func swapMutation(mutationRate: Float, genotype:inout [Float]) { - var randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) + let randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) if randomProbability < mutationRate { - var randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) + let randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) - var temp = genotype[randomIdx.0] + let temp = genotype[randomIdx.0] genotype[randomIdx.0] = genotype[randomIdx.1] @@ -135,13 +135,13 @@ open class BiologicalProcessManager { */ open static func insertMutation(mutationRate: Float, genotype:inout [Float]) { - var randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) + let randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) if randomProbability < mutationRate { - var randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) + let randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) - var temp = genotype[randomIdx.1] + let temp = genotype[randomIdx.1] genotype.remove(at: randomIdx.1) @@ -159,18 +159,18 @@ open class BiologicalProcessManager { */ open static func scrambleMutation(mutationRate: Float, genotype:inout [Float]) { - var randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) + let randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) if randomProbability < mutationRate { - var randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) + let randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) if randomIdx.0 > randomIdx.1 { - var subset = genotype[randomIdx.1...randomIdx.0].shuffle() + _ = genotype[randomIdx.1...randomIdx.0].shuffle() } else { - var subset = genotype[randomIdx.0...randomIdx.1].shuffle() + _ = genotype[randomIdx.0...randomIdx.1].shuffle() } } } @@ -184,11 +184,11 @@ open class BiologicalProcessManager { */ open static func inverseMutation(mutationRate: Float, genotype:inout [Float]) { - var randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) + let randomProbability: Float = Float(arc4random()) / Float(UINT32_MAX) if randomProbability < mutationRate { - var randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) + let randomIdx = generateRandomIndexes(genotypeCount: genotype.count - 1) if randomIdx.0 > randomIdx.1 { diff --git a/MLKit/Classes/Genetic Algorithms/Population.swift b/MLKit/Classes/Genetic Algorithms/Population.swift index 331f224..32aec6c 100644 --- a/MLKit/Classes/Genetic Algorithms/Population.swift +++ b/MLKit/Classes/Genetic Algorithms/Population.swift @@ -26,7 +26,7 @@ open class PopulationManager { // Create a "tournament" (an array of randomly selected genomes). for _ in 0.. maxFitness { - maxFitness = genome.fitness as! Float + maxFitness = genome.fitness firstBestGenome = genome indexOfBestGenome = i } diff --git a/MLKit/Classes/Helper Classes & Extensions/Extensions.swift b/MLKit/Classes/Helper Classes & Extensions/Extensions.swift index 1bed855..1741d93 100644 --- a/MLKit/Classes/Helper Classes & Extensions/Extensions.swift +++ b/MLKit/Classes/Helper Classes & Extensions/Extensions.swift @@ -27,10 +27,10 @@ extension MutableCollection where Indices.Iterator.Element == Index { guard c > 1 else { return } for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) { - let d: IndexDistance = numericCast(arc4random_uniform(numericCast(unshuffledCount))) + let d: Int = numericCast(arc4random_uniform(numericCast(unshuffledCount))) guard d != 0 else { continue } let i = index(firstUnshuffled, offsetBy: d) - swap(&self[firstUnshuffled], &self[i]) + self.swapAt(firstUnshuffled, i) } } } diff --git a/MLKit/Classes/K Means Clustering/KMeans.swift b/MLKit/Classes/K Means Clustering/KMeans.swift index 5cf5d4a..975be5f 100644 --- a/MLKit/Classes/K Means Clustering/KMeans.swift +++ b/MLKit/Classes/K Means Clustering/KMeans.swift @@ -76,16 +76,16 @@ open class KMeans { // Obtain the previous clusters comparison = trainingCentroids - for var i in 0.. distance) ? finalDifference:distance diff --git a/MLKit/Classes/Regression/LassoRegression.swift b/MLKit/Classes/Regression/LassoRegression.swift index 8cbd1be..e799bb5 100644 --- a/MLKit/Classes/Regression/LassoRegression.swift +++ b/MLKit/Classes/Regression/LassoRegression.swift @@ -138,10 +138,10 @@ open class LassoRegression { - returns: The cost of your model (a.k.a The Residual Sum of Squares). */ open func RSS(_ features: [Array], observation: Array) throws -> Float { - // Check if the users model has fit to their data - if self.finalWeights == nil { - throw MachineLearningError.modelHasNotBeenFit - } + // KBR: Check if the users model has fit to their data + //if self.finalWeights == nil { + // throw MachineLearningError.modelHasNotBeenFit + //} // First get the predictions let yActual = observation diff --git a/MLKit/Classes/Regression/PolynomialRegression.swift b/MLKit/Classes/Regression/PolynomialRegression.swift index a270fde..8976ee3 100644 --- a/MLKit/Classes/Regression/PolynomialRegression.swift +++ b/MLKit/Classes/Regression/PolynomialRegression.swift @@ -123,11 +123,11 @@ open class PolynomialLinearRegression { - returns: The cost of your model (a.k.a The Residual Sum of Squares). */ open func RSS(_ features: [Array], observation: Array) throws -> Float { - // Check if the users model has fit to their data - if self.finalWeights == nil { - print("You need to have fit a model first before computing the RSS/Cost Function.") - throw MachineLearningError.modelHasNotBeenFit - } + // KBR: Check if the users model has fit to their data + //if self.finalWeights == nil { + // print("You need to have fit a model first before computing the RSS/Cost Function.") + // throw MachineLearningError.modelHasNotBeenFit + //} // First get the predictions let yActual = observation diff --git a/MLKit/Classes/Regression/RidgeRegression.swift b/MLKit/Classes/Regression/RidgeRegression.swift index 69fd085..49f02da 100644 --- a/MLKit/Classes/Regression/RidgeRegression.swift +++ b/MLKit/Classes/Regression/RidgeRegression.swift @@ -125,11 +125,11 @@ open class RidgeRegression { - returns: The cost of your model (a.k.a The Residual Sum of Squares). */ open func RSS(_ features: [Array], observation: Array) throws -> Float { - // Check if the users model has fit to their data - if self.finalWeights == nil { - print("You need to have fit a model first before computing the RSS/Cost Function.") - throw MachineLearningError.modelHasNotBeenFit - } + // KBR: Check if the users model has fit to their data + //if self.finalWeights == nil { + // print("You need to have fit a model first before computing the RSS/Cost Function.") + // throw MachineLearningError.modelHasNotBeenFit + //} // First get the predictions let yActual = observation From b1195be9d9d5297ea7d5ae40389c3b16b84ba89e Mon Sep 17 00:00:00 2001 From: Kelly Roach Date: Tue, 28 Aug 2018 14:15:46 -0700 Subject: [PATCH 2/2] Add AppIcon and LaunchImage to Example app --- Example/MLKit.xcodeproj/project.pbxproj | 18 ++- .../MLKit/Base.lproj/LaunchScreen.storyboard | 67 +++++++++ Example/MLKit/Base.lproj/LaunchScreen.xib | 45 ------ .../AppIcon.appiconset/Contents.json | 135 ++++++++++++++++-- .../AppIcon.appiconset/Icon-40.png | Bin 0 -> 3382 bytes .../AppIcon.appiconset/Icon-40@2x.png | Bin 0 -> 10527 bytes .../AppIcon.appiconset/Icon-40@3x.png | Bin 0 -> 20958 bytes .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 20958 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 0 -> 41437 bytes .../AppIcon.appiconset/Icon-72.png | Bin 0 -> 8901 bytes .../AppIcon.appiconset/Icon-72@2x.png | Bin 0 -> 28631 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 9636 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 31250 bytes .../AppIcon.appiconset/Icon-83.5@2x.png | Bin 0 -> 36309 bytes .../AppIcon.appiconset/Icon-Small-50.png | Bin 0 -> 4856 bytes .../AppIcon.appiconset/Icon-Small-50@2x.png | Bin 0 -> 15419 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 0 -> 2079 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 6185 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 0 -> 12221 bytes .../AppIcon.appiconset/Icon.png | Bin 0 -> 5983 bytes .../AppIcon.appiconset/Icon@2x.png | Bin 0 -> 19287 bytes .../NotificationIcon@2x.png | Bin 0 -> 3382 bytes .../NotificationIcon@3x.png | Bin 0 -> 6556 bytes .../NotificationIcon~ipad.png | Bin 0 -> 1278 bytes .../NotificationIcon~ipad@2x.png | Bin 0 -> 3382 bytes .../AppIcon.appiconset/ios-marketing.png | Bin 0 -> 529219 bytes Example/MLKit/LaunchImage.png | Bin 0 -> 52845 bytes 27 files changed, 198 insertions(+), 67 deletions(-) create mode 100644 Example/MLKit/Base.lproj/LaunchScreen.storyboard delete mode 100644 Example/MLKit/Base.lproj/LaunchScreen.xib create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-72.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad@2x.png create mode 100644 Example/MLKit/Images.xcassets/AppIcon.appiconset/ios-marketing.png create mode 100644 Example/MLKit/LaunchImage.png diff --git a/Example/MLKit.xcodeproj/project.pbxproj b/Example/MLKit.xcodeproj/project.pbxproj index 3d737dc..63c337f 100644 --- a/Example/MLKit.xcodeproj/project.pbxproj +++ b/Example/MLKit.xcodeproj/project.pbxproj @@ -18,13 +18,14 @@ 9A92AE0E1E6DB9A4000DBC84 /* RidgeRegressionSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE0D1E6DB9A4000DBC84 /* RidgeRegressionSpec.swift */; }; 9A92AE101E6DB9B1000DBC84 /* NeuralNetworkSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE0F1E6DB9B1000DBC84 /* NeuralNetworkSpec.swift */; }; 9A92AE141E6DBD9A000DBC84 /* CSVReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A92AE131E6DBD9A000DBC84 /* CSVReader.swift */; }; + E10B1DC72135EE7A0076E94D /* LaunchImage.png in Resources */ = {isa = PBXBuildFile; fileRef = E10B1DC62135EE7A0076E94D /* LaunchImage.png */; }; + E10B1DCA2135EEEF0076E94D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E10B1DC82135EEEE0076E94D /* LaunchScreen.storyboard */; }; E163E7B221352514002310EB /* GameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E79921352514002310EB /* GameViewController.swift */; }; E163E7B521352514002310EB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E163E79E21352514002310EB /* Images.xcassets */; }; E163E7B621352514002310EB /* GameScene.sks in Resources */ = {isa = PBXBuildFile; fileRef = E163E79F21352514002310EB /* GameScene.sks */; }; E163E7B721352514002310EB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E7A021352514002310EB /* AppDelegate.swift */; }; E163E7B821352514002310EB /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E7A121352514002310EB /* GameScene.swift */; }; E163E7B921352514002310EB /* GeneticOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = E163E7A221352514002310EB /* GeneticOperations.swift */; }; - E163E7CA21352561002310EB /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = E163E7C521352561002310EB /* LaunchScreen.xib */; }; E163E7CB21352561002310EB /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E163E7C721352561002310EB /* Main.storyboard */; }; E163E7CC21352561002310EB /* bird.atlas in Resources */ = {isa = PBXBuildFile; fileRef = E163E7C921352561002310EB /* bird.atlas */; }; /* End PBXBuildFile section */ @@ -74,6 +75,8 @@ 9A92AE131E6DBD9A000DBC84 /* CSVReader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSVReader.swift; sourceTree = ""; }; AD54BBE1B07E33FF3F5DD543 /* Pods-MLKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MLKit_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-MLKit_Example/Pods-MLKit_Example.release.xcconfig"; sourceTree = ""; }; BCFC43680C2D8165DD3A9F1E /* MachineLearningKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = MachineLearningKit.podspec; path = ../MachineLearningKit.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + E10B1DC62135EE7A0076E94D /* LaunchImage.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LaunchImage.png; sourceTree = ""; }; + E10B1DC92135EEEE0076E94D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = LaunchScreen.storyboard; sourceTree = ""; }; E163E79921352514002310EB /* GameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameViewController.swift; sourceTree = ""; }; E163E79E21352514002310EB /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; E163E79F21352514002310EB /* GameScene.sks */ = {isa = PBXFileReference; lastKnownFileType = file.sks; path = GameScene.sks; sourceTree = ""; }; @@ -81,7 +84,6 @@ E163E7A121352514002310EB /* GameScene.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameScene.swift; sourceTree = ""; }; E163E7A221352514002310EB /* GeneticOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneticOperations.swift; sourceTree = ""; }; E163E7A321352514002310EB /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E163E7C621352561002310EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = LaunchScreen.xib; sourceTree = ""; }; E163E7C821352561002310EB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Main.storyboard; sourceTree = ""; }; E163E7C921352561002310EB /* bird.atlas */ = {isa = PBXFileReference; lastKnownFileType = folder.skatlas; path = bird.atlas; sourceTree = ""; }; /* End PBXFileReference section */ @@ -178,6 +180,7 @@ E163E7A221352514002310EB /* GeneticOperations.swift */, E163E79E21352514002310EB /* Images.xcassets */, E163E7A321352514002310EB /* Info.plist */, + E10B1DC62135EE7A0076E94D /* LaunchImage.png */, ); path = MLKit; sourceTree = ""; @@ -185,7 +188,7 @@ E163E7C421352561002310EB /* Base.lproj */ = { isa = PBXGroup; children = ( - E163E7C521352561002310EB /* LaunchScreen.xib */, + E10B1DC82135EEEE0076E94D /* LaunchScreen.storyboard */, E163E7C721352561002310EB /* Main.storyboard */, ); path = Base.lproj; @@ -283,8 +286,9 @@ files = ( E163E7CB21352561002310EB /* Main.storyboard in Resources */, E163E7B521352514002310EB /* Images.xcassets in Resources */, + E10B1DC72135EE7A0076E94D /* LaunchImage.png in Resources */, E163E7B621352514002310EB /* GameScene.sks in Resources */, - E163E7CA21352561002310EB /* LaunchScreen.xib in Resources */, + E10B1DCA2135EEEF0076E94D /* LaunchScreen.storyboard in Resources */, E163E7CC21352561002310EB /* bird.atlas in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -416,12 +420,12 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - E163E7C521352561002310EB /* LaunchScreen.xib */ = { + E10B1DC82135EEEE0076E94D /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - E163E7C621352561002310EB /* Base */, + E10B1DC92135EEEE0076E94D /* Base */, ); - name = LaunchScreen.xib; + name = LaunchScreen.storyboard; sourceTree = ""; }; E163E7C721352561002310EB /* Main.storyboard */ = { diff --git a/Example/MLKit/Base.lproj/LaunchScreen.storyboard b/Example/MLKit/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..8ed1290 --- /dev/null +++ b/Example/MLKit/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/MLKit/Base.lproj/LaunchScreen.xib b/Example/MLKit/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 86170b7..0000000 --- a/Example/MLKit/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json index 19882d5..c8477e6 100644 --- a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,53 +1,158 @@ { + "info" : { + "author" : "xcode", + "version" : 1 + }, "images" : [ { - "idiom" : "iphone", - "size" : "20x20", + "filename" : "Icon-40.png", + "size" : "40x40", + "idiom" : "ipad", + "scale" : "1x" + }, + { + "filename" : "Icon-40@2x.png", + "size" : "40x40", + "idiom" : "ipad", "scale" : "2x" }, { + "filename" : "Icon-60@2x.png", + "size" : "60x60", "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" + "scale" : "2x" + }, + { + "filename" : "Icon-72.png", + "size" : "72x72", + "idiom" : "ipad", + "scale" : "1x" + }, + { + "filename" : "Icon-72@2x.png", + "size" : "72x72", + "idiom" : "ipad", + "scale" : "2x" + }, + { + "filename" : "Icon-76.png", + "size" : "76x76", + "idiom" : "ipad", + "scale" : "1x" + }, + { + "filename" : "Icon-76@2x.png", + "size" : "76x76", + "idiom" : "ipad", + "scale" : "2x" + }, + { + "filename" : "Icon-Small-50.png", + "size" : "50x50", + "idiom" : "ipad", + "scale" : "1x" + }, + { + "filename" : "Icon-Small-50@2x.png", + "size" : "50x50", + "idiom" : "ipad", + "scale" : "2x" }, { + "filename" : "Icon-Small.png", + "size" : "29x29", "idiom" : "iphone", + "scale" : "1x" + }, + { + "filename" : "Icon-Small@2x.png", "size" : "29x29", + "idiom" : "iphone", "scale" : "2x" }, { + "filename" : "Icon.png", + "size" : "57x57", "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" + "scale" : "1x" }, { + "filename" : "Icon@2x.png", + "size" : "57x57", "idiom" : "iphone", - "size" : "40x40", "scale" : "2x" }, { + "filename" : "Icon-Small@3x.png", + "size" : "29x29", "idiom" : "iphone", - "size" : "40x40", "scale" : "3x" }, { + "filename" : "Icon-40@3x.png", + "size" : "40x40", "idiom" : "iphone", + "scale" : "3x" + }, + { + "filename" : "Icon-60@3x.png", "size" : "60x60", + "idiom" : "iphone", + "scale" : "3x" + }, + { + "filename" : "Icon-40@2x.png", + "size" : "40x40", + "idiom" : "iphone", + "scale" : "2x" + }, + { + "filename" : "Icon-Small.png", + "size" : "29x29", + "idiom" : "ipad", + "scale" : "1x" + }, + { + "filename" : "Icon-Small@2x.png", + "size" : "29x29", + "idiom" : "ipad", + "scale" : "2x" + }, + { + "filename" : "Icon-83.5@2x.png", + "size" : "83.5x83.5", + "idiom" : "ipad", "scale" : "2x" }, { + "filename" : "NotificationIcon@2x.png", + "size" : "20x20", + "idiom" : "iphone", + "scale" : "2x" + }, + { + "filename" : "NotificationIcon@3x.png", + "size" : "20x20", "idiom" : "iphone", - "size" : "60x60", "scale" : "3x" }, { - "idiom" : "ios-marketing", + "filename" : "NotificationIcon~ipad.png", + "size" : "20x20", + "idiom" : "ipad", + "scale" : "1x" + }, + { + "filename" : "NotificationIcon~ipad@2x.png", + "size" : "20x20", + "idiom" : "ipad", + "scale" : "2x" + }, + { + "filename" : "ios-marketing.png", "size" : "1024x1024", + "idiom" : "ios-marketing", "scale" : "1x" } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } + ] } \ No newline at end of file diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..46d8e1e5e90cf423431e10de0d1edc8f0fdc2d0a GIT binary patch literal 3382 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 M07*qoM6N<$f+Me0J^%m! literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b66baae11a3637ec3167565d2d3ecbc2a540d0 GIT binary patch literal 10527 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 literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2cb5ceeef20138395bc71eadc0c43a12833baa GIT binary patch literal 20958 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 R2|oY;002ovPDHLkV1ni~(y;&l literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2cb5ceeef20138395bc71eadc0c43a12833baa GIT binary patch literal 20958 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 R2|oY;002ovPDHLkV1ni~(y;&l literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c3203e8849be43b278b8a10a0d22783f08c84d04 GIT binary patch literal 41437 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
W7Hlrh(GEtqBy7% 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 N002ovPDHLkV1h=bHY)%C literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-72.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-72.png new file mode 100644 index 0000000000000000000000000000000000000000..dbfad4250542f2b1b471c839e0103dbcc152e983 GIT binary patch literal 8901 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 TK#Ggs00000NkvXXu0mjfR0#kG literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b7647d629610c5d726aecf6258d14fb82e5c2d22 GIT binary patch literal 28631 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ȩ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
3`8*{$h561(ul% zA`Dtk%b!kkcxq7&36mr>KUnjy(*=ejl3Po8yrBT`%8_ zV3Z{=_J~A*R3JkwH%T!F@xj!xY!e^IQhSu+8zu8-*%EjOs}F`wyf8>T;N~Q$3-}VF zmjoBN>3}_K)AuJVbvZN_RsU`O^5?Q;KD^4LSfPEuATj8ME8n0!c=$=0KB}F3^_?Zg z1y0LuV7>nP+Q}o&JILVS;BI86}bU zbUBgR*x+f^R@TE>jjNr0!yJY!{fKwE5>Day`)t1UBwOhKm=sTXJd7AJ?~Nf~T2??Ig!5)9t$v%)dz~<3b(rNOOX6(MKAig1>T$Mb z{^nrgvC;Z2J|jO|Nv+V!t|f2@BZ{b`oBHn{p@(^4*dGy{Zu>*iAK^*)7f0Uq_Njv~ z&r(vqXM2k8ouGoUIV~SzW@RQT+qEAPK^8@EvA=z^)?$c#dbs_sw_o_$Xtjr{EXM37 zbqMb$ZK2wZEkBVje<4_7e-wnF>{DJH-$OJ%A%WCo$fXs~^I?iLlG)h#qDRyTQi8D# z#YzcBL__+b|qT*!OuAIAdW!?wv+?G*pzU!)>G7$BEL zbq9$DKz+T`4lgVupl|dBraO95W$xGSdfywT7PM(Yz~bxnyUY<(2D*16t`HW;=Dbf~ zXJ%;3hue5p#}7vrSx2uU3Oi$QR#6FW;-A0Vh(so$%I=_-&W z2{DyoAK15tc`BBK^QOBM0Vslp|Af0iA{f#2C((=-RsO3vULC>2Ui%N~a8!^i5K3Mw zx({cYfbnR#g}sh20(qIx8yVw)PZJ&y*O5ott}ys%^C6Z_%f?z(%HVRj%h$DuDZUyE z(l|L|ruZJ%HPdHg#)Km!#ZlX{2uVjYVQH+hAPgD0P&9g3l}{D5rtYd?gk%+jCJcI8 z7L>vBMVAlRvSQV3%{|y2Aq!ZjU258{dm#Pq@+RqV&@cS*krfgzx?!{ZC|_|W$R&)^Jy~L#F?^}X@s+X8z&!o7Gkqz@<3cE zI`7!@yNf&5dMOgWsfN4Rk1 zj}helaOZD4UIoE;-_wkus8uD3?-a8I;UY@_Z?7D%c{88MJ7SxRsK5iN-ogF?1!csPb^Vip}d~*H8XY5W9 zp`WvE6}0&#P&>L1KcOGCGMSQbk%?dsK;q89Pd^ijdg{A`(>3&ro66=J=t{%bW(*+| z3#M{8=v`+wC;zU`)rrhaO7s zY{b$l`7?L4DT8a(-aF&AL2SL~8!SxNk}x-nv$c@@nF;7Gt`^-@%f1kzS*;B34qC5E z8y~D4=CeAiSL~M=@u{1`E|Us2h&mhB`RHU84!4TVxdC3y?9ppG%e~zbwV5AVI^8d_ z9k@r+1Kiv$3em|r$B1Gsfx#UJM#u8qOG+tZ6pT7RIy4sUeP-96cx&7oM^X0(8Ner2 zkC^(38D3_?40J*m6zp+GH};1YS$`Ljy*h#k>ItlfUqR*?pd=0RZg|LM=v7hBt17~& z!pKwbJuS_R-QnA&cQxWVk;D_&6IOsBB1GuGSXLzRy@xKb&#X|g<#N{B$-A|JFK<z{M}4+?x!K=+e7N~+cl}y-i@4!4c6Md;+Lg}ck^1y} zt9hh3JymNewt@IV!bUlL4;za$2NHKs+`Q3CY1%cRhlk&TEcnO&l>wIZ#Bg~ah(0W6 z_;yo<8yX)p{Z>!NBWlTE%^lrzjI8^5G{L7U8gA&}!HemOPH-s}s zP2(!FSGF>jnki|69ASz0TGnSpQ^W=ZPOd!CTmAPtFD@5d1!qbFU}vJ>Kv+3cKk&l# z%8qDL#q)bT7_wRS`x=M-&(VuPoGU6@>YsO~x#0)+Ar%!-jz0lMNZez}TbNKvkWa2k zDI3iof|i-+4Lcy16&av`Q7v`$Xs%MQocT25n|Q1f(4Zk7FQxfPX)DNd+~P~U<8`u& zz#Sjny19?|05L|ed+ZwqaN}n1SD6`vQ0@7maVua6qhg0_* zErDOCxJ9k|Op^&HLEvzw%i*YnBqYWM@@VM|+iI6HMY6~mt-OyjTFmNsms&VHil|~g zhV|gq@v224uZU$PZYLEwIY>LmC%+vHSUJH&GcbJD_Y^*QYxpp@i@$Wa{OcZ8{~7>e zPSEF9b2dmOQf!M5NHX}6Wn>Ru%69%__Y$*+XL_4YWt%8qQJmJX)Ugjp_tQ0B_tkPdVSLMoNU}>o zj}TSi0yOxci@t@shYbqw^)OQ$WfA7)T5~os(^wVRguKXDSVni&`gH2$)F1$EDaIjF z_1$*7N|Cttjw^+7_gc8WdA>?tlhSGrYbH>Zi2udqN*WU?;EapA_3jvh^I>9#wV>#a51e)*{(Lo3K?0-$&Jf-;rko-`7~WD{8SJ7S1Uxr+XPNW8C_(_Cuib-?E3P5RYyr zC6JInPg6Y=s7X5fM2wFN5p_jfz@W7o*8UoV=y?zEHWezMG1r;Atg$H01tV|TVC^?KP1ly zQX(ahqC`O`D+q!RkOYJgW-*KL7-M@Fk7vCzckA1o-*?Wv?K@**VDK#E@x6VkyK6aL zol~c(PMzvV;wzNK?_#Jw_9)2ZIKrL5EFL9_MZ{nW&m0;{<M(CA3V%04?S=IrDP4(N~KfsOsE#PKR|v2J5{!fM0=(rE zS%8%amg9+}-oC>3%X=*YCYX?lRICPnolRM!92 zXISZZC^yc=A+;$A0GYtRtH6Z|jNW1q<3V>jCFYxhKCq=>{%Iy?a_*k*EY*YDbKXMB zps%zAgmAfbAn1E!=fOk$JAevgs3mDpdii%z)3IF8IC^sFH z2gTmpG^9e%znd;`q{N{BqjQ-|tZhmn3JbWxjQyP0|7ub|6A-fTWW(kC%@(7bciVA!{G7s{q}<-opB|qqXJ% z6IV<=;e`!`W;+OO6@;{Mv!zswH?T#LFETA4XeqVcz*|0}5$eXDOQd1K4vBM^nlZkj?d>P_Q(N*F;7%c#5>6q5%}!tULw>6G34DW`q=U zVo3mC|Eiy7Vh?}5_<$38QAjA2i6fQ5sj7GEml2VM@4;q~5QB$<0SuvVjKkr}y5sWD zhm4q2GJ@0@?3e?|i2@c6cMpv3EEEA&+7U(9icR~&mD%SO&tev4?GJvlj`>P->*Q`< zUta0xeLK7Mnp0aYXainDMG|8~(33)sQ=f2Oj`cjJQ11)+n9s%wojt^3P8WSLn}sgN zdX18ktk7^AorUx<`F` zW?+Xx#I=}AW?Q&^yQOdJv7sApEe{=A_;k8ezjfgM$wcLT^Nx@4-h`5Mdvo;fvkX!wPJg zZnNKl11|d5%7{^j0i;#zNUNEapc17ofrpqfz^@Q*0v3G1&~<-Uel)*(e^B}`s7^-J zPjnN;SpczH~Gl#M|+)bdD3< zTd z|KqpY3)tjfjU%fCKq5%wN{3`OVlhb%<#D1?k|zUcPc9M>D5lwGl(_8T+5%?Dceu)BqbS?SRE@WDX$F@qHss)m zVLUB?8CC@*8|?uxN{Wc%yeAB;r=tdofKZ+JKG|S((?L7u2pC*U;W(+2E=?v0aGpAz zFQ4X|({}5PWD&KSjh7UP+!0zZ*?aL4CwsB0mFW*m6a=%21X7`dY89ri>8J5lnhvMA zLqQ+-aJIyv{7=&#*GW+EB>%NXEK_--i&mB3gl=mR}C8gnA$VJz@c4B1+r`6I<(dom~oa<6mSYk zg(XU!no7aU2w{5eBFEVWE$oG{!f!;_IEP4k$skLNB;d}GsDMiV9d_7F8czea=Z4w3 z`s;WSGmeFXg>Rfobe1__zH{x`)Ah4A<3PHw^B8UtarbS^r%p&B(V*(oz?g8BFzR) zLJa~TxlD4eNi67?NHjIdNO!f5jQ|W_5XYa78HC2CG=o@9m_kv8&tgo}gs@&m@ndQV zHw!xgdTH&$135YUm-NBJCE6R|-vy`r9CM^eQ$ZM3j^>AP42K&W%sq%?0ZKhN^yRh& zKO!-EI9J;7UAYksk(p*80bLVG=ri2HIF-aY`Bs+^*V?9Atrq#8Pr9%UIOTJ}};rB=lzD zCHTzGjRDLHr(OZ-TS58E_)Jj*$|sL38tn#+>w_{L#@NQf;0C)eI0l*kC(Ne<)=X~k zJWe*LKGWLt|189u#7mr-hU_)RqQY(AFvdJ@By%X4<|Rvc5Cjy&;)iX7SV-glG%r5h zx9_H0KZbSM$I2t>>a6#Lb^?qK{PahAf)Wn$FSJ+i%!7kt@wf>bXZI?pJ(1mqcR!r5yihI?M4Fjx0BWNp` zD0=Bzq*Jl%n@cLh9K;k_NRZNyZ(uex<#c#3Q?Ipvf*i7V!M^Sq8(VRB#3^cY7kHdF z5cad_80C;u+1rC9D?41L)A~Ef0&YQRuFA_;Nso?vb&bhQIV!5Za~$MVDw-TEyKM+d)5W zRpD$@cA#Q=$Bj|{{gv?_6t81?<*CNG7aN}ShoAw*mW?5cwN z1ia7FGCC=Azg9PdZtS)Hrf?Z%s)^;`mFWZw#P@z8Xwn3uQ0Lf}fW7UPl^DQ`O6ki%Gy`(ocF3^0O$+9e*&m1$6&)S{H zE7^!cTF8d`4+I_h#bSaJ%332T4y8Hl+Myc%t_w?SAU~U~aBR=MTpw6sKK)UMxrYRj z=;D-8`!Iy`VwZ4+7$1n-^Q|i0K)xA`Jlif$$MYINi>%sWhhYfY(c@O@o#q@um}S(R zVd1-l@vj#~_j6oJyYa`BlW(+UF$m)o=O=wqS)s+i0HLR(IwjGC>X}tm@s#aL@|IrT zaKOkR!;DfwM8f5mDOLktRE9|$;|0<6xe8}Lyq~nNKV-W*(|2$NG6|n5<4I{gZS=!u zQ9u5*;H|T=($*BX)1-$?hJjdz;V?Nk5kZf{lKHsyT78DI4-WYD9W8`DfdaS+p;`QdNl{I;-*8IxZvfAkI<8DMZ|P&w&AOMqE+AmP`Y?8q2iSDp&o zrTT<*p~ZU}%wZ~;QOcpB4wo*3k?!(Aye`CySVo*mmzYCjWYY@cQ^^9ybkIf7#yM+? ziKu}n&lv|CKgL=z##LC3=*T#w;F8u*AvI4^4Os)*&RrtOPS)M+*|`34a_-*zj_>7m zz8;_Bs53zAD;94b7-S*;e>ne66ZWe;T;6+Md7NWL|Fm-E<<>Vr>Y|Edja8%c^@mLXjFO5{6gumN?LxIMD%%~kJ`;OvEjfYPreNR*+hQUe zgepZNSB43Y`iM#fXDE=9?L{13W4S}aHX?XKwv@@v0aFf^g*6FX^M}tjY?zwK>Dt`M z{Opmw(LJsF^h#VV6b}}M!g}kq#`%fjz>fzH+{s};Vfgpjd7QYR)WEBZ>X3fwDTR>b zvWmS-MI=)d!22q`0N4N%OkNIMtuLT?J-5C$*Yj3yeW#iJ$MiYrfrBY~hw3JI3JIrB49kha)$ztL%k%1`mIyQ`s-8yFyKn3S)rj!ojdL zaRFiYd1P;k$x3o9E;fh5x+Tr}Gu5su9=kWKRT62_PYJsloA0&f@r-aN8f06^{;-0d z9EMG&T62>@6}uW4*3!&n3hqJ%*c~ckBXO9hs963JC-ptSLI=Z`kUh1`P}Z7^TyH83 z9mYGjj+hQP0P>#lE;hrzRJ-uIrBla)#W|P*SLx^x%$NX`bCo#ErY*Sex;R406WG3z z(97s?#f!}aOm$nWH>!HX8jJD4#JTr37KN{=x00E#F#34u`tKBXv11Ik=CC2t99W8B z=&2Pb!v)n2MnZhSf{eR}W{@n7HCG4hY-Sv;2^95S0ki+iMPcrCZ{MC@9JuF>!7+|Y zbn5i6*(D7AJT>{-*%Q@r6tk2q-v`!dftjP_GEkVAqM=F|w=o$=YuiY)$ZFF8Q}w!- zQBQ~pIe-d25mXioK5n5FF5ty7OpX*Q*K>MelI%}Qv(Zpp4iB|KSm$4eYNoeyDYI~m zfk}uzmZnJ_2(e{vWBHQDLm`J3H(2T5_M^4 zGks56F>|(LWqDCrfXSvO_^FqORJ+?~w8&vA08_;bs_cTF0OFV@mLN*z^63pUXnNDA`g6g`skYc9f#7+c(WPONM zG8IQ>#~;h~^*ZWCx>O5s0a2}uxAITyxRH5CvLrJ~AfAnKzq$C{3oB7`)7#FQ3ASimvIF7#vZRI~BS%;bT=(LMb`c?`0Gkb_E}o&@EiGb`t2 z@-c_O+bJLJEXkfHUourb2Ai(7CT#9F?6c|!A23uxeDP<>w|-_CqvD~zwQKPcbaw&e zyk&`kmvPkE984sNu^1`KveWjeF-yEsla*(^HJD=;eLh#r;izJ{kXxw~!huTAUuOMY z))r{}-Z<#PHbn_sTmH*_Z#9Q?3e+V%yakCtMY;eI%x*hi-oOQzp@nQ*6Fj1qsr&($ zgAR|O97+U|4-Fz_6&PnO{LC*VIBjM|AHRzE0JQqb!9Y2v*nuoU3thu_i$n;#vejXG z0OoyzG<#DzpbqLD)M0q#y1qXEvACtXz}96c;N<6}V2tK5ev2w{ZUw>>9T9s9MVbT! zkC<%}DE)?tuq-l}h%l5Lc!#%OYh&n3>2LAX_5chbNEL^@G>Xy%bd+KSgbs%H^9EQ3 zkLcbV9`KfnL|8Bj*^@pj7E=0Wv$r`}Q^RNA=a8`RnU#CQpxo-)yap}CC1IA}Hn`X} zfI$lg1ZCa82qF@kntlQG9RNN-MWU~Z4Hwb|Jy;|$9o94;Ne3Crr$fdNKY+Cl$13z_K~vDgzN2xmMWnVZ>!*Z<{Xo;4JCwv+yc>znKCS| zUVa|qU3y0)VuF`VXiPW~BghSYo>5O`4MNxU^XkcN(cSF_7=#ciF4=6gMHDm!;(`Ed z8E|68k5l6Hcos=*VS{ zWfxg|7Q;m+z-M%j&a*zPZZP{@H4ziS4p{e{ZTL-Byp|fXFIJjHOXgE(((Kt>yoLm literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-76.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..03f4c8ebc08823eb5167c209b2ad06708822facd GIT binary patch literal 9636 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�rRtw8a_^XA`%N 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

@Rl@jeq`x!wbic(cD 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

*F5-0xKXzmn9*lSDh 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 literal 0 HcmV?d00001 diff --git a/Example/MLKit/LaunchImage.png b/Example/MLKit/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..ec436e908b5aa952acdfb091afe6776ada69c092 GIT binary patch literal 52845 zcmY(pWmsH6(=9r9aDoJv;O-I}La?AAxVu|$n*oBmy9aj}+$FdM_rcv|aJanh_nmX^ z-G6p>@9thz-Ceb-*HdB2iqhyPL?{3N09{t*o67t90RVs@_<;Cc%BE0;d$0IdNk}Nm zN=Q&BJ2{wJ*_r_W^l>JJhK#bz^g~8QhK57qObjSa?kb_7kt&8=ecj{TeH4EU`zf+h zb#*rgur~VqaD3VZxK=Z9XjQe-%Uz~7oR7kN| znJSr?sHXdXC4pfCNg6RI8ih_%dja6D2#je2E)3}hQwU7$%;ytK3ODT3@xQR@IM_RA zrgDHKSXrz_#Lz4ZBOSlRVZty5u|}jJ)==VZznMPCp4D!Zg*d-9S;Q9pLUuv1y#9oA zd?GX_B&<<(5B6qudiGQ<0(MQ#1I{nW1?q`@xB~n5s-Mh?EE4Izz)J9{_3(=}<X-_kA$7Qq^?PRFD@iaj;`GGIcOEWA(6eeBUPkK*&Sj zy=Z6VVnpF#XKU{);2});-yQ<*<^MFZQBwT3i;ImgrKW;1g@l8X83hk3H!C}(2nq!S zg^-h}xq!+yssA1RUK6IYba8PMU}JN4cV~6yVs&t`VB_HD=VxQ*WaH#ydGEpE>}l^} z*?2UiziO3MEL{om(*%

l9bAO|JLLcO@qYn@ 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

wU?shvurZk?Hmlp8y6N9HdpplCjRWs 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 literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e1d5cac41ce805401f621e360f46174ef2b416 GIT binary patch literal 2079 zcmV+)2;ldLP)4Tx04R}TU|=dqEGWofVPIg$%_}Jia(7aQh>TKTzr(=Iz{4QKV8tMwm|R@o z7!csYfD?SX#=r=oFYAKLO7r}A)26k2{uVZ`nQ~SoI=Je z3uNa2**eJuMI}J?3?N&#yrclcJ^^Hl6agIwWZwa?(;@5+Aa)X%&BOv$6B6VMWJ>_q z0!a|I28f*wVOxOM$r*_$K(+_SE{GezfYZZ8!Q8-7*O7p`Nd~z&r7$}{p~aJ$7a9z5 z2N26JcrdsyC@`2a7%*5e=rTB#q*j!G6guY@R2F5XXOt*70z)=c!8t#-ptK~lNJqgl zFIi7V!N|bS0Hh8SXAq-52Z2pz6g!U)%U{UAV5!W&z}$lnOPa>Ouze2$gTyI>n94i` z27YS>hHd8x5{nYy4rlzvLWp0SW^4pu^Efduu-^Os|Faqc1N$TfhQAa4|Np({|Np;> zf%XIA>_83xBzI}xjB64P000JFNklK* zSrB5OL>$NoA%TS8ltU!Mi7Q8f#DODlKtdcq9KaGN98g$tAc;gUm?d_?#LmokmY(Tl zy1Kgl_3^65GqHkYA;d3LsjI90@4ff^-}@fp_%i%o7Xr>=B>!hjLjtTjBxA0FibVeXYa& zuJV*1hQKoY!^%glhrxIBEhUwwPn|pK5~KKSVJPnVaYLZI%F+lfL6%ZZ&ex0>1^aHK z4G0%(YVov_Kkcs{#BdPXz>x=-2ENNo#_!g2FD_!CSF{)k&mt;>8wmYi8p!)1WXcUA z?lH`xssr4J2G=n=qgsoix`p}_i*s%Z#vReYO1j5TB6B~-*@M)OhQGA>0c`p~8>Y$OFj|3qS2j#kpOZ-S1CLRBAfBlcx zts+0)gKwELX9lcY9L|pLQ@Z+)R@***r@#GqJ@wu6vDOHkx7xWDNR3``Q82_3w!FqX zcpq6m8C0IwK4UIb+xl?+z(3JSZrNnIz)z^@=O#{nb?~PqcMp$hKk2`D)!g}LbLPOf zH=y$fYb|=&SC(;JQZQZ|LI}oOb`6K#OOAraT!2&?%6)Bc?H91O&Wjg^|9qaeKbyQ;^5cC{+g+*<*@16(L6w;N&69-jH?uTE^cmD*wdRY{SC5*u@ZzZjr1Dy^f3QoWp&l6 z)B_3mmg(cg6%!SXV8?nu=cY#Zq_4Y3{x%){$lYEp_-P-5_ht0peKx#eoBz-U z9~#IP+!7t*?r87pN=-kLf#{TQQa$&(oSupK<0OVfv3Umk0>-n$GKmKg*mGu?}=PwP@^~ANK(6V9; z($`#@dsgSs*{DHh@m8dJi5NTQiSKZxsar6_B(Y{SB0mf$Mf@h@SGvF7m{crMyxT)3 z+oAtVF*nQNU$XY&aVt~QV=UMDikRN?rdvLhM|bQGt&}l^* zWHS_T_uvaz<4bJ*WGnE#-vbu zk6X}o(FqNB(N&*Sr@nvtjmxIS>y;m{ts)Ur6U0&J1X9jGoO`1@G{XEC;S2=psb>doOZzeU<4PLD>MOG@NAhHk!+2Mx=w80-n zL~p5wV;;t-gHl|{9WW{K7K?JpYH4MoDXv!g$?T+@n`}#emQ_m=pjJYhpyLmrpY_gf z7FX*Z`;47H%459l;o;~H+T+W9T!grXrV>ay=mE5|7fk%GtaG6{^PB3>#j4?%Fb<79 zH&X0Qheqb#my*$J6W-JBUBtVQ=mkM-2Th~F1z!u?GBPFgdX(!ltU5C{f^An!I5lNh z1=5=`Z!b$AW}Ee+rXZku=g^xR(iee{nPDvi(n|tlg^4VSKDa&=K zH{qC5#uGTIq)uC!aWn=^tcob3*b) zjYlL5!YO5Nvi_6blUD%NLOwztFo{ZGQbu_Zy}fgeDp*MM`~(yCEw@B?ATGV9hNeVl zdLOM2a7d9nYt$Y9O5aN1wHHY_HSW9KmyzHlV)^B9r2Fmy_%}cGR=5iVJcIxM002ov JPDHLkV1f}Y?7{#5 literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..75ba30934e0af684f648d8a6c1c4b90341a2d02d GIT binary patch literal 6185 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 LNkvXXu0mjf|BD)m literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1185023f99c32f3e29699f88889629f6e1a5006c GIT binary patch literal 5983 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 N002ovPDHLkV1hu?e*pjh literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/Icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bbdaf22cd655067020df0a79e339aabb034544ca GIT binary patch literal 19287 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 KMNUMnLSTYT_@%4> literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..46d8e1e5e90cf423431e10de0d1edc8f0fdc2d0a GIT binary patch literal 3382 zcmV-64axF}P)4Tx04R}TU|=dqEGWofVPIg$%_}Jia(7aQh>TKTzr(=Iz{4QKV8tMwm|R@o z7!csYfD?SX#=r=oFYAKLO7r}A)26k2{uVZ`nQ~SoI=Je z3uNa2**eJuMI}J?3?N&#yrclcJ^^Hl6agIwWZwa?(;@5+Aa)X%&BOv$6B6VMWJ>_q z0!a|I28f*wVOxOM$r*_$K(+_SE{GezfYZZ8!Q8-7*O7p`Nd~z&r7$}{p~aJ$7a9z5 z2N26JcrdsyC@`2a7%*5e=rTB#q*j!G6guY@R2F5XXOt*70z)=c!8t#-ptK~lNJqgl zFIi7V!N|bS0Hh8SXAq-52Z2pz6g!U)%U{UAV5!W&z}$lnOPa>Ouze2$gTyI>n94i` z27YS>hHd8x5{nYy4rlzvLWp0SW^4pu^Efduu-^Os|Faqc1N$TfhQAa4|Np({|Np;> zf%XIA>_83xBzI}xjB64P000YhNkl zC8iOKzqk-%M1uY(M)?DjL?elbBoIlIXkrX88q|Qn2GW2DLXjfHHnfG>PPdu4b7#3T zcl)-p`hIshV+$70A2^xieD{9mJm-Di=Y8JyU}FA?KHg!F88#027(oHi031fRj#Ku3 z0vnBB6M`>W4s(OF)<(nDn5>&*`e^VMmcR-^5upU({~Z|i(Ml_oLBj4E0Pv_aN<~@I zkQvSh0d#|i0Ss(wT-4Sm@eY%&VHj3@MBvOt;3y5KN-?gsYj=$JZ;&p{PM_J0wdRqy z2h|=a-1xJ2`uD2gSx$BsV-$Enif!5}TDHOp4hx@O4H%I6Zp{4D$1}z@IH!p(i6_Vo z6U>o>vdm!cpwU_g?#J>LCm&03R&YMg9t>DPigzir0t zR5o>b5hV>1hbr|D*+TL&gvSgq#w5gCsS$1OF@;&)eJ5PbOE89D$9@-u!`doKI;Ndv z#6zregmtl6i{2X6I_a|~gQP@ZT8;HP;mV6)y+G_dW|(u-4)a|x#@UPsBUrCgoFs^g zojNyQtT#k+zTJF;ZhNipsgZ;jDTPs|W#=wkY3R6vL=jstFdk>-Zj8%-6=a|up?(kR z=c2i{X*f%{#nsjpdIE3%vwgE__u?o*z394-Jz$3K6!}FF9@8zJCa4wNPKtxbnNlti z!jj+&6CqiEP#RsvRtqb-0o-S8pVdGiCE=u_#+4-PxkNcEu>BQm=Hhmx+1oq1Ynk)A zQ7z$kHfsHF)1F&%gZC{QI>xx4O1mp5$M>Iok>>nsN`qfU!$(AG4u@?lcj0nVCBjk( z)h=S0==4#+Zi*lN2B6wP@7L88oi3Q9VCV!5W*F~MgMn)8Zll+Ew0%<9mQUEh&V`w@ z_e^i*vSTLpUt^KHhz9tVpmUXbCKaqeZKM|G!1l#dx0-6P;~ zaC6@kNNFl`fN>LXh--vW2!;#1BN|!MuapGI^-%g63&)9J)zV*N6WE0qMa%U)9qW#X zv9jZhn)3@T9ml~l;mkf<`I2M!HhKx9mbU|iZUtY0;Kb1f3Pm2pD&&Gls9mk%4r-?&;GmU z9#6vCbfME+eJuH>4|-)8uv3GCuKT*LBOrSgGmPel1yK+@EeZTBGFFJR5xh#ASt^j@ zV9V-R7(}3Cd4>|u!iik1X`x$BJpIdfI&ZmqQ8~dHyAH~^OSXQ#bMBL*^yAvj{iIeF z7;+)264}V&+*jI6&oS4ktY}vxZmRcM)%*R)O`NKfmyoqUC8iWXj$*ukcuiX-;RT6r z%nu$6y2}+-4GK?%XOE=KJ9Sw|B^kjM1C?vZ^v$GsAgSjO%NqhNTIbd!0m;glu3lVKV!>g(LU|V z7oyp{x(M9@f@I5x(LXMiaW8y`OrGQ`%c8eGEPRu1`d)R%IPneVmQ=e<-ihUea;9?C z!+zQuF1Y!CBVa6)Qj=}5R?Ucc2?=T9Bo~TZv^;MsL@AV%vtiR(>V3zVVxIeYkQ}mm z%3=gGwbl88tj($LIEyAoPRuvACw3>#4h1o=&q*~D;%mI}wK#Z1HFH7kj4N`OaUlnY zGh<0&f%a#rm8BF^AqYv=qi1ZsLUoMI1on%GdBB}~baLO4jM`CnpBc%8TrV|m;lT|i zn54lLuhO96JnXxvdL*yVUH&sVqRmCnSF;L`Eyw)3mzR?WD5Cx5j#Nw8j_w*l3 z6QL%m1i-6fjrq?z#qV#~{p8Zg-;l&mBFBcZqIrs<)UK~QT)k~srGBc0vAYfVFUp2T7!<@Ml$@ZQkP>CoFr`OSm*NDJ zu^;0M6~<-2S>R!if2pnq!615BOCY^g;=Ixa@M76^11WD1xlr38Ju?72cygSgAhlcjQ8ZSIDe+0Ke1+qXK(7Q!j`PBr6YU2V4-hzd-n` z&;psEOS*vK3FN_gI82wByzR15{;0=ii)5%e5SCn23QnrdO{CcGp!>_A>DM~1DKxWn z6PaE}FE0H$zvsE3yKdz<1LWvmWZ>0HhHoHe6OgpbY!V?gW0DEuIS7YHGs|`$!SY_< z`AODD;Ct-RQ@k~%YzJCSD0(31TKSrQa?OdZilTwG`kbmPcUn)@kG(Bh7_9137(lLc z^#*>14TmyaEgLAAH2$>ia-<6sAW+#@&`FIEFQleJ)Pjh%Q~#(;U{6r`O^RJeSA2VHE61vEaGkzk!)SCVT3cx?h#5OAC}1KKJYvZDB)vA|gplm;Ql__l;L zNsUVT)BezJah+Mtu(CR7biD~ikb6>h-vLiS`abhvNWe=hXkmFghpnQwC`Hbgq%>K3Ia=Shd z7*=H1&?=FJjG?0Lrz5Lc9h6O|eMMuzMHsG4qQ_(2`rXLwhvJ17lI0iNPV5rm`oy;0 zkGFyS!NBlZAKMtX1vF$NC7)xl>(D&5;gd}2lmdU>TblfAZOfm|oqOF{#l;GNoXHH$ zzQ5Y|z!+~Vf?%f{#ip= z!4IesRG6%VSnq`3DD9qZhsd>Xt%QB=KWBOm)Rm7P>gx5^p@WBbgYzy&1$YoUS|G(- zb|83X!xQW4uJ)fXl}HNY%sRgh8S65;Ap+S1kbp#)KL0l@y84d)2Jk)#LfLg>761SM M07*qoM6N<$f+Me0J^%m! literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f5e6caeb274acd311a383dd8d449614e4bf93f5 GIT binary patch literal 6556 zcmV;N8Dr*&P)4Tx04R}TU|=dqEGWofVPIg$%_}Jia(7aQh>TKTzr(=Iz{4QKV8tMwm|R@o z7!csYfD?SX#=r=oFYAKLO7r}A)26k2{uVZ`nQ~SoI=Je z3uNa2**eJuMI}J?3?N&#yrclcJ^^Hl6agIwWZwa?(;@5+Aa)X%&BOv$6B6VMWJ>_q z0!a|I28f*wVOxOM$r*_$K(+_SE{GezfYZZ8!Q8-7*O7p`Nd~z&r7$}{p~aJ$7a9z5 z2N26JcrdsyC@`2a7%*5e=rTB#q*j!G6guY@R2F5XXOt*70z)=c!8t#-ptK~lNJqgl zFIi7V!N|bS0Hh8SXAq-52Z2pz6g!U)%U{UAV5!W&z}$lnOPa>Ouze2$gTyI>n94i` z27YS>hHd8x5{nYy4rlzvLWp0SW^4pu^Efduu-^Os|Faqc1N$TfhQAa4|Np({|Np;> zf%XIA>_83xBzI}xjB64P000-;NklvwLw;?V0n&BG7r!=uEl`So z$7uZj2-*+`&cd+&&S+Mg%gx@N`jZmc>rMX;KpUXRXJRa$vWE#zPTdfq@#ji6%Fcq_ zd$)%=AId(Ulrn(EfOe2yA?RFkfTFYojlprnOs7Sauf)pE_R+SR0uClPvCHeNq}SV6 zpt#j`D4%eMIO+Xjd;V%9y#g0gNo9;Sm<*C(n3ZBiVshx1869jNZL+K+>2_W@PU9(^ z5+ST8u|`67)qFrs~(z9`Tu`-_3B_>7SfpbLt;jt!n5 z$!^}|khB3F{A_gqu#D6?kpn6FeC5*D`a?fVXFnY6(S&>43f#(@5NUL#b*8dJsS#4h zh@7Eut{0fd_IY9IaT+d$v2r!USEi~&MLOq^;+x38cl2z;G&3B6Q9Vg(?13hk45Q>a zHt^ep5lqjt31u1zo-rw@$%wW)WhJ1gQkzU+!K4qWrKZR%=-d$h7oe>a?T(wwp5cOWmK!3p+rEOv4Y|bWU(dY%?wt5qc!&$*!myPK zB%9P>iVj4triBsi?N&==;Sxs>CJ3}N7qQ(GV^$IOGEr@)1CHOf_4DSUn6JHiUhHbcU(Fjs|;3C&Kn~?lO^Cq1lzARW*MD87yn|-DGk) z>5w=z8GIfb1|tHdN*~mVm(X%qQ=!fIrgYN8({Rd!3^Bh6v(05}#dAhGN78mOWl@Dm zIh4QAUvH~)U(|rRY7vRSC|np;h1dYiF=WUI*6_k^(hjMHRzeZDF`1H380g@3T3JsD zyH)dW)*?|>kInn4TOsE!B}W!$Mume{W>o}PTtR9lbaIl!Gc2{*O=*=l2T3>ggB0%m z%yuqlP2hEu5>odQ_qK%tzHt6MdTOk1a62!C)SQsrRuq~f>o+3c?w}ES`C=FQ3YV-D zL?gB6(4@rqm7*WG@6mISPHC!4tNX$7MStCQu`>GpnYnwCrQG-sFUS+J@qV%Co8;t- z2_b*HH9(xi=!hr>W(@nZI@kklZ_fs8#cX#RQDBQxi+KC64o6s7`r;6aJ)(!CvmtR* z=w8Q1-c#AMBW?U)^RckNi04?_PUVnvU**=0(J0{FQ?j#AaNMi&H# zj!IfO?c@Gxzw|KgFyDnXG}CCdwYa83ZXLdIgI}!~zL>;))a}>8iL=!SzpekuKdEfl z#><~-?Vg}rm?L5Y%!717(v7CN4Pf~E-0qs|kGr*}bek!&jaDW}w9j<5@d~Dx*GY+p zI&qHE1PI}#`iMJAQ|mqL5-jMRq^;4w^Ml3U<~&l4NH#&Eaj&#sRLOCL=1@`!b;hC+ zd92-ixG}Y%Q2pZk?#N}YOi;V-_>nj5;JtFDL!`n0_#x zfAGXlNZ=M(>D|uw2l&SOW(c+dlJtP-iDFzN@tr}wsP6A5@A6XVN2F+EZCtrZ> zA;xCuQSF>hN{3B&#B_b;2+o@_4JhaglXiu0WN=G--XyoqJ_-H4Cz(30K6-s+?RUfD zKaWoQK)EL;z<$^R;cS1Q^fDb3u&-I^%3}YUOY8oUJo3-+K~fH=?{*ozEjsdEf8%TD zswEZ1T4h{Ms`ixff0wPE(#Zp|3D0P)9+T!ejq9l-wqtBRvazb?!z= zWyD~ETms#+%Z5iIo*?vd^5yFY6P zgc}2o52@zZPhqy|foE8f^{n5>CfD+kLwG_>jd_!#S!PfScs>(~eFr<#k=TIiHgmu3uXP5;Iqalbu7)oDQ8g#js zj@loed2Ca$cB!B-V@FB1Ewt`NzV>>)FuFY~)+hd($Y{Et{idwp_z8L zGxXUGFYE*sF}5DxaN~dsgXL{YYc(ixH%%%M)2AMys-az@Mn&NejlkTA%dvCN^Cer6GRG;s0&2- z*7{3dN%~cic4Y!#_cQ+p1%&`B;`t`RUf3i}Mp=MevTB5EO6#)l-!ZcNUbFBI?cF<^ zj#CW!+~AR9;RZH@^aP88g)4X_&!LV3aejaCP=z~}mjIUfCX5yzwgmhvxaiQT2rYI2G)!Gk6St40z z)Sz~eN@0HxP_7F`4vF-Bw?zhOwCs-s)t{wvpJ?xzP~98&AO`1}W{{YGo`Jn$Gu5Js z0r2s3>Bq@TQ>U9~fN>xJ>n(all}ozkr}K4ywJCVmbTtVkREH})CMs3!eR6t7O7)22 zZ=~hJX={_$e?)eOldrz#@N-E(?-lj z?hGgXth6mseUGYk1Mgb8ZMo~l(!i=h`E7@O@B|BwmaRTtVE6zP3kK$tgI?B-<%kFi z%9&l3IZ|IptI&-B>VwvSE&Z^2;_i5Anq@ZxqsW}r(_p7*H6SJIDLf$d2V)uQo{}`K zNybunDXE;tE8os0;rw|l*F^k%!T2rJ&0Q(?r%fqAsMNpoUvZhJ{~(zL$1qY=6#KpM zrYV}<799>No+%eVJCNYqAcml^6Ew+*N^XA35fQqAEy(H4)n@R|-LVhJ&ZA~Y3AN3w zcs}x<)2PYW!7Ef5`aNvaz1W<)IYC5<>#XVDGVf0???v6 zm3vFy_-LuVGhMnPn#5$oj=R~dE=CEBGvnw$^P7rekELx}P8g`NVu`~*wM3o)6UokT zc{%s6N`o*iO)9tRAYfuA>13RA1nGB!t{_NJA>**qn(MT$DGb+Le~)Qpuq5~#;09(a zIL%Bqyi}K8;SPMdvuBnia5YE6@L(u6 ziP58~yCihxi|K;quIpMC1b@alRQ&=Mo4Kv{jGQpN(@xyOt@VD{o?z)LPY0aRpa@Fb zoh3i*5&cl@{5cs-WZ{*;&{5s(5=3|GgUzvZ7!Rl7&4sm}Zta>PQPnGM7xgen z?pvC`Y=H5}#;&khUprZ!}|{>^YbKoM9tqGPrj3mUYnN9Lc?!HH?h@wy9*=Kds}H^ zU!lB{wP%t0x{fFY>uReGdXiO3){}T1aN{|`%D7Xx)*ZYvIu6(IUqjb?ymG-dR)+gR zr3TIdEUieLHdQv_WRyY*Zb zF~oO%ku5EDJ8uyqHj|e*H1j+^wiPGq zUa_AQ>Ruy;z8#;-^O-$Ky4Yp7N>HzIs)nkUM1|_XIz@MyJN?6_!RAev;zX@?;JFO zl80$?T4q=9zG1@`5G7~=he%=QryOez^9<0v)#SLbt#BGc#znl>&>Z1X0cVa7g5b>| zRMgfmNleLv3jgl-qq98wjyl<`xU2x@02IriY7;HZngkJ^Y9~!%p1?CkSNkJyK|hq! zp!qh<#=MvhssPrg$&!qBq;uCf!>{%RzLXs~&JtT%JG-3$+HN@-l*DrGIcNx}rl=u9 zVo(x}9GJp=f(as?MYckk4F;uG)Ym*BTMvp)~@w3-imw@H1VxgZkB~lja|IatL>Ougj>W5b?SXcY0I+=8C zZSG47PK<;Oga!;ilP75h$e6I)%lbhrFvua*PC2&^;WL-j<1}L2fwbRq)&q=$(~z7z zfdHYZyhT)Ddb1aN@H>o&qcE(q0NEx2d|v`r+K zA=WwK7z4FWr16q*#X?hbXb@OA_AD|7eMVVqdEpo^7dEav!P-(9Ss>{Kg78fnV0L!1 zP$Z=RVhD?t2uoroqM_Hw{->>175Trv|P+^MB1R( z4mS#N2E-^*n%Ty9gZ%5dYj3P?cz=ESh(gjSZDO_jqJ8<d&Z;8am3nMU{3GGb@$ZJx^zPvKp;>EXsg zab7`4%Scoxq2GwOIDlFrX&-eW6m$t{3$&`mUehcRXBGGVO&;IJLL!{|lG)$)x0cjQ zSLWoH!J%n{y_zQb(?z6$I8(Wb)?ez@kDJz4n}?Qo6G4=C2DJxPE!xW9+3fUO@3DgQ z%x{Yuf7|*4bR36Tf`pq$ai38QgOY<+Gz@yVn)*1agko$I!Beu`VlhSOl8WP5j5u`( zt=^w4!4|+A>zWT~zAssnSqi^&tr!47_|NqClo++ZMtO{y6AHcrqM zv+fuTQiGI-^f~T98rcJ8oWRUC>#&Idg}!yOtJ^J7D@l zB1ZAoN~`B~pz2XdS|OQlyulekR)&+5Cex!qWhZI>)GTH2{75fgp!oDcj|F<#=AIG7 z^HC2B0C`(ik`D`iqRqjySyH82N}KOh3r`p`ju4sC95@#AgOkG%u>x0#`K!vq9~^rb z7W}u9k9@ANuT%ACV2>MC;O5Nam%;6=;dz2Sg&W{ew1z|s&hfKDQR5*p-*KcZq=F6R z|5E~dlb~V&Dv^@9Dcn3b4vBV>=ttp+PJyygfaqhT3zfs?Su~-C@@d!SsUD}^#=awf zr4p4KmfC~l3`Zn5*|2K%W$YgrkBXn!n^8QuO3=|M>usmpJT)Q1XUXZc55Un z{Z9@4%WhsMXhbzcS3t+rx`><}pfF?w2Cyp)ArM*2Vu#E%4Nm2t467=1xSy5_IpSyV z3@dLw*Z1>RkLA&*jZ$bp>Eve&ySZovd$o+pUUSS)7!)_G!$AcCd>U_At$5+>MS#YnKn6?dLF{4Z=_j7| ze#N(?!q^sc>-ERlUKC;sEQE}tDD-B0f!7|yXMGu<^Mej_c+qfsll%{Xyp)MpD1N#C O00004Tx04R}TU|=dqEGWofVPIg$%_}Jia(7aQh>TKTzr(=Iz{4QKV8tMwm|R@o z7!csYfD?SX#=r=oFYAKLO7r}A)26k2{uVZ`nQ~SoI=Je z3uNa2**eJuMI}J?3?N&#yrclcJ^^Hl6agIwWZwa?(;@5+Aa)X%&BOv$6B6VMWJ>_q z0!a|I28f*wVOxOM$r*_$K(+_SE{GezfYZZ8!Q8-7*O7p`Nd~z&r7$}{p~aJ$7a9z5 z2N26JcrdsyC@`2a7%*5e=rTB#q*j!G6guY@R2F5XXOt*70z)=c!8t#-ptK~lNJqgl zFIi7V!N|bS0Hh8SXAq-52Z2pz6g!U)%U{UAV5!W&z}$lnOPa>Ouze2$gTyI>n94i` z27YS>hHd8x5{nYy4rlzvLWp0SW^4pu^Efduu-^Os|Faqc1N$TfhQAa4|Np({|Np;> zf%XIA>_83xBzI}xjB64P0009$Nkl2V!klvtEzK_H<9bsBtzS ziIf9%n3-1hH{VxPUp2D01^+W5K!iAmiFh24wqpp02#7I8aGr6tT7ZnvBaV5)9t5v` z*@9RIg?6VFqSt`3(4X7S%+Zszq;F-y$)$Y4Apsv?wpK?YbKn)?hlz}fJeNv3~Py@ zC59GExn&KMrrw4bR`vO6^R*d2y+}W?Pe-k%^aW83cq~X&PW11kc zV?G}h_*K~dr=Gvd1``?foxbMEjUY%p$!7Fo#y(^DxXUlvzuqxL&mwqR%=BgrP@DIC z|BkQaT)*my>wUhZv_~>Y8&pCxso3rqo+K~F?iz~DqB%Rw&gg=u7Mb|GDEEf>cXB?6 z@{O!7IX@7Q#1gpeGbYkt0Ea)X`5$o)YW-2Yv6U~b=k};eD2r#UOl16)&o`Vu9n|k> zGb67Zf{_`p1DAwMRp4KA-3z$4lLb}U_v-Z!`oUHrALH+4lIJ!x+1T zbrBMcepgWE;-~ZB*Sj}`G`|(~)ojma37}O>{u*nD5`edo?@v|mF87!tuL4!eCR2lv?F@q5bBJ z{Z!uBQC(!&L(H_GApXL_3uGT;e@a6>KUH!e1r2A(!zhc5L`YNGrNf7Vu>!Ua;-91Q z+A!x+}4Ps4|{ex3S({3=aoN o_XQ1Xd$BwwA_NljC~kH5Uk4Tx04R}TU|=dqEGWofVPIg$%_}Jia(7aQh>TKTzr(=Iz{4QKV8tMwm|R@o z7!csYfD?SX#=r=oFYAKLO7r}A)26k2{uVZ`nQ~SoI=Je z3uNa2**eJuMI}J?3?N&#yrclcJ^^Hl6agIwWZwa?(;@5+Aa)X%&BOv$6B6VMWJ>_q z0!a|I28f*wVOxOM$r*_$K(+_SE{GezfYZZ8!Q8-7*O7p`Nd~z&r7$}{p~aJ$7a9z5 z2N26JcrdsyC@`2a7%*5e=rTB#q*j!G6guY@R2F5XXOt*70z)=c!8t#-ptK~lNJqgl zFIi7V!N|bS0Hh8SXAq-52Z2pz6g!U)%U{UAV5!W&z}$lnOPa>Ouze2$gTyI>n94i` z27YS>hHd8x5{nYy4rlzvLWp0SW^4pu^Efduu-^Os|Faqc1N$TfhQAa4|Np({|Np;> zf%XIA>_83xBzI}xjB64P000YhNkl zC8iOKzqk-%M1uY(M)?DjL?elbBoIlIXkrX88q|Qn2GW2DLXjfHHnfG>PPdu4b7#3T zcl)-p`hIshV+$70A2^xieD{9mJm-Di=Y8JyU}FA?KHg!F88#027(oHi031fRj#Ku3 z0vnBB6M`>W4s(OF)<(nDn5>&*`e^VMmcR-^5upU({~Z|i(Ml_oLBj4E0Pv_aN<~@I zkQvSh0d#|i0Ss(wT-4Sm@eY%&VHj3@MBvOt;3y5KN-?gsYj=$JZ;&p{PM_J0wdRqy z2h|=a-1xJ2`uD2gSx$BsV-$Enif!5}TDHOp4hx@O4H%I6Zp{4D$1}z@IH!p(i6_Vo z6U>o>vdm!cpwU_g?#J>LCm&03R&YMg9t>DPigzir0t zR5o>b5hV>1hbr|D*+TL&gvSgq#w5gCsS$1OF@;&)eJ5PbOE89D$9@-u!`doKI;Ndv z#6zregmtl6i{2X6I_a|~gQP@ZT8;HP;mV6)y+G_dW|(u-4)a|x#@UPsBUrCgoFs^g zojNyQtT#k+zTJF;ZhNipsgZ;jDTPs|W#=wkY3R6vL=jstFdk>-Zj8%-6=a|up?(kR z=c2i{X*f%{#nsjpdIE3%vwgE__u?o*z394-Jz$3K6!}FF9@8zJCa4wNPKtxbnNlti z!jj+&6CqiEP#RsvRtqb-0o-S8pVdGiCE=u_#+4-PxkNcEu>BQm=Hhmx+1oq1Ynk)A zQ7z$kHfsHF)1F&%gZC{QI>xx4O1mp5$M>Iok>>nsN`qfU!$(AG4u@?lcj0nVCBjk( z)h=S0==4#+Zi*lN2B6wP@7L88oi3Q9VCV!5W*F~MgMn)8Zll+Ew0%<9mQUEh&V`w@ z_e^i*vSTLpUt^KHhz9tVpmUXbCKaqeZKM|G!1l#dx0-6P;~ zaC6@kNNFl`fN>LXh--vW2!;#1BN|!MuapGI^-%g63&)9J)zV*N6WE0qMa%U)9qW#X zv9jZhn)3@T9ml~l;mkf<`I2M!HhKx9mbU|iZUtY0;Kb1f3Pm2pD&&Gls9mk%4r-?&;GmU z9#6vCbfME+eJuH>4|-)8uv3GCuKT*LBOrSgGmPel1yK+@EeZTBGFFJR5xh#ASt^j@ zV9V-R7(}3Cd4>|u!iik1X`x$BJpIdfI&ZmqQ8~dHyAH~^OSXQ#bMBL*^yAvj{iIeF z7;+)264}V&+*jI6&oS4ktY}vxZmRcM)%*R)O`NKfmyoqUC8iWXj$*ukcuiX-;RT6r z%nu$6y2}+-4GK?%XOE=KJ9Sw|B^kjM1C?vZ^v$GsAgSjO%NqhNTIbd!0m;glu3lVKV!>g(LU|V z7oyp{x(M9@f@I5x(LXMiaW8y`OrGQ`%c8eGEPRu1`d)R%IPneVmQ=e<-ihUea;9?C z!+zQuF1Y!CBVa6)Qj=}5R?Ucc2?=T9Bo~TZv^;MsL@AV%vtiR(>V3zVVxIeYkQ}mm z%3=gGwbl88tj($LIEyAoPRuvACw3>#4h1o=&q*~D;%mI}wK#Z1HFH7kj4N`OaUlnY zGh<0&f%a#rm8BF^AqYv=qi1ZsLUoMI1on%GdBB}~baLO4jM`CnpBc%8TrV|m;lT|i zn54lLuhO96JnXxvdL*yVUH&sVqRmCnSF;L`Eyw)3mzR?WD5Cx5j#Nw8j_w*l3 z6QL%m1i-6fjrq?z#qV#~{p8Zg-;l&mBFBcZqIrs<)UK~QT)k~srGBc0vAYfVFUp2T7!<@Ml$@ZQkP>CoFr`OSm*NDJ zu^;0M6~<-2S>R!if2pnq!615BOCY^g;=Ixa@M76^11WD1xlr38Ju?72cygSgAhlcjQ8ZSIDe+0Ke1+qXK(7Q!j`PBr6YU2V4-hzd-n` z&;psEOS*vK3FN_gI82wByzR15{;0=ii)5%e5SCn23QnrdO{CcGp!>_A>DM~1DKxWn z6PaE}FE0H$zvsE3yKdz<1LWvmWZ>0HhHoHe6OgpbY!V?gW0DEuIS7YHGs|`$!SY_< z`AODD;Ct-RQ@k~%YzJCSD0(31TKSrQa?OdZilTwG`kbmPcUn)@kG(Bh7_9137(lLc z^#*>14TmyaEgLAAH2$>ia-<6sAW+#@&`FIEFQleJ)Pjh%Q~#(;U{6r`O^RJeSA2VHE61vEaGkzk!)SCVT3cx?h#5OAC}1KKJYvZDB)vA|gplm;Ql__l;L zNsUVT)BezJah+Mtu(CR7biD~ikb6>h-vLiS`abhvNWe=hXkmFghpnQwC`Hbgq%>K3Ia=Shd z7*=H1&?=FJjG?0Lrz5Lc9h6O|eMMuzMHsG4qQ_(2`rXLwhvJ17lI0iNPV5rm`oy;0 zkGFyS!NBlZAKMtX1vF$NC7)xl>(D&5;gd}2lmdU>TblfAZOfm|oqOF{#l;GNoXHH$ zzQ5Y|z!+~Vf?%f{#ip= z!4IesRG6%VSnq`3DD9qZhsd>Xt%QB=KWBOm)Rm7P>gx5^p@WBbgYzy&1$YoUS|G(- zb|83X!xQW4uJ)fXl}HNY%sRgh8S65;Ap+S1kbp#)KL0l@y84d)2Jk)#LfLg>761SM M07*qoM6N<$f+Me0J^%m! literal 0 HcmV?d00001 diff --git a/Example/MLKit/Images.xcassets/AppIcon.appiconset/ios-marketing.png b/Example/MLKit/Images.xcassets/AppIcon.appiconset/ios-marketing.png new file mode 100644 index 0000000000000000000000000000000000000000..72bcd8286cf14c917d17efd7ceed5888a08ee073 GIT binary patch literal 529219 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 kbGo*{XNd0)S$K&- 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 %9ChMy5zrK$=6Y4 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