├── .gitignore ├── SortedCollection ├── SortedCollection.h ├── Info.plist └── SortedCollection.swift ├── README.md ├── SortedCollectionTests ├── Info.plist └── SortedCollectionTests.swift ├── LICENSE └── SortedCollection.xcodeproj └── project.pbxproj /.gitignore: -------------------------------------------------------------------------------- 1 | xcuserdata 2 | *.xcworkspace 3 | 4 | -------------------------------------------------------------------------------- /SortedCollection/SortedCollection.h: -------------------------------------------------------------------------------- 1 | // 2 | // SortedCollection.h 3 | // 4 | // Created by Nate Cook on 2/23/15. 5 | // Copyright (c) 2015 Nate Cook. Available under the MIT license. 6 | // 7 | 8 | //! Project version number for SortedCollection. 9 | extern double SortedCollectionVersionNumber; 10 | 11 | //! Project version string for SortedCollection. 12 | extern const unsigned char SortedCollectionVersionString[]; 13 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SortedCollection 2 | 3 | This Swift framework provides two types and a protocol, built to demonstrate [Swift collection protocols](http://nshipster.com/swift-collection-protocols). 4 | 5 | 6 | ## Included Types 7 | 8 | - `SortedCollection`: An always-sorted collection of `Comparable` elements. Performance should be *O(N log N)* when adding to the collection, *O(log N)* for lookups, and *O(1)* for iteration or random element access. 9 | - `SortedSlice`: A slice of a `SortedCollection`. 10 | - `SortedCollectionType`: A protocol describing a collection whose elements are guaranteed to always be in ascending order. 11 | 12 | 13 | ## License 14 | 15 | SwiftSets is (c) 2015 Nate Cook and available under the MIT license. 16 | -------------------------------------------------------------------------------- /SortedCollectionTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.natecook.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /SortedCollection/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.natecook.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2014 Nate Cook 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in all 13 | // copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | // SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /SortedCollectionTests/SortedCollectionTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SortedCollectionTests.swift 3 | // 4 | // Created by Nate Cook on 2/23/15. 5 | // Copyright (c) 2015 Nate Cook. Available under the MIT license. 6 | // 7 | 8 | import SortedCollection 9 | import XCTest 10 | 11 | class SortedCollectionTests: XCTestCase { 12 | 13 | /// TODO: Add tests :) 14 | 15 | func testThings() { 16 | let attendees = SortedCollection(["Eddie", "Julianne", "J.K.", "Patricia", "Alejandro"]) 17 | 18 | XCTAssertEqual(attendees[0], "Alejandro") 19 | XCTAssertEqual(attendees.count, 5) 20 | 21 | var sortedNumbers = SortedCollection() 22 | sortedNumbers.insert(12) 23 | sortedNumbers.insert(stride(from: 0, through: 25, by: 5)) 24 | 25 | XCTAssertEqual(sortedNumbers.count, 7) 26 | XCTAssert(sortedNumbers.contains(12)) 27 | XCTAssertFalse(sortedNumbers.contains(3)) 28 | 29 | sortedNumbers.insert(5, 6, 7, 8, 9) 30 | sortedNumbers.insert(12) 31 | sortedNumbers.insert(0) 32 | sortedNumbers.insert(9) 33 | sortedNumbers.insert(9) 34 | sortedNumbers.insert(9) 35 | sortedNumbers.insert(9) 36 | sortedNumbers.insert(9) 37 | sortedNumbers.insert(500) 38 | sortedNumbers.insert(-5) 39 | 40 | XCTAssert(isSorted(sortedNumbers)) 41 | XCTAssert(sortedNumbers.contains(9)) 42 | 43 | while nil != sortedNumbers.remove(9) { } 44 | 45 | XCTAssertFalse(sortedNumbers.contains(9)) 46 | } 47 | 48 | func testInsertPerformance() { 49 | func getRandomArray(count: Int) -> [Int] { 50 | var result: [Int] = [] 51 | for _ in 0..(seq: S) -> Bool { 70 | var last: S.Generator.Element? 71 | for element in seq { 72 | if element < last { 73 | return false 74 | } 75 | last = element 76 | } 77 | 78 | return true 79 | } 80 | 81 | -------------------------------------------------------------------------------- /SortedCollection/SortedCollection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SortedCollection.swift 3 | // 4 | // Created by Nate Cook on 2/23/15. 5 | // Copyright (c) 2015 Nate Cook. Available under the MIT license. 6 | // 7 | 8 | 9 | // MARK: - SortedCollectionType 10 | 11 | /// A *collection* whose elements are guaranteed to always be 12 | /// in ascending order. 13 | public protocol SortedCollectionType : Sliceable, Equatable { 14 | typealias Element : Comparable 15 | 16 | /// Create an empty `SortedCollection`. 17 | init() 18 | 19 | /// Create a new `SortedCollection` with the contents of a given sequence. 20 | init(_ sequence: S) 21 | 22 | /// Returns true iff `value` is found in the collection. 23 | func contains(value: Element) -> Bool 24 | 25 | /// Quickly find the index of a value. 26 | /// 27 | /// :returns: The index of the first instance of `value` in the collection, 28 | /// or `nil` if `value` isn't found. 29 | func indexOf(value: Element) -> Int? 30 | 31 | /// Inserts one or more new values into the collection in the correct order. 32 | mutating func insert(values: Element...) 33 | 34 | /// Inserts the contents of a sequence into the `SortedCollection`. 35 | mutating func insert(values: S) 36 | 37 | /// Removes `value` from the collection if it exists. 38 | /// 39 | /// :returns: The given value if found, otherwise `nil`. 40 | mutating func remove(value: Element) -> Element? 41 | 42 | /// Removes and returns the item at `index`. Requires count > 0. 43 | mutating func removeAtIndex(index: Int) -> Element 44 | 45 | /// Removes all elements from the collection. 46 | mutating func removeAll(#keepCapacity: Bool) 47 | } 48 | 49 | 50 | // MARK: - SortedCollection 51 | 52 | /// An always-sorted collection of `Comparable` elements. Performance should be O(N log N) 53 | /// when adding to the collection, O(log N) for lookups, and O(1) for iteration. 54 | public struct SortedCollection : Printable, SortedCollectionType { 55 | typealias Element = T 56 | 57 | private var contents: [T] = [] 58 | 59 | /// The number of elements the `SortedCollection` contains. 60 | public var count: Int { 61 | return contents.count 62 | } 63 | 64 | /// A string representation of the `SortedCollection`. 65 | public var description: String { 66 | return contents.description 67 | } 68 | 69 | /// Create an empty `SortedCollection`. 70 | public init() { } 71 | 72 | /// Create a new `SortedCollection` with the contents of a given sequence. 73 | public init(_ sequence: S) { 74 | contents = sorted(sequence) 75 | } 76 | 77 | /// Create a new `SortedCollection` with the given values. 78 | public init(values: T...) { 79 | contents = sorted(values) 80 | } 81 | 82 | /// Quickly find the index of a value. 83 | /// 84 | /// :returns: The index of the first instance of `value` in the collection, 85 | /// or `nil` if `value` isn't found. 86 | public func indexOf(value: T) -> Int? { 87 | let index = _insertionIndex(contents, forValue: value) 88 | if index == count { 89 | return nil 90 | } 91 | return contents[index] == value ? index : nil 92 | } 93 | 94 | /// Returns true iff `value` is found in the collection. 95 | public func contains(value: T) -> Bool { 96 | return indexOf(value) != nil 97 | } 98 | 99 | /// Returns a new `SortedCollection` with the combined contents of `self` and the given values. 100 | public func merge(values: T...) -> SortedCollection { 101 | return merge(values) 102 | } 103 | 104 | /// Returns a new `SortedCollection` with the combined contents of `self` and the given values. 105 | public func merge(values: S) -> SortedCollection { 106 | return SortedCollection(contents + values) 107 | } 108 | 109 | /// Inserts one or more new values into the collection in the correct order. 110 | public mutating func insert(values: T...) { 111 | for value in values { 112 | contents.insert(value, atIndex: _insertionIndex(contents, forValue: value)) 113 | } 114 | } 115 | 116 | /// Inserts the contents of a sequence into the `SortedCollection`. 117 | public mutating func insert(values: S) { 118 | contents = sorted(contents + values) 119 | } 120 | 121 | /// Removes `value` from the collection if it exists. 122 | /// 123 | /// :returns: The given value if found, otherwise `nil`. 124 | public mutating func remove(value: T) -> T? { 125 | if let index = indexOf(value) { 126 | return contents.removeAtIndex(index) 127 | } 128 | return nil 129 | } 130 | 131 | /// Removes and returns the item at `index`. Requires count > 0. 132 | public mutating func removeAtIndex(index: Int) -> T { 133 | return contents.removeAtIndex(index) 134 | } 135 | 136 | /// Removes all elements from the collection. 137 | public mutating func removeAll(keepCapacity: Bool = true) { 138 | contents.removeAll(keepCapacity: keepCapacity) 139 | } 140 | } 141 | 142 | // MARK: SequenceType 143 | 144 | extension SortedCollection : SequenceType { 145 | typealias Generator = GeneratorOf 146 | 147 | /// Returns a generator of the elements of the collection. 148 | public func generate() -> Generator { 149 | return GeneratorOf(contents.generate()) 150 | } 151 | } 152 | 153 | // MARK: CollectionType 154 | 155 | extension SortedCollection : CollectionType { 156 | typealias Index = Int 157 | 158 | /// The position of the first element in the collection. (Always zero.) 159 | public var startIndex: Int { 160 | return 0 161 | } 162 | 163 | /// One greater than the position of the last element in the collection. Zero when the collection is empty. 164 | public var endIndex: Int { 165 | return count 166 | } 167 | 168 | /// Accesses the element at index `i`. 169 | /// 170 | /// Read-only to ensure sorting - use `insert` to add new elements. 171 | public subscript(i: Int) -> T { 172 | return contents[i] 173 | } 174 | } 175 | 176 | // MARK: ArrayLiteralConvertible 177 | 178 | extension SortedCollection : ArrayLiteralConvertible { 179 | public init(arrayLiteral elements: T...) { 180 | self.contents = sorted(elements) 181 | } 182 | } 183 | 184 | // MARK: Sliceable 185 | 186 | extension SortedCollection : Sliceable { 187 | typealias SubSlice = SortedSlice 188 | 189 | /// Access the elements in the given range. 190 | public subscript(range: Range) -> SortedSlice { 191 | return SortedSlice(sortedSlice: contents[range]) 192 | } 193 | } 194 | 195 | 196 | 197 | // MARK: - SortedSlice 198 | 199 | /// A slice of a `SortedCollection`. 200 | public struct SortedSlice : Printable, SortedCollectionType { 201 | private var contents: Slice = [] 202 | 203 | /// The number of elements the `SortedSlice` contains. 204 | public var count: Int { 205 | return contents.count 206 | } 207 | 208 | /// A string representation of the `SortedSlice`. 209 | public var description: String { 210 | return contents.description 211 | } 212 | 213 | /// Create an empty `SortedSlice`. 214 | public init() { } 215 | 216 | /// Create a new `SortedSlice` with the contents of a given sequence. 217 | public init(_ sequence: S) { 218 | contents = Slice(sorted(sequence)) 219 | } 220 | 221 | /// Create a new `SortedSlice` with the given values. 222 | public init(values: T...) { 223 | contents = Slice(sorted(values)) 224 | } 225 | 226 | /// Create a new `SortedSlice` using a slice of a parent `SortedCollection`s backing array. 227 | private init(sortedSlice: Slice) { 228 | contents = sortedSlice 229 | } 230 | 231 | /// Quickly find the index of a value. 232 | /// 233 | /// :returns: The index of the first instance of `value` in the collection, 234 | /// or `nil` if `value` isn't found. 235 | public func indexOf(value: T) -> Int? { 236 | let index = _insertionIndex(contents, forValue: value) 237 | if index == count { 238 | return nil 239 | } 240 | return contents[index] == value ? index : nil 241 | } 242 | 243 | /// Returns true iff `value` is found in the collection. 244 | public func contains(value: T) -> Bool { 245 | return indexOf(value) != nil 246 | } 247 | 248 | /// Returns a new `SortedCollection` with the combined contents of `self` and the given values. 249 | public func merge(values: T...) -> SortedCollection { 250 | return merge(values) 251 | } 252 | 253 | /// Returns a new `SortedCollection` with the combined contents of `self` and the given values. 254 | public func merge(values: S) -> SortedCollection { 255 | return SortedCollection(contents + values) 256 | } 257 | 258 | /// Inserts one or more new values into the collection in the correct order. 259 | public mutating func insert(values: T...) { 260 | for value in values { 261 | contents.insert(value, atIndex: _insertionIndex(contents, forValue: value)) 262 | } 263 | } 264 | 265 | /// Inserts the contents of a sequence into the `SortedSlice`. 266 | public mutating func insert(values: S) { 267 | contents = Slice(sorted(contents + values)) 268 | } 269 | 270 | /// Removes `value` from the collection if it exists. 271 | /// 272 | /// :returns: The given value if found, otherwise `nil`. 273 | public mutating func remove(value: T) -> T? { 274 | if let index = indexOf(value) { 275 | return contents.removeAtIndex(index) 276 | } 277 | return nil 278 | } 279 | 280 | /// Removes and returns the item at `index`. Requires count > 0. 281 | public mutating func removeAtIndex(index: Int) -> T { 282 | return contents.removeAtIndex(index) 283 | } 284 | 285 | /// Removes all elements from the collection. 286 | public mutating func removeAll(keepCapacity: Bool = true) { 287 | contents.removeAll(keepCapacity: keepCapacity) 288 | } 289 | } 290 | 291 | // MARK: SequenceType 292 | 293 | extension SortedSlice : SequenceType { 294 | typealias Generator = GeneratorOf 295 | 296 | /// Returns a generator of the elements of the collection. 297 | public func generate() -> Generator { 298 | return GeneratorOf(contents.generate()) 299 | } 300 | } 301 | 302 | // MARK: CollectionType 303 | 304 | extension SortedSlice : CollectionType { 305 | typealias Index = Int 306 | 307 | /// The position of the first element in the collection. (Always zero.) 308 | public var startIndex: Int { 309 | return 0 310 | } 311 | 312 | /// One greater than the position of the last element in the collection. Zero when the collection is empty. 313 | public var endIndex: Int { 314 | return count 315 | } 316 | 317 | /// Accesses the element at index `i`. 318 | /// 319 | /// Read-only to ensure sorting - use `insert` to add new elements. 320 | public subscript(i: Int) -> T { 321 | return contents[i] 322 | } 323 | } 324 | 325 | // MARK: ArrayLiteralConvertible 326 | 327 | extension SortedSlice : ArrayLiteralConvertible { 328 | public init(arrayLiteral elements: T...) { 329 | self.contents = Slice(sorted(elements)) 330 | } 331 | } 332 | 333 | // MARK: Sliceable 334 | 335 | extension SortedSlice : Sliceable { 336 | typealias SubSlice = SortedSlice 337 | 338 | /// Access the elements in the given range. 339 | public subscript(range: Range) -> SortedSlice { 340 | return SortedSlice(sortedSlice: contents[range]) 341 | } 342 | } 343 | 344 | 345 | // MARK: Equatable 346 | 347 | public func ==(lhs: S, rhs: S) -> Bool { 348 | if count(lhs) != count(rhs) { 349 | return false 350 | } 351 | 352 | for (lhs, rhs) in zip(lhs, rhs) { 353 | if lhs != rhs { 354 | return false 355 | } 356 | } 357 | 358 | return true 359 | } 360 | 361 | 362 | // MARK: - Private helper functions 363 | 364 | /// Returns the insertion point for `value` in the collection `c`. 365 | /// 366 | /// Precondition: The collection `c` is sorted in ascending order. 367 | /// 368 | /// If `value` exists at least once in `c`, the returned index will point to the 369 | /// first instance of `value`. Otherwise, it will point to the location where `value` 370 | /// could be inserted, keeping `c` in order. 371 | /// 372 | /// :returns: An index in the range `0...countElements(c)` where `value` can be inserted. 373 | private func _insertionIndex(c: C, forValue value: T) -> Int 375 | { 376 | if isEmpty(c) { 377 | return 0 378 | } 379 | 380 | var (low, high) = (0, c.endIndex - 1) 381 | var mid = 0 382 | 383 | while low < high { 384 | mid = (high - low) / 2 + low 385 | if c[mid] < value { 386 | low = mid + 1 387 | } else { 388 | high = mid 389 | } 390 | } 391 | 392 | if c[low] >= value { 393 | return low 394 | } 395 | 396 | return c.endIndex 397 | } 398 | 399 | -------------------------------------------------------------------------------- /SortedCollection.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 438649121A9CC2A200C4CEAE /* SortedCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A847FE1A9C3E840064AE9A /* SortedCollection.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 43A847FF1A9C3E840064AE9A /* SortedCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 43A847FE1A9C3E840064AE9A /* SortedCollection.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 43A848051A9C3E840064AE9A /* SortedCollection.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A847F91A9C3E840064AE9A /* SortedCollection.framework */; }; 13 | 43A8480C1A9C3E840064AE9A /* SortedCollectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A8480B1A9C3E840064AE9A /* SortedCollectionTests.swift */; }; 14 | 43A848251A9C3EF20064AE9A /* SortedCollection.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A8481A1A9C3EF20064AE9A /* SortedCollection.framework */; }; 15 | 43A848331A9C3F550064AE9A /* SortedCollectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A8480B1A9C3E840064AE9A /* SortedCollectionTests.swift */; }; 16 | 43A848361A9C412C0064AE9A /* SortedCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A848351A9C412C0064AE9A /* SortedCollection.swift */; }; 17 | 43A848371A9C412C0064AE9A /* SortedCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43A848351A9C412C0064AE9A /* SortedCollection.swift */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 43A848061A9C3E840064AE9A /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 43A847F01A9C3E840064AE9A /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 43A847F81A9C3E840064AE9A; 26 | remoteInfo = SortedCollection; 27 | }; 28 | 43A848261A9C3EF20064AE9A /* PBXContainerItemProxy */ = { 29 | isa = PBXContainerItemProxy; 30 | containerPortal = 43A847F01A9C3E840064AE9A /* Project object */; 31 | proxyType = 1; 32 | remoteGlobalIDString = 43A848191A9C3EF20064AE9A; 33 | remoteInfo = "SortedCollection-Mac"; 34 | }; 35 | /* End PBXContainerItemProxy section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 43A847F91A9C3E840064AE9A /* SortedCollection.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SortedCollection.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | 43A847FD1A9C3E840064AE9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 40 | 43A847FE1A9C3E840064AE9A /* SortedCollection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SortedCollection.h; sourceTree = ""; }; 41 | 43A848041A9C3E840064AE9A /* SortedCollectionTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SortedCollectionTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 43A8480A1A9C3E840064AE9A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 43 | 43A8480B1A9C3E840064AE9A /* SortedCollectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SortedCollectionTests.swift; sourceTree = ""; }; 44 | 43A8481A1A9C3EF20064AE9A /* SortedCollection.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SortedCollection.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 43A848241A9C3EF20064AE9A /* SortedCollection-MacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SortedCollection-MacTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 43A848351A9C412C0064AE9A /* SortedCollection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SortedCollection.swift; sourceTree = ""; }; 47 | /* End PBXFileReference section */ 48 | 49 | /* Begin PBXFrameworksBuildPhase section */ 50 | 43A847F51A9C3E840064AE9A /* Frameworks */ = { 51 | isa = PBXFrameworksBuildPhase; 52 | buildActionMask = 2147483647; 53 | files = ( 54 | ); 55 | runOnlyForDeploymentPostprocessing = 0; 56 | }; 57 | 43A848011A9C3E840064AE9A /* Frameworks */ = { 58 | isa = PBXFrameworksBuildPhase; 59 | buildActionMask = 2147483647; 60 | files = ( 61 | 43A848051A9C3E840064AE9A /* SortedCollection.framework in Frameworks */, 62 | ); 63 | runOnlyForDeploymentPostprocessing = 0; 64 | }; 65 | 43A848161A9C3EF20064AE9A /* Frameworks */ = { 66 | isa = PBXFrameworksBuildPhase; 67 | buildActionMask = 2147483647; 68 | files = ( 69 | ); 70 | runOnlyForDeploymentPostprocessing = 0; 71 | }; 72 | 43A848211A9C3EF20064AE9A /* Frameworks */ = { 73 | isa = PBXFrameworksBuildPhase; 74 | buildActionMask = 2147483647; 75 | files = ( 76 | 43A848251A9C3EF20064AE9A /* SortedCollection.framework in Frameworks */, 77 | ); 78 | runOnlyForDeploymentPostprocessing = 0; 79 | }; 80 | /* End PBXFrameworksBuildPhase section */ 81 | 82 | /* Begin PBXGroup section */ 83 | 43A847EF1A9C3E840064AE9A = { 84 | isa = PBXGroup; 85 | children = ( 86 | 43A847FB1A9C3E840064AE9A /* SortedCollection */, 87 | 43A848081A9C3E840064AE9A /* SortedCollectionTests */, 88 | 43A847FA1A9C3E840064AE9A /* Products */, 89 | ); 90 | sourceTree = ""; 91 | }; 92 | 43A847FA1A9C3E840064AE9A /* Products */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 43A847F91A9C3E840064AE9A /* SortedCollection.framework */, 96 | 43A848041A9C3E840064AE9A /* SortedCollectionTests.xctest */, 97 | 43A8481A1A9C3EF20064AE9A /* SortedCollection.framework */, 98 | 43A848241A9C3EF20064AE9A /* SortedCollection-MacTests.xctest */, 99 | ); 100 | name = Products; 101 | sourceTree = ""; 102 | }; 103 | 43A847FB1A9C3E840064AE9A /* SortedCollection */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 43A847FE1A9C3E840064AE9A /* SortedCollection.h */, 107 | 43A848351A9C412C0064AE9A /* SortedCollection.swift */, 108 | 43A847FC1A9C3E840064AE9A /* Supporting Files */, 109 | ); 110 | path = SortedCollection; 111 | sourceTree = ""; 112 | }; 113 | 43A847FC1A9C3E840064AE9A /* Supporting Files */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 43A847FD1A9C3E840064AE9A /* Info.plist */, 117 | ); 118 | name = "Supporting Files"; 119 | sourceTree = ""; 120 | }; 121 | 43A848081A9C3E840064AE9A /* SortedCollectionTests */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 43A8480B1A9C3E840064AE9A /* SortedCollectionTests.swift */, 125 | 43A848091A9C3E840064AE9A /* Supporting Files */, 126 | ); 127 | path = SortedCollectionTests; 128 | sourceTree = ""; 129 | }; 130 | 43A848091A9C3E840064AE9A /* Supporting Files */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 43A8480A1A9C3E840064AE9A /* Info.plist */, 134 | ); 135 | name = "Supporting Files"; 136 | sourceTree = ""; 137 | }; 138 | /* End PBXGroup section */ 139 | 140 | /* Begin PBXHeadersBuildPhase section */ 141 | 43A847F61A9C3E840064AE9A /* Headers */ = { 142 | isa = PBXHeadersBuildPhase; 143 | buildActionMask = 2147483647; 144 | files = ( 145 | 43A847FF1A9C3E840064AE9A /* SortedCollection.h in Headers */, 146 | ); 147 | runOnlyForDeploymentPostprocessing = 0; 148 | }; 149 | 43A848171A9C3EF20064AE9A /* Headers */ = { 150 | isa = PBXHeadersBuildPhase; 151 | buildActionMask = 2147483647; 152 | files = ( 153 | 438649121A9CC2A200C4CEAE /* SortedCollection.h in Headers */, 154 | ); 155 | runOnlyForDeploymentPostprocessing = 0; 156 | }; 157 | /* End PBXHeadersBuildPhase section */ 158 | 159 | /* Begin PBXNativeTarget section */ 160 | 43A847F81A9C3E840064AE9A /* SortedCollection */ = { 161 | isa = PBXNativeTarget; 162 | buildConfigurationList = 43A8480F1A9C3E840064AE9A /* Build configuration list for PBXNativeTarget "SortedCollection" */; 163 | buildPhases = ( 164 | 43A847F41A9C3E840064AE9A /* Sources */, 165 | 43A847F51A9C3E840064AE9A /* Frameworks */, 166 | 43A847F61A9C3E840064AE9A /* Headers */, 167 | 43A847F71A9C3E840064AE9A /* Resources */, 168 | ); 169 | buildRules = ( 170 | ); 171 | dependencies = ( 172 | ); 173 | name = SortedCollection; 174 | productName = SortedCollection; 175 | productReference = 43A847F91A9C3E840064AE9A /* SortedCollection.framework */; 176 | productType = "com.apple.product-type.framework"; 177 | }; 178 | 43A848031A9C3E840064AE9A /* SortedCollectionTests */ = { 179 | isa = PBXNativeTarget; 180 | buildConfigurationList = 43A848121A9C3E840064AE9A /* Build configuration list for PBXNativeTarget "SortedCollectionTests" */; 181 | buildPhases = ( 182 | 43A848001A9C3E840064AE9A /* Sources */, 183 | 43A848011A9C3E840064AE9A /* Frameworks */, 184 | 43A848021A9C3E840064AE9A /* Resources */, 185 | ); 186 | buildRules = ( 187 | ); 188 | dependencies = ( 189 | 43A848071A9C3E840064AE9A /* PBXTargetDependency */, 190 | ); 191 | name = SortedCollectionTests; 192 | productName = SortedCollectionTests; 193 | productReference = 43A848041A9C3E840064AE9A /* SortedCollectionTests.xctest */; 194 | productType = "com.apple.product-type.bundle.unit-test"; 195 | }; 196 | 43A848191A9C3EF20064AE9A /* SortedCollection-Mac */ = { 197 | isa = PBXNativeTarget; 198 | buildConfigurationList = 43A8482D1A9C3EF20064AE9A /* Build configuration list for PBXNativeTarget "SortedCollection-Mac" */; 199 | buildPhases = ( 200 | 43A848151A9C3EF20064AE9A /* Sources */, 201 | 43A848161A9C3EF20064AE9A /* Frameworks */, 202 | 43A848171A9C3EF20064AE9A /* Headers */, 203 | 43A848181A9C3EF20064AE9A /* Resources */, 204 | ); 205 | buildRules = ( 206 | ); 207 | dependencies = ( 208 | ); 209 | name = "SortedCollection-Mac"; 210 | productName = "SortedCollection-Mac"; 211 | productReference = 43A8481A1A9C3EF20064AE9A /* SortedCollection.framework */; 212 | productType = "com.apple.product-type.framework"; 213 | }; 214 | 43A848231A9C3EF20064AE9A /* SortedCollection-MacTests */ = { 215 | isa = PBXNativeTarget; 216 | buildConfigurationList = 43A848301A9C3EF20064AE9A /* Build configuration list for PBXNativeTarget "SortedCollection-MacTests" */; 217 | buildPhases = ( 218 | 43A848201A9C3EF20064AE9A /* Sources */, 219 | 43A848211A9C3EF20064AE9A /* Frameworks */, 220 | 43A848221A9C3EF20064AE9A /* Resources */, 221 | ); 222 | buildRules = ( 223 | ); 224 | dependencies = ( 225 | 43A848271A9C3EF20064AE9A /* PBXTargetDependency */, 226 | ); 227 | name = "SortedCollection-MacTests"; 228 | productName = "SortedCollection-MacTests"; 229 | productReference = 43A848241A9C3EF20064AE9A /* SortedCollection-MacTests.xctest */; 230 | productType = "com.apple.product-type.bundle.unit-test"; 231 | }; 232 | /* End PBXNativeTarget section */ 233 | 234 | /* Begin PBXProject section */ 235 | 43A847F01A9C3E840064AE9A /* Project object */ = { 236 | isa = PBXProject; 237 | attributes = { 238 | LastUpgradeCheck = 0630; 239 | ORGANIZATIONNAME = "Nate Cook"; 240 | TargetAttributes = { 241 | 43A847F81A9C3E840064AE9A = { 242 | CreatedOnToolsVersion = 6.3; 243 | }; 244 | 43A848031A9C3E840064AE9A = { 245 | CreatedOnToolsVersion = 6.3; 246 | }; 247 | 43A848191A9C3EF20064AE9A = { 248 | CreatedOnToolsVersion = 6.3; 249 | }; 250 | 43A848231A9C3EF20064AE9A = { 251 | CreatedOnToolsVersion = 6.3; 252 | }; 253 | }; 254 | }; 255 | buildConfigurationList = 43A847F31A9C3E840064AE9A /* Build configuration list for PBXProject "SortedCollection" */; 256 | compatibilityVersion = "Xcode 3.2"; 257 | developmentRegion = English; 258 | hasScannedForEncodings = 0; 259 | knownRegions = ( 260 | en, 261 | ); 262 | mainGroup = 43A847EF1A9C3E840064AE9A; 263 | productRefGroup = 43A847FA1A9C3E840064AE9A /* Products */; 264 | projectDirPath = ""; 265 | projectRoot = ""; 266 | targets = ( 267 | 43A847F81A9C3E840064AE9A /* SortedCollection */, 268 | 43A848031A9C3E840064AE9A /* SortedCollectionTests */, 269 | 43A848191A9C3EF20064AE9A /* SortedCollection-Mac */, 270 | 43A848231A9C3EF20064AE9A /* SortedCollection-MacTests */, 271 | ); 272 | }; 273 | /* End PBXProject section */ 274 | 275 | /* Begin PBXResourcesBuildPhase section */ 276 | 43A847F71A9C3E840064AE9A /* Resources */ = { 277 | isa = PBXResourcesBuildPhase; 278 | buildActionMask = 2147483647; 279 | files = ( 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | }; 283 | 43A848021A9C3E840064AE9A /* Resources */ = { 284 | isa = PBXResourcesBuildPhase; 285 | buildActionMask = 2147483647; 286 | files = ( 287 | ); 288 | runOnlyForDeploymentPostprocessing = 0; 289 | }; 290 | 43A848181A9C3EF20064AE9A /* Resources */ = { 291 | isa = PBXResourcesBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | ); 295 | runOnlyForDeploymentPostprocessing = 0; 296 | }; 297 | 43A848221A9C3EF20064AE9A /* Resources */ = { 298 | isa = PBXResourcesBuildPhase; 299 | buildActionMask = 2147483647; 300 | files = ( 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | }; 304 | /* End PBXResourcesBuildPhase section */ 305 | 306 | /* Begin PBXSourcesBuildPhase section */ 307 | 43A847F41A9C3E840064AE9A /* Sources */ = { 308 | isa = PBXSourcesBuildPhase; 309 | buildActionMask = 2147483647; 310 | files = ( 311 | 43A848361A9C412C0064AE9A /* SortedCollection.swift in Sources */, 312 | ); 313 | runOnlyForDeploymentPostprocessing = 0; 314 | }; 315 | 43A848001A9C3E840064AE9A /* Sources */ = { 316 | isa = PBXSourcesBuildPhase; 317 | buildActionMask = 2147483647; 318 | files = ( 319 | 43A8480C1A9C3E840064AE9A /* SortedCollectionTests.swift in Sources */, 320 | ); 321 | runOnlyForDeploymentPostprocessing = 0; 322 | }; 323 | 43A848151A9C3EF20064AE9A /* Sources */ = { 324 | isa = PBXSourcesBuildPhase; 325 | buildActionMask = 2147483647; 326 | files = ( 327 | 43A848371A9C412C0064AE9A /* SortedCollection.swift in Sources */, 328 | ); 329 | runOnlyForDeploymentPostprocessing = 0; 330 | }; 331 | 43A848201A9C3EF20064AE9A /* Sources */ = { 332 | isa = PBXSourcesBuildPhase; 333 | buildActionMask = 2147483647; 334 | files = ( 335 | 43A848331A9C3F550064AE9A /* SortedCollectionTests.swift in Sources */, 336 | ); 337 | runOnlyForDeploymentPostprocessing = 0; 338 | }; 339 | /* End PBXSourcesBuildPhase section */ 340 | 341 | /* Begin PBXTargetDependency section */ 342 | 43A848071A9C3E840064AE9A /* PBXTargetDependency */ = { 343 | isa = PBXTargetDependency; 344 | target = 43A847F81A9C3E840064AE9A /* SortedCollection */; 345 | targetProxy = 43A848061A9C3E840064AE9A /* PBXContainerItemProxy */; 346 | }; 347 | 43A848271A9C3EF20064AE9A /* PBXTargetDependency */ = { 348 | isa = PBXTargetDependency; 349 | target = 43A848191A9C3EF20064AE9A /* SortedCollection-Mac */; 350 | targetProxy = 43A848261A9C3EF20064AE9A /* PBXContainerItemProxy */; 351 | }; 352 | /* End PBXTargetDependency section */ 353 | 354 | /* Begin XCBuildConfiguration section */ 355 | 43A8480D1A9C3E840064AE9A /* Debug */ = { 356 | isa = XCBuildConfiguration; 357 | buildSettings = { 358 | ALWAYS_SEARCH_USER_PATHS = NO; 359 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 360 | CLANG_CXX_LIBRARY = "libc++"; 361 | CLANG_ENABLE_MODULES = YES; 362 | CLANG_ENABLE_OBJC_ARC = YES; 363 | CLANG_WARN_BOOL_CONVERSION = YES; 364 | CLANG_WARN_CONSTANT_CONVERSION = YES; 365 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 366 | CLANG_WARN_EMPTY_BODY = YES; 367 | CLANG_WARN_ENUM_CONVERSION = YES; 368 | CLANG_WARN_INT_CONVERSION = YES; 369 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 370 | CLANG_WARN_UNREACHABLE_CODE = YES; 371 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 372 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 373 | COPY_PHASE_STRIP = NO; 374 | CURRENT_PROJECT_VERSION = 1; 375 | DEBUG_INFORMATION_FORMAT = dwarf; 376 | ENABLE_STRICT_OBJC_MSGSEND = YES; 377 | GCC_C_LANGUAGE_STANDARD = gnu99; 378 | GCC_DYNAMIC_NO_PIC = NO; 379 | GCC_OPTIMIZATION_LEVEL = 0; 380 | GCC_PREPROCESSOR_DEFINITIONS = ( 381 | "DEBUG=1", 382 | "$(inherited)", 383 | ); 384 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 385 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 386 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 387 | GCC_WARN_UNDECLARED_SELECTOR = YES; 388 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 389 | GCC_WARN_UNUSED_FUNCTION = YES; 390 | GCC_WARN_UNUSED_VARIABLE = YES; 391 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 392 | MACOSX_DEPLOYMENT_TARGET = 10.9; 393 | MTL_ENABLE_DEBUG_INFO = YES; 394 | ONLY_ACTIVE_ARCH = YES; 395 | SDKROOT = iphoneos; 396 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 397 | TARGETED_DEVICE_FAMILY = "1,2"; 398 | VERSIONING_SYSTEM = "apple-generic"; 399 | VERSION_INFO_PREFIX = ""; 400 | }; 401 | name = Debug; 402 | }; 403 | 43A8480E1A9C3E840064AE9A /* Release */ = { 404 | isa = XCBuildConfiguration; 405 | buildSettings = { 406 | ALWAYS_SEARCH_USER_PATHS = NO; 407 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 408 | CLANG_CXX_LIBRARY = "libc++"; 409 | CLANG_ENABLE_MODULES = YES; 410 | CLANG_ENABLE_OBJC_ARC = YES; 411 | CLANG_WARN_BOOL_CONVERSION = YES; 412 | CLANG_WARN_CONSTANT_CONVERSION = YES; 413 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 414 | CLANG_WARN_EMPTY_BODY = YES; 415 | CLANG_WARN_ENUM_CONVERSION = YES; 416 | CLANG_WARN_INT_CONVERSION = YES; 417 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 418 | CLANG_WARN_UNREACHABLE_CODE = YES; 419 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 420 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 421 | COPY_PHASE_STRIP = NO; 422 | CURRENT_PROJECT_VERSION = 1; 423 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 424 | ENABLE_NS_ASSERTIONS = NO; 425 | ENABLE_STRICT_OBJC_MSGSEND = YES; 426 | GCC_C_LANGUAGE_STANDARD = gnu99; 427 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 428 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 429 | GCC_WARN_UNDECLARED_SELECTOR = YES; 430 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 431 | GCC_WARN_UNUSED_FUNCTION = YES; 432 | GCC_WARN_UNUSED_VARIABLE = YES; 433 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 434 | MACOSX_DEPLOYMENT_TARGET = 10.9; 435 | MTL_ENABLE_DEBUG_INFO = NO; 436 | SDKROOT = iphoneos; 437 | TARGETED_DEVICE_FAMILY = "1,2"; 438 | VALIDATE_PRODUCT = YES; 439 | VERSIONING_SYSTEM = "apple-generic"; 440 | VERSION_INFO_PREFIX = ""; 441 | }; 442 | name = Release; 443 | }; 444 | 43A848101A9C3E840064AE9A /* Debug */ = { 445 | isa = XCBuildConfiguration; 446 | buildSettings = { 447 | DEFINES_MODULE = YES; 448 | DYLIB_COMPATIBILITY_VERSION = 1; 449 | DYLIB_CURRENT_VERSION = 1; 450 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 451 | INFOPLIST_FILE = SortedCollection/Info.plist; 452 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 453 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 454 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 455 | PRODUCT_NAME = "$(TARGET_NAME)"; 456 | SKIP_INSTALL = YES; 457 | }; 458 | name = Debug; 459 | }; 460 | 43A848111A9C3E840064AE9A /* Release */ = { 461 | isa = XCBuildConfiguration; 462 | buildSettings = { 463 | DEFINES_MODULE = YES; 464 | DYLIB_COMPATIBILITY_VERSION = 1; 465 | DYLIB_CURRENT_VERSION = 1; 466 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 467 | INFOPLIST_FILE = SortedCollection/Info.plist; 468 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 469 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 470 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 471 | PRODUCT_NAME = "$(TARGET_NAME)"; 472 | SKIP_INSTALL = YES; 473 | }; 474 | name = Release; 475 | }; 476 | 43A848131A9C3E840064AE9A /* Debug */ = { 477 | isa = XCBuildConfiguration; 478 | buildSettings = { 479 | FRAMEWORK_SEARCH_PATHS = ( 480 | "$(SDKROOT)/Developer/Library/Frameworks", 481 | "$(inherited)", 482 | ); 483 | GCC_PREPROCESSOR_DEFINITIONS = ( 484 | "DEBUG=1", 485 | "$(inherited)", 486 | ); 487 | INFOPLIST_FILE = SortedCollectionTests/Info.plist; 488 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 489 | PRODUCT_NAME = "$(TARGET_NAME)"; 490 | }; 491 | name = Debug; 492 | }; 493 | 43A848141A9C3E840064AE9A /* Release */ = { 494 | isa = XCBuildConfiguration; 495 | buildSettings = { 496 | FRAMEWORK_SEARCH_PATHS = ( 497 | "$(SDKROOT)/Developer/Library/Frameworks", 498 | "$(inherited)", 499 | ); 500 | INFOPLIST_FILE = SortedCollectionTests/Info.plist; 501 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 502 | PRODUCT_NAME = "$(TARGET_NAME)"; 503 | }; 504 | name = Release; 505 | }; 506 | 43A8482E1A9C3EF20064AE9A /* Debug */ = { 507 | isa = XCBuildConfiguration; 508 | buildSettings = { 509 | COMBINE_HIDPI_IMAGES = YES; 510 | DEFINES_MODULE = YES; 511 | DYLIB_COMPATIBILITY_VERSION = 1; 512 | DYLIB_CURRENT_VERSION = 1; 513 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 514 | FRAMEWORK_VERSION = A; 515 | GCC_PREPROCESSOR_DEFINITIONS = ( 516 | "DEBUG=1", 517 | "$(inherited)", 518 | ); 519 | INFOPLIST_FILE = "$(SRCROOT)/SortedCollection/Info.plist"; 520 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 521 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 522 | MACOSX_DEPLOYMENT_TARGET = 10.9; 523 | PRODUCT_NAME = SortedCollection; 524 | SDKROOT = macosx; 525 | SKIP_INSTALL = YES; 526 | }; 527 | name = Debug; 528 | }; 529 | 43A8482F1A9C3EF20064AE9A /* Release */ = { 530 | isa = XCBuildConfiguration; 531 | buildSettings = { 532 | COMBINE_HIDPI_IMAGES = YES; 533 | DEFINES_MODULE = YES; 534 | DYLIB_COMPATIBILITY_VERSION = 1; 535 | DYLIB_CURRENT_VERSION = 1; 536 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 537 | FRAMEWORK_VERSION = A; 538 | INFOPLIST_FILE = "$(SRCROOT)/SortedCollection/Info.plist"; 539 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 540 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 541 | MACOSX_DEPLOYMENT_TARGET = 10.9; 542 | PRODUCT_NAME = SortedCollection; 543 | SDKROOT = macosx; 544 | SKIP_INSTALL = YES; 545 | }; 546 | name = Release; 547 | }; 548 | 43A848311A9C3EF20064AE9A /* Debug */ = { 549 | isa = XCBuildConfiguration; 550 | buildSettings = { 551 | COMBINE_HIDPI_IMAGES = YES; 552 | FRAMEWORK_SEARCH_PATHS = ( 553 | "$(DEVELOPER_FRAMEWORKS_DIR)", 554 | "$(inherited)", 555 | ); 556 | GCC_PREPROCESSOR_DEFINITIONS = ( 557 | "DEBUG=1", 558 | "$(inherited)", 559 | ); 560 | INFOPLIST_FILE = SortedCollection/Info.plist; 561 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 562 | MACOSX_DEPLOYMENT_TARGET = 10.10; 563 | PRODUCT_NAME = "$(TARGET_NAME)"; 564 | SDKROOT = macosx; 565 | }; 566 | name = Debug; 567 | }; 568 | 43A848321A9C3EF20064AE9A /* Release */ = { 569 | isa = XCBuildConfiguration; 570 | buildSettings = { 571 | COMBINE_HIDPI_IMAGES = YES; 572 | FRAMEWORK_SEARCH_PATHS = ( 573 | "$(DEVELOPER_FRAMEWORKS_DIR)", 574 | "$(inherited)", 575 | ); 576 | INFOPLIST_FILE = SortedCollection/Info.plist; 577 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 578 | MACOSX_DEPLOYMENT_TARGET = 10.10; 579 | PRODUCT_NAME = "$(TARGET_NAME)"; 580 | SDKROOT = macosx; 581 | }; 582 | name = Release; 583 | }; 584 | /* End XCBuildConfiguration section */ 585 | 586 | /* Begin XCConfigurationList section */ 587 | 43A847F31A9C3E840064AE9A /* Build configuration list for PBXProject "SortedCollection" */ = { 588 | isa = XCConfigurationList; 589 | buildConfigurations = ( 590 | 43A8480D1A9C3E840064AE9A /* Debug */, 591 | 43A8480E1A9C3E840064AE9A /* Release */, 592 | ); 593 | defaultConfigurationIsVisible = 0; 594 | defaultConfigurationName = Release; 595 | }; 596 | 43A8480F1A9C3E840064AE9A /* Build configuration list for PBXNativeTarget "SortedCollection" */ = { 597 | isa = XCConfigurationList; 598 | buildConfigurations = ( 599 | 43A848101A9C3E840064AE9A /* Debug */, 600 | 43A848111A9C3E840064AE9A /* Release */, 601 | ); 602 | defaultConfigurationIsVisible = 0; 603 | defaultConfigurationName = Release; 604 | }; 605 | 43A848121A9C3E840064AE9A /* Build configuration list for PBXNativeTarget "SortedCollectionTests" */ = { 606 | isa = XCConfigurationList; 607 | buildConfigurations = ( 608 | 43A848131A9C3E840064AE9A /* Debug */, 609 | 43A848141A9C3E840064AE9A /* Release */, 610 | ); 611 | defaultConfigurationIsVisible = 0; 612 | defaultConfigurationName = Release; 613 | }; 614 | 43A8482D1A9C3EF20064AE9A /* Build configuration list for PBXNativeTarget "SortedCollection-Mac" */ = { 615 | isa = XCConfigurationList; 616 | buildConfigurations = ( 617 | 43A8482E1A9C3EF20064AE9A /* Debug */, 618 | 43A8482F1A9C3EF20064AE9A /* Release */, 619 | ); 620 | defaultConfigurationIsVisible = 0; 621 | defaultConfigurationName = Release; 622 | }; 623 | 43A848301A9C3EF20064AE9A /* Build configuration list for PBXNativeTarget "SortedCollection-MacTests" */ = { 624 | isa = XCConfigurationList; 625 | buildConfigurations = ( 626 | 43A848311A9C3EF20064AE9A /* Debug */, 627 | 43A848321A9C3EF20064AE9A /* Release */, 628 | ); 629 | defaultConfigurationIsVisible = 0; 630 | defaultConfigurationName = Release; 631 | }; 632 | /* End XCConfigurationList section */ 633 | }; 634 | rootObject = 43A847F01A9C3E840064AE9A /* Project object */; 635 | } 636 | --------------------------------------------------------------------------------