Compare commits
227 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 06fd5ea31a | |||
| 36f17aa442 | |||
| 6c891952f4 | |||
| 3bac27b7a8 | |||
| 94d4b11aec | |||
| 4be394e313 | |||
| 891ecf6e2d | |||
| 736e0ea7da | |||
| c63ab5a3aa | |||
| f06553a74d | |||
| 72f8248df1 | |||
| 8ef9e9263f | |||
| ab03176239 | |||
| 4df7502e09 | |||
| 9bf57b0504 | |||
| 92ae96cf2a | |||
| b120d60c55 | |||
| cb4cb74a00 | |||
| 6bbbee5447 | |||
| e5bc9eceae | |||
| f153d5df84 | |||
| 1164a68fc8 | |||
| 596396a8e8 | |||
| 027494878b | |||
| 74f50a4c71 | |||
| ad37e7c91f | |||
| 4c236e1b82 | |||
| d78cc12e8d | |||
| 8866b3e301 | |||
| c3c5931187 | |||
| af7d973978 | |||
| ab67e0fea8 | |||
| 14e4501035 | |||
| a569fc06f5 | |||
| 465ea731a3 | |||
| 8a7247d9d4 | |||
| 909bed0ada | |||
| 5a5a8cc62d | |||
| e44b3a7f4c | |||
| ecdc5f971b | |||
| efcb0db2e0 | |||
| 1743d4dc3f | |||
| fb67bd25b0 | |||
| 69c8843b76 | |||
| 36ff800650 | |||
| 13101672c2 | |||
| 7abeecbf58 | |||
| 13bf59d5bd | |||
| 47f66b1abd | |||
| 42bb82b87b | |||
| 30c36e66fd | |||
| 3f6f0750cf | |||
| ae2cc6dd55 | |||
| 0d48ec751a | |||
| d2dec8bba0 | |||
| e8795b26df | |||
| ab7784b97f | |||
| 9adcc6f84c | |||
| 4ccfd1b9a3 | |||
| f08ff3e872 | |||
| f0da8a43be | |||
| dbd6b816db | |||
| 9818933b59 | |||
| 88cc1ad101 | |||
| 4cd37bd207 | |||
| 5e62daeff2 | |||
| 52e42cd938 | |||
| dbf4484048 | |||
| 804f2847b4 | |||
| 46952da3c3 | |||
| acb62df760 | |||
| f303e02f63 | |||
| 244d0128c9 | |||
| 0d5e16fc4f | |||
| ecd3f176e5 | |||
| ac3f8fa5eb | |||
| 19046fb4a8 | |||
| 005ef5c3ee | |||
| 68f2557694 | |||
| 72d4779e9b | |||
| 8547583792 | |||
| 3688348461 | |||
| f875439709 | |||
| 1920f07525 | |||
| 69ed90dcfc | |||
| 33fa9622ce | |||
| 468ad1c83a | |||
| 174c21d58f | |||
| 5f076fccbb | |||
| 642b5623b7 | |||
| 03b5817530 | |||
| 7ba07fcef1 | |||
| 0e1273e2ab | |||
| 7b8b3c39a3 | |||
| 1e5c2926a7 | |||
| b678702e3d | |||
| 4e4b205dcb | |||
| b345a3e8df | |||
| 2cf9220874 | |||
| 08e9ff5371 | |||
| e7adba0cb9 | |||
| 5a288f4197 | |||
| 56bfdfc953 | |||
| 34efc031a4 | |||
| 3541842cd3 | |||
| d75fe1429b | |||
| f8d5a75dd5 | |||
| 596a7d2c1b | |||
| f2a320bc6b | |||
| f36353d61f | |||
| fb30ee0cc3 | |||
| 4234d43565 | |||
| 77d0b4937a | |||
| 4c89d79979 | |||
| 397e3e4c20 | |||
| a4abc2ee8b | |||
| 2e54a9935b | |||
| ea47632047 | |||
| 1d9696939a | |||
| 1a26252cf7 | |||
| 0d73c529f2 | |||
| 42030fb42a | |||
| e689725b4d | |||
| b896bb0751 | |||
| 37bfcd67b2 | |||
| cb7638e658 | |||
| 95e5cc9c11 | |||
| 917cb33775 | |||
| 0b061bb25d | |||
| 1d439a86ed | |||
| be3d9f1c69 | |||
| f89f30b9d1 | |||
| 9821943fff | |||
| d609a252f8 | |||
| 642d7e34f4 | |||
| 9faf5ab0ea | |||
| f1a207a3e6 | |||
| aeac204817 | |||
| 32ef58d871 | |||
| 6ee0ceaa48 | |||
| 0b6c95022e | |||
| b733108558 | |||
| 14cb718fe2 | |||
| 77dbbf1c1f | |||
| 4be64d3c09 | |||
| 2699924867 | |||
| 87b46f36e1 | |||
| 28cd25d536 | |||
| 122814a5cd | |||
| b49641a892 | |||
| f8630257e6 | |||
| 46d4c52934 | |||
| fb66d1e9d8 | |||
| 638d4ae0d1 | |||
| f3d18a63fa | |||
| d01a024ae7 | |||
| a9a37b7978 | |||
| d87cac83e5 | |||
| 754d4096da | |||
| c5d09d3bc0 | |||
| 5877a0a683 | |||
| 5b6c8e3541 | |||
| 502a9e128e | |||
| be22dfd473 | |||
| a027b5c88b | |||
| 5f71a748f5 | |||
| 220b435d2a | |||
| 1120534fde | |||
| 3dfa4db66a | |||
| 3fe91a8722 | |||
| efb886e6c9 | |||
| a0b52c1d28 | |||
| ccb19e2f1d | |||
| 7d2362fe63 | |||
| 117efdb7bd | |||
| d84ddf7f40 | |||
| 73ee947220 | |||
| 9715568f02 | |||
| 751bbe1bcc | |||
| af87ceac65 | |||
| 99f26c7f93 | |||
| 8e43c679de | |||
| b18549782d | |||
| 5b4de32ee2 | |||
| 64924a208c | |||
| 310c182dc3 | |||
| c7ac65504d | |||
| ce50489b8f | |||
| b6d563a3cc | |||
| bb3ee42176 | |||
| b0251e74d3 | |||
| c8d61b939b | |||
| b832b9925c | |||
| 21b9930d36 | |||
| f81ab4e6a0 | |||
| f53a24821a | |||
| a742de8c3d | |||
| 855e6f6a0f | |||
| 6cd117b224 | |||
| dd71f6e196 | |||
| a63943c0ae | |||
| 3d78836dcd | |||
| be180eeaf4 | |||
| 8a2127d8f4 | |||
| 616815b08c | |||
| 90c35cb532 | |||
| b892a31bd9 | |||
| 699727683d | |||
| 8efd15b99a | |||
| a043a863a7 | |||
| ccdb7bf482 | |||
| c5a5e91d2f | |||
| b53a974021 | |||
| 066b38d0ec | |||
| 8b9d033d7d | |||
| befb924574 | |||
| e9fa5e8191 | |||
| fa8cb4d120 | |||
| d7daeb0518 | |||
| 9b6c798a17 | |||
| 959f4f0eb1 | |||
| 040aadd65f | |||
| b6a99e3ffe | |||
| 20d4d7e7c4 | |||
| a8a69e4570 | |||
| cea6cb0952 | |||
| fae6eb2617 |
@@ -0,0 +1,61 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
macos-11:
|
||||
name: macOS 11 (Xcode ${{ matrix.xcode }})
|
||||
runs-on: macos-11
|
||||
strategy:
|
||||
matrix:
|
||||
# https://github.com/actions/virtual-environments/blob/main/images/macos/macos-11-Readme.md#xcode
|
||||
xcode:
|
||||
- "13.0" # Swift 5.5
|
||||
- "12.5.1" # Swift 5.4.2
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Select Xcode
|
||||
run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
|
||||
- name: Build
|
||||
run: swift build -v
|
||||
- name: Test
|
||||
run: swift test -v
|
||||
|
||||
macos-10_15:
|
||||
name: macOS 10.15 (Xcode ${{ matrix.xcode }})
|
||||
runs-on: macos-10.15
|
||||
strategy:
|
||||
matrix:
|
||||
# https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md#xcode
|
||||
xcode:
|
||||
- "12.3" # Swift 5.3.2
|
||||
- "12.2" # Swift 5.3.1
|
||||
- "11.7" # Swift 5.2.4
|
||||
- "11.3.1" # Swift 5.1.3
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Select Xcode
|
||||
run: sudo xcode-select -s /Applications/Xcode_${{ matrix.xcode }}.app
|
||||
- name: Build
|
||||
run: swift build -v
|
||||
- name: Test
|
||||
run: swift test -v
|
||||
|
||||
linux:
|
||||
name: Linux
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: swift:5.3
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Build
|
||||
run: swift build -v
|
||||
- name: Test
|
||||
run: swift test -v
|
||||
+8
-26
@@ -1,29 +1,11 @@
|
||||
# OS X
|
||||
# SPM
|
||||
.build
|
||||
.swiftpm
|
||||
|
||||
# Xcode
|
||||
xcuserdata/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Ruby
|
||||
.ruby-*
|
||||
.rbenv-*
|
||||
|
||||
# Xcode
|
||||
*.pbxuser
|
||||
!default.pbxuser
|
||||
*.mode1v3
|
||||
!default.mode1v3
|
||||
*.mode2v3
|
||||
!default.mode2v3
|
||||
*.perspectivev3
|
||||
!default.perspectivev3
|
||||
xcuserdata
|
||||
*.xccheckout
|
||||
*.moved-aside
|
||||
DerivedData
|
||||
*.hmap
|
||||
*.ipa
|
||||
*.xcuserstate
|
||||
*.xctimeline
|
||||
|
||||
# Carthage
|
||||
Carthage
|
||||
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
language: objective-c
|
||||
osx_image: xcode7.3
|
||||
|
||||
xcode_project: OrderedDictionary.xcodeproj
|
||||
xcode_scheme: OrderedDictionary-iOS
|
||||
xcode_sdk: iphonesimulator
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
|
||||
script:
|
||||
- xcodebuild clean build test -project OrderedDictionary.xcodeproj -scheme OrderedDictionary-iOS -destination "platform=iOS Simulator,name=iPhone 6,OS=9.0"
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-2016 Lukas Kubanek
|
||||
Copyright © 2015-2021 Lukas Kubanek
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -7,224 +7,276 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
803F9CD51B92324C002F728F /* OrderedDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 803F9CD21B92324C002F728F /* OrderedDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
803F9CD81B9232EE002F728F /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 803F9CD71B9232EE002F728F /* OrderedDictionary.swift */; };
|
||||
803F9CF41B925B1C002F728F /* OrderedDictionary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 803F9CC61B923207002F728F /* OrderedDictionary.framework */; };
|
||||
803F9CFD1B925B4C002F728F /* OrderedDictionaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 803F9CFC1B925B4C002F728F /* OrderedDictionaryTests.swift */; };
|
||||
8060976B1B92F2D200DB20CF /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 803F9CD71B9232EE002F728F /* OrderedDictionary.swift */; };
|
||||
8060976C1B92F2D900DB20CF /* OrderedDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 803F9CD21B92324C002F728F /* OrderedDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
806097761B92F44F00DB20CF /* OrderedDictionary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 806097631B92F20400DB20CF /* OrderedDictionary.framework */; };
|
||||
8060977C1B92F4A000DB20CF /* OrderedDictionaryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 803F9CFC1B925B4C002F728F /* OrderedDictionaryTests.swift */; };
|
||||
8048C8AB22D8911B0086B88B /* OrderedDictionary+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8048C8AA22D8911B0086B88B /* OrderedDictionary+Deprecated.swift */; };
|
||||
8048C8AC22D8911B0086B88B /* OrderedDictionary+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8048C8AA22D8911B0086B88B /* OrderedDictionary+Deprecated.swift */; };
|
||||
8055B0421E201C5D009DC3EE /* OrderedDictionary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8055B0381E201C5D009DC3EE /* OrderedDictionary.framework */; };
|
||||
80A203A11F3F483700622481 /* OrderedDictionary+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80A203A01F3F483700622481 /* OrderedDictionary+Codable.swift */; };
|
||||
80A203A21F3F4C1F00622481 /* OrderedDictionary+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80A203A01F3F483700622481 /* OrderedDictionary+Codable.swift */; };
|
||||
80B28EA01E201EC9007E3A77 /* OrderedDictionary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80B28E971E201EC8007E3A77 /* OrderedDictionary.framework */; };
|
||||
80BE579A252B278D00F85D45 /* XCTUnwrapShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE5799252B278D00F85D45 /* XCTUnwrapShim.swift */; };
|
||||
80BE579B252B278D00F85D45 /* XCTUnwrapShim.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE5799252B278D00F85D45 /* XCTUnwrapShim.swift */; };
|
||||
80BE57A5252B3F6000F85D45 /* SubscriptAmbiguityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE57A4252B3F6000F85D45 /* SubscriptAmbiguityTests.swift */; };
|
||||
80BE57A6252B3F6000F85D45 /* SubscriptAmbiguityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE57A4252B3F6000F85D45 /* SubscriptAmbiguityTests.swift */; };
|
||||
80BE57D4252BAB9400F85D45 /* OrderedDictionarySlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE57D3252BAB9400F85D45 /* OrderedDictionarySlice.swift */; };
|
||||
80BE57D5252BAB9400F85D45 /* OrderedDictionarySlice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE57D3252BAB9400F85D45 /* OrderedDictionarySlice.swift */; };
|
||||
80BE57DF252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE57DE252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift */; };
|
||||
80BE57E0252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BE57DE252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift */; };
|
||||
80BFD01B252B049E002B3C05 /* InitializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD01A252B049E002B3C05 /* InitializationTests.swift */; };
|
||||
80BFD01C252B049E002B3C05 /* InitializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD01A252B049E002B3C05 /* InitializationTests.swift */; };
|
||||
80BFD02A252B069F002B3C05 /* SortingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD029252B069F002B3C05 /* SortingTests.swift */; };
|
||||
80BFD02B252B069F002B3C05 /* SortingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD029252B069F002B3C05 /* SortingTests.swift */; };
|
||||
80BFD031252B06EB002B3C05 /* DescriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD030252B06EB002B3C05 /* DescriptionTests.swift */; };
|
||||
80BFD032252B06EB002B3C05 /* DescriptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD030252B06EB002B3C05 /* DescriptionTests.swift */; };
|
||||
80BFD040252B0740002B3C05 /* CodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD03F252B0740002B3C05 /* CodingTests.swift */; };
|
||||
80BFD041252B0740002B3C05 /* CodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD03F252B0740002B3C05 /* CodingTests.swift */; };
|
||||
80BFD04B252B0951002B3C05 /* CapacityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD04A252B0951002B3C05 /* CapacityTests.swift */; };
|
||||
80BFD04C252B0951002B3C05 /* CapacityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD04A252B0951002B3C05 /* CapacityTests.swift */; };
|
||||
80BFD052252B09DC002B3C05 /* ReorderingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD051252B09DC002B3C05 /* ReorderingTests.swift */; };
|
||||
80BFD053252B09DC002B3C05 /* ReorderingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD051252B09DC002B3C05 /* ReorderingTests.swift */; };
|
||||
80BFD061252B0A7F002B3C05 /* RemovalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD060252B0A7F002B3C05 /* RemovalTests.swift */; };
|
||||
80BFD062252B0A7F002B3C05 /* RemovalTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD060252B0A7F002B3C05 /* RemovalTests.swift */; };
|
||||
80BFD070252B0C16002B3C05 /* AccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD06F252B0C16002B3C05 /* AccessTests.swift */; };
|
||||
80BFD071252B0C16002B3C05 /* AccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD06F252B0C16002B3C05 /* AccessTests.swift */; };
|
||||
80BFD077252B0D94002B3C05 /* MapFilterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD076252B0D94002B3C05 /* MapFilterTests.swift */; };
|
||||
80BFD078252B0D94002B3C05 /* MapFilterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD076252B0D94002B3C05 /* MapFilterTests.swift */; };
|
||||
80BFD07E252B0E19002B3C05 /* UpdatesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD07D252B0E19002B3C05 /* UpdatesTests.swift */; };
|
||||
80BFD07F252B0E19002B3C05 /* UpdatesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD07D252B0E19002B3C05 /* UpdatesTests.swift */; };
|
||||
80BFD0A8252B1C96002B3C05 /* InsertionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD0A7252B1C96002B3C05 /* InsertionsTests.swift */; };
|
||||
80BFD0A9252B1C96002B3C05 /* InsertionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80BFD0A7252B1C96002B3C05 /* InsertionsTests.swift */; };
|
||||
80E8E21D1E20301E00395E49 /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80E8E21C1E20301E00395E49 /* OrderedDictionary.swift */; };
|
||||
80E8E21F1E20425B00395E49 /* OrderedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80E8E21C1E20301E00395E49 /* OrderedDictionary.swift */; };
|
||||
80E8E2301E2133D100395E49 /* OrderedDictionary+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80E8E22F1E2133D100395E49 /* OrderedDictionary+Description.swift */; };
|
||||
80E8E2311E2133D100395E49 /* OrderedDictionary+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80E8E22F1E2133D100395E49 /* OrderedDictionary+Description.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
803F9CF51B925B1C002F728F /* PBXContainerItemProxy */ = {
|
||||
8055B0431E201C5D009DC3EE /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 803F9CBD1B923207002F728F /* Project object */;
|
||||
containerPortal = 8055B02F1E201C5D009DC3EE /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 803F9CC51B923207002F728F;
|
||||
remoteGlobalIDString = 8055B0371E201C5D009DC3EE;
|
||||
remoteInfo = OrderedDictionary;
|
||||
};
|
||||
806097771B92F44F00DB20CF /* PBXContainerItemProxy */ = {
|
||||
80B28EA11E201EC9007E3A77 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 803F9CBD1B923207002F728F /* Project object */;
|
||||
containerPortal = 8055B02F1E201C5D009DC3EE /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 806097621B92F20400DB20CF;
|
||||
remoteGlobalIDString = 80B28E961E201EC8007E3A77;
|
||||
remoteInfo = "OrderedDictionary-iOS";
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
803F9CFF1B925BA2002F728F /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
806097811B92F4F500DB20CF /* CopyFiles */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
803F9CC61B923207002F728F /* OrderedDictionary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OrderedDictionary.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
803F9CD21B92324C002F728F /* OrderedDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OrderedDictionary.h; sourceTree = "<group>"; };
|
||||
803F9CD41B92324C002F728F /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
803F9CD71B9232EE002F728F /* OrderedDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderedDictionary.swift; sourceTree = "<group>"; };
|
||||
803F9CEF1B925B1C002F728F /* OrderedDictionary-OSX-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OrderedDictionary-OSX-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
803F9CFC1B925B4C002F728F /* OrderedDictionaryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderedDictionaryTests.swift; sourceTree = "<group>"; };
|
||||
803F9CFE1B925B56002F728F /* Info-Tests.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-Tests.plist"; sourceTree = "<group>"; };
|
||||
806097631B92F20400DB20CF /* OrderedDictionary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OrderedDictionary.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
806097711B92F44F00DB20CF /* OrderedDictionary-iOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OrderedDictionary-iOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
80F94F181B926A60000A96E7 /* OrderedDictionary.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = OrderedDictionary.playground; sourceTree = "<group>"; };
|
||||
8048C8AA22D8911B0086B88B /* OrderedDictionary+Deprecated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderedDictionary+Deprecated.swift"; sourceTree = "<group>"; };
|
||||
8055B0381E201C5D009DC3EE /* OrderedDictionary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OrderedDictionary.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
8055B0411E201C5D009DC3EE /* OrderedDictionary_Mac_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OrderedDictionary_Mac_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
80A203A01F3F483700622481 /* OrderedDictionary+Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OrderedDictionary+Codable.swift"; sourceTree = "<group>"; };
|
||||
80B28E971E201EC8007E3A77 /* OrderedDictionary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OrderedDictionary.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
80B28E9F1E201EC9007E3A77 /* OrderedDictionary_iOS_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OrderedDictionary_iOS_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
80B28EB41E201F81007E3A77 /* Info-Tests.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-Tests.plist"; sourceTree = "<group>"; };
|
||||
80B28EB51E201F81007E3A77 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
80BE5799252B278D00F85D45 /* XCTUnwrapShim.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTUnwrapShim.swift; sourceTree = "<group>"; };
|
||||
80BE57A4252B3F6000F85D45 /* SubscriptAmbiguityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptAmbiguityTests.swift; sourceTree = "<group>"; };
|
||||
80BE57D3252BAB9400F85D45 /* OrderedDictionarySlice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OrderedDictionarySlice.swift; sourceTree = "<group>"; };
|
||||
80BE57DE252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Dictionary+OrderedDictionary.swift"; sourceTree = "<group>"; };
|
||||
80BFD01A252B049E002B3C05 /* InitializationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitializationTests.swift; sourceTree = "<group>"; };
|
||||
80BFD029252B069F002B3C05 /* SortingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SortingTests.swift; sourceTree = "<group>"; };
|
||||
80BFD030252B06EB002B3C05 /* DescriptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DescriptionTests.swift; sourceTree = "<group>"; };
|
||||
80BFD03F252B0740002B3C05 /* CodingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodingTests.swift; sourceTree = "<group>"; };
|
||||
80BFD04A252B0951002B3C05 /* CapacityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CapacityTests.swift; sourceTree = "<group>"; };
|
||||
80BFD051252B09DC002B3C05 /* ReorderingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReorderingTests.swift; sourceTree = "<group>"; };
|
||||
80BFD060252B0A7F002B3C05 /* RemovalTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemovalTests.swift; sourceTree = "<group>"; };
|
||||
80BFD06F252B0C16002B3C05 /* AccessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessTests.swift; sourceTree = "<group>"; };
|
||||
80BFD076252B0D94002B3C05 /* MapFilterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapFilterTests.swift; sourceTree = "<group>"; };
|
||||
80BFD07D252B0E19002B3C05 /* UpdatesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatesTests.swift; sourceTree = "<group>"; };
|
||||
80BFD0A7252B1C96002B3C05 /* InsertionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InsertionsTests.swift; sourceTree = "<group>"; };
|
||||
80DE329220F4CAFA0053EDA7 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
|
||||
80DE329320F4DD910053EDA7 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
|
||||
80DE329420F4DD910053EDA7 /* LICENSE.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = LICENSE.md; sourceTree = "<group>"; };
|
||||
80E8E21C1E20301E00395E49 /* OrderedDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderedDictionary.swift; sourceTree = "<group>"; };
|
||||
80E8E22F1E2133D100395E49 /* OrderedDictionary+Description.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "OrderedDictionary+Description.swift"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
803F9CC21B923207002F728F /* Frameworks */ = {
|
||||
8055B0341E201C5D009DC3EE /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
803F9CEC1B925B1C002F728F /* Frameworks */ = {
|
||||
8055B03E1E201C5D009DC3EE /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
803F9CF41B925B1C002F728F /* OrderedDictionary.framework in Frameworks */,
|
||||
8055B0421E201C5D009DC3EE /* OrderedDictionary.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8060975F1B92F20400DB20CF /* Frameworks */ = {
|
||||
80B28E931E201EC8007E3A77 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8060976E1B92F44F00DB20CF /* Frameworks */ = {
|
||||
80B28E9C1E201EC9007E3A77 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
806097761B92F44F00DB20CF /* OrderedDictionary.framework in Frameworks */,
|
||||
80B28EA01E201EC9007E3A77 /* OrderedDictionary.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
803F9CBC1B923207002F728F = {
|
||||
8055B02E1E201C5D009DC3EE = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
803F9CD11B92324C002F728F /* Sources */,
|
||||
803F9CFB1B925B4C002F728F /* Tests */,
|
||||
80F94F171B926A60000A96E7 /* Playgrounds */,
|
||||
803F9CD31B92324C002F728F /* Supporting Files */,
|
||||
803F9CC71B923207002F728F /* Products */,
|
||||
80DE329320F4DD910053EDA7 /* README.md */,
|
||||
80DE329420F4DD910053EDA7 /* LICENSE.md */,
|
||||
80DE329220F4CAFA0053EDA7 /* Package.swift */,
|
||||
8055B0521E201D24009DC3EE /* Sources */,
|
||||
8055B0571E201DF3009DC3EE /* Tests */,
|
||||
80B28EB31E201F81007E3A77 /* Supporting Files */,
|
||||
8055B0391E201C5D009DC3EE /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
803F9CC71B923207002F728F /* Products */ = {
|
||||
8055B0391E201C5D009DC3EE /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
803F9CC61B923207002F728F /* OrderedDictionary.framework */,
|
||||
803F9CEF1B925B1C002F728F /* OrderedDictionary-OSX-Tests.xctest */,
|
||||
806097631B92F20400DB20CF /* OrderedDictionary.framework */,
|
||||
806097711B92F44F00DB20CF /* OrderedDictionary-iOS-Tests.xctest */,
|
||||
8055B0381E201C5D009DC3EE /* OrderedDictionary.framework */,
|
||||
8055B0411E201C5D009DC3EE /* OrderedDictionary_Mac_Tests.xctest */,
|
||||
80B28E971E201EC8007E3A77 /* OrderedDictionary.framework */,
|
||||
80B28E9F1E201EC9007E3A77 /* OrderedDictionary_iOS_Tests.xctest */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
803F9CD11B92324C002F728F /* Sources */ = {
|
||||
8055B0521E201D24009DC3EE /* Sources */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
803F9CD21B92324C002F728F /* OrderedDictionary.h */,
|
||||
803F9CD71B9232EE002F728F /* OrderedDictionary.swift */,
|
||||
80B7BC2B261A65C100EB2CA2 /* OrderedDictionary */,
|
||||
);
|
||||
path = Sources;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
803F9CD31B92324C002F728F /* Supporting Files */ = {
|
||||
8055B0571E201DF3009DC3EE /* Tests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
803F9CFE1B925B56002F728F /* Info-Tests.plist */,
|
||||
803F9CD41B92324C002F728F /* Info.plist */,
|
||||
);
|
||||
path = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
803F9CFB1B925B4C002F728F /* Tests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
803F9CFC1B925B4C002F728F /* OrderedDictionaryTests.swift */,
|
||||
80AF1630252A48080065B656 /* OrderedDictionaryTests */,
|
||||
);
|
||||
path = Tests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
80F94F171B926A60000A96E7 /* Playgrounds */ = {
|
||||
80AF1630252A48080065B656 /* OrderedDictionaryTests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
80F94F181B926A60000A96E7 /* OrderedDictionary.playground */,
|
||||
80BFD01A252B049E002B3C05 /* InitializationTests.swift */,
|
||||
80BFD06F252B0C16002B3C05 /* AccessTests.swift */,
|
||||
80BFD0A7252B1C96002B3C05 /* InsertionsTests.swift */,
|
||||
80BFD07D252B0E19002B3C05 /* UpdatesTests.swift */,
|
||||
80BFD060252B0A7F002B3C05 /* RemovalTests.swift */,
|
||||
80BE57A4252B3F6000F85D45 /* SubscriptAmbiguityTests.swift */,
|
||||
80BFD076252B0D94002B3C05 /* MapFilterTests.swift */,
|
||||
80BFD051252B09DC002B3C05 /* ReorderingTests.swift */,
|
||||
80BFD029252B069F002B3C05 /* SortingTests.swift */,
|
||||
80BFD04A252B0951002B3C05 /* CapacityTests.swift */,
|
||||
80BFD03F252B0740002B3C05 /* CodingTests.swift */,
|
||||
80BFD030252B06EB002B3C05 /* DescriptionTests.swift */,
|
||||
80BE5799252B278D00F85D45 /* XCTUnwrapShim.swift */,
|
||||
);
|
||||
path = Playgrounds;
|
||||
path = OrderedDictionaryTests;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
80B28EB31E201F81007E3A77 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
80B28EB51E201F81007E3A77 /* Info.plist */,
|
||||
80B28EB41E201F81007E3A77 /* Info-Tests.plist */,
|
||||
);
|
||||
path = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
80B7BC2B261A65C100EB2CA2 /* OrderedDictionary */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
80E8E21C1E20301E00395E49 /* OrderedDictionary.swift */,
|
||||
80A203A01F3F483700622481 /* OrderedDictionary+Codable.swift */,
|
||||
80E8E22F1E2133D100395E49 /* OrderedDictionary+Description.swift */,
|
||||
8048C8AA22D8911B0086B88B /* OrderedDictionary+Deprecated.swift */,
|
||||
80BE57D3252BAB9400F85D45 /* OrderedDictionarySlice.swift */,
|
||||
80BE57DE252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift */,
|
||||
);
|
||||
path = OrderedDictionary;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
803F9CC31B923207002F728F /* Headers */ = {
|
||||
8055B0351E201C5D009DC3EE /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
803F9CD51B92324C002F728F /* OrderedDictionary.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
806097601B92F20400DB20CF /* Headers */ = {
|
||||
80B28E941E201EC8007E3A77 /* Headers */ = {
|
||||
isa = PBXHeadersBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8060976C1B92F2D900DB20CF /* OrderedDictionary.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXHeadersBuildPhase section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
803F9CC51B923207002F728F /* OrderedDictionary-OSX */ = {
|
||||
8055B0371E201C5D009DC3EE /* OrderedDictionary-Mac */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 803F9CCE1B923207002F728F /* Build configuration list for PBXNativeTarget "OrderedDictionary-OSX" */;
|
||||
buildConfigurationList = 8055B04C1E201C5D009DC3EE /* Build configuration list for PBXNativeTarget "OrderedDictionary-Mac" */;
|
||||
buildPhases = (
|
||||
803F9CC11B923207002F728F /* Sources */,
|
||||
803F9CC21B923207002F728F /* Frameworks */,
|
||||
803F9CC31B923207002F728F /* Headers */,
|
||||
803F9CC41B923207002F728F /* Resources */,
|
||||
8055B0331E201C5D009DC3EE /* Sources */,
|
||||
8055B0341E201C5D009DC3EE /* Frameworks */,
|
||||
8055B0351E201C5D009DC3EE /* Headers */,
|
||||
8055B0361E201C5D009DC3EE /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "OrderedDictionary-OSX";
|
||||
name = "OrderedDictionary-Mac";
|
||||
productName = OrderedDictionary;
|
||||
productReference = 803F9CC61B923207002F728F /* OrderedDictionary.framework */;
|
||||
productReference = 8055B0381E201C5D009DC3EE /* OrderedDictionary.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
803F9CEE1B925B1C002F728F /* OrderedDictionary-OSX-Tests */ = {
|
||||
8055B0401E201C5D009DC3EE /* OrderedDictionary-Mac-Tests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 803F9CF71B925B1C002F728F /* Build configuration list for PBXNativeTarget "OrderedDictionary-OSX-Tests" */;
|
||||
buildConfigurationList = 8055B04F1E201C5D009DC3EE /* Build configuration list for PBXNativeTarget "OrderedDictionary-Mac-Tests" */;
|
||||
buildPhases = (
|
||||
803F9CEB1B925B1C002F728F /* Sources */,
|
||||
803F9CEC1B925B1C002F728F /* Frameworks */,
|
||||
803F9CED1B925B1C002F728F /* Resources */,
|
||||
803F9CFF1B925BA2002F728F /* CopyFiles */,
|
||||
8055B03D1E201C5D009DC3EE /* Sources */,
|
||||
8055B03E1E201C5D009DC3EE /* Frameworks */,
|
||||
8055B03F1E201C5D009DC3EE /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
803F9CF61B925B1C002F728F /* PBXTargetDependency */,
|
||||
8055B0441E201C5D009DC3EE /* PBXTargetDependency */,
|
||||
);
|
||||
name = "OrderedDictionary-OSX-Tests";
|
||||
name = "OrderedDictionary-Mac-Tests";
|
||||
productName = OrderedDictionaryTests;
|
||||
productReference = 803F9CEF1B925B1C002F728F /* OrderedDictionary-OSX-Tests.xctest */;
|
||||
productReference = 8055B0411E201C5D009DC3EE /* OrderedDictionary_Mac_Tests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
806097621B92F20400DB20CF /* OrderedDictionary-iOS */ = {
|
||||
80B28E961E201EC8007E3A77 /* OrderedDictionary-iOS */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 806097681B92F20400DB20CF /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS" */;
|
||||
buildConfigurationList = 80B28EA81E201EC9007E3A77 /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS" */;
|
||||
buildPhases = (
|
||||
8060975E1B92F20400DB20CF /* Sources */,
|
||||
8060975F1B92F20400DB20CF /* Frameworks */,
|
||||
806097601B92F20400DB20CF /* Headers */,
|
||||
806097611B92F20400DB20CF /* Resources */,
|
||||
80B28E921E201EC8007E3A77 /* Sources */,
|
||||
80B28E931E201EC8007E3A77 /* Frameworks */,
|
||||
80B28E941E201EC8007E3A77 /* Headers */,
|
||||
80B28E951E201EC8007E3A77 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -232,95 +284,103 @@
|
||||
);
|
||||
name = "OrderedDictionary-iOS";
|
||||
productName = "OrderedDictionary-iOS";
|
||||
productReference = 806097631B92F20400DB20CF /* OrderedDictionary.framework */;
|
||||
productReference = 80B28E971E201EC8007E3A77 /* OrderedDictionary.framework */;
|
||||
productType = "com.apple.product-type.framework";
|
||||
};
|
||||
806097701B92F44F00DB20CF /* OrderedDictionary-iOS-Tests */ = {
|
||||
80B28E9E1E201EC9007E3A77 /* OrderedDictionary-iOS-Tests */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 806097791B92F44F00DB20CF /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS-Tests" */;
|
||||
buildConfigurationList = 80B28EAB1E201EC9007E3A77 /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS-Tests" */;
|
||||
buildPhases = (
|
||||
8060976D1B92F44F00DB20CF /* Sources */,
|
||||
8060976E1B92F44F00DB20CF /* Frameworks */,
|
||||
8060976F1B92F44F00DB20CF /* Resources */,
|
||||
806097811B92F4F500DB20CF /* CopyFiles */,
|
||||
80B28E9B1E201EC9007E3A77 /* Sources */,
|
||||
80B28E9C1E201EC9007E3A77 /* Frameworks */,
|
||||
80B28E9D1E201EC9007E3A77 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
806097781B92F44F00DB20CF /* PBXTargetDependency */,
|
||||
80B28EA21E201EC9007E3A77 /* PBXTargetDependency */,
|
||||
);
|
||||
name = "OrderedDictionary-iOS-Tests";
|
||||
productName = "OrderedDictionary-iOS-Tests";
|
||||
productReference = 806097711B92F44F00DB20CF /* OrderedDictionary-iOS-Tests.xctest */;
|
||||
productName = "OrderedDictionary-iOSTests";
|
||||
productReference = 80B28E9F1E201EC9007E3A77 /* OrderedDictionary_iOS_Tests.xctest */;
|
||||
productType = "com.apple.product-type.bundle.unit-test";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
803F9CBD1B923207002F728F /* Project object */ = {
|
||||
8055B02F1E201C5D009DC3EE /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 0700;
|
||||
LastUpgradeCheck = 0700;
|
||||
LastSwiftUpdateCheck = 0820;
|
||||
LastUpgradeCheck = 1320;
|
||||
ORGANIZATIONNAME = "Lukas Kubanek";
|
||||
TargetAttributes = {
|
||||
803F9CC51B923207002F728F = {
|
||||
CreatedOnToolsVersion = 7.0;
|
||||
8055B0371E201C5D009DC3EE = {
|
||||
CreatedOnToolsVersion = 8.2.1;
|
||||
LastSwiftMigration = 1020;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
803F9CEE1B925B1C002F728F = {
|
||||
CreatedOnToolsVersion = 7.0;
|
||||
8055B0401E201C5D009DC3EE = {
|
||||
CreatedOnToolsVersion = 8.2.1;
|
||||
LastSwiftMigration = 1020;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
806097621B92F20400DB20CF = {
|
||||
CreatedOnToolsVersion = 7.0;
|
||||
80B28E961E201EC8007E3A77 = {
|
||||
CreatedOnToolsVersion = 8.2.1;
|
||||
LastSwiftMigration = 1020;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
806097701B92F44F00DB20CF = {
|
||||
CreatedOnToolsVersion = 7.0;
|
||||
80B28E9E1E201EC9007E3A77 = {
|
||||
CreatedOnToolsVersion = 8.2.1;
|
||||
LastSwiftMigration = 1020;
|
||||
ProvisioningStyle = Automatic;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 803F9CC01B923207002F728F /* Build configuration list for PBXProject "OrderedDictionary" */;
|
||||
buildConfigurationList = 8055B0321E201C5D009DC3EE /* Build configuration list for PBXProject "OrderedDictionary" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 803F9CBC1B923207002F728F;
|
||||
productRefGroup = 803F9CC71B923207002F728F /* Products */;
|
||||
mainGroup = 8055B02E1E201C5D009DC3EE;
|
||||
productRefGroup = 8055B0391E201C5D009DC3EE /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
803F9CC51B923207002F728F /* OrderedDictionary-OSX */,
|
||||
803F9CEE1B925B1C002F728F /* OrderedDictionary-OSX-Tests */,
|
||||
806097621B92F20400DB20CF /* OrderedDictionary-iOS */,
|
||||
806097701B92F44F00DB20CF /* OrderedDictionary-iOS-Tests */,
|
||||
8055B0371E201C5D009DC3EE /* OrderedDictionary-Mac */,
|
||||
8055B0401E201C5D009DC3EE /* OrderedDictionary-Mac-Tests */,
|
||||
80B28E961E201EC8007E3A77 /* OrderedDictionary-iOS */,
|
||||
80B28E9E1E201EC9007E3A77 /* OrderedDictionary-iOS-Tests */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
803F9CC41B923207002F728F /* Resources */ = {
|
||||
8055B0361E201C5D009DC3EE /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
803F9CED1B925B1C002F728F /* Resources */ = {
|
||||
8055B03F1E201C5D009DC3EE /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
806097611B92F20400DB20CF /* Resources */ = {
|
||||
80B28E951E201EC8007E3A77 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8060976F1B92F44F00DB20CF /* Resources */ = {
|
||||
80B28E9D1E201EC9007E3A77 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -330,71 +390,120 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
803F9CC11B923207002F728F /* Sources */ = {
|
||||
8055B0331E201C5D009DC3EE /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
803F9CD81B9232EE002F728F /* OrderedDictionary.swift in Sources */,
|
||||
8048C8AB22D8911B0086B88B /* OrderedDictionary+Deprecated.swift in Sources */,
|
||||
80E8E2301E2133D100395E49 /* OrderedDictionary+Description.swift in Sources */,
|
||||
80E8E21D1E20301E00395E49 /* OrderedDictionary.swift in Sources */,
|
||||
80BE57D4252BAB9400F85D45 /* OrderedDictionarySlice.swift in Sources */,
|
||||
80A203A11F3F483700622481 /* OrderedDictionary+Codable.swift in Sources */,
|
||||
80BE57DF252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
803F9CEB1B925B1C002F728F /* Sources */ = {
|
||||
8055B03D1E201C5D009DC3EE /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
803F9CFD1B925B4C002F728F /* OrderedDictionaryTests.swift in Sources */,
|
||||
80BFD061252B0A7F002B3C05 /* RemovalTests.swift in Sources */,
|
||||
80BFD031252B06EB002B3C05 /* DescriptionTests.swift in Sources */,
|
||||
80BFD077252B0D94002B3C05 /* MapFilterTests.swift in Sources */,
|
||||
80BFD070252B0C16002B3C05 /* AccessTests.swift in Sources */,
|
||||
80BFD052252B09DC002B3C05 /* ReorderingTests.swift in Sources */,
|
||||
80BFD04B252B0951002B3C05 /* CapacityTests.swift in Sources */,
|
||||
80BFD02A252B069F002B3C05 /* SortingTests.swift in Sources */,
|
||||
80BFD07E252B0E19002B3C05 /* UpdatesTests.swift in Sources */,
|
||||
80BFD0A8252B1C96002B3C05 /* InsertionsTests.swift in Sources */,
|
||||
80BFD040252B0740002B3C05 /* CodingTests.swift in Sources */,
|
||||
80BE57A5252B3F6000F85D45 /* SubscriptAmbiguityTests.swift in Sources */,
|
||||
80BFD01B252B049E002B3C05 /* InitializationTests.swift in Sources */,
|
||||
80BE579A252B278D00F85D45 /* XCTUnwrapShim.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8060975E1B92F20400DB20CF /* Sources */ = {
|
||||
80B28E921E201EC8007E3A77 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8060976B1B92F2D200DB20CF /* OrderedDictionary.swift in Sources */,
|
||||
8048C8AC22D8911B0086B88B /* OrderedDictionary+Deprecated.swift in Sources */,
|
||||
80E8E2311E2133D100395E49 /* OrderedDictionary+Description.swift in Sources */,
|
||||
80E8E21F1E20425B00395E49 /* OrderedDictionary.swift in Sources */,
|
||||
80BE57D5252BAB9400F85D45 /* OrderedDictionarySlice.swift in Sources */,
|
||||
80A203A21F3F4C1F00622481 /* OrderedDictionary+Codable.swift in Sources */,
|
||||
80BE57E0252BADEE00F85D45 /* Dictionary+OrderedDictionary.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
8060976D1B92F44F00DB20CF /* Sources */ = {
|
||||
80B28E9B1E201EC9007E3A77 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8060977C1B92F4A000DB20CF /* OrderedDictionaryTests.swift in Sources */,
|
||||
80BFD062252B0A7F002B3C05 /* RemovalTests.swift in Sources */,
|
||||
80BFD032252B06EB002B3C05 /* DescriptionTests.swift in Sources */,
|
||||
80BFD078252B0D94002B3C05 /* MapFilterTests.swift in Sources */,
|
||||
80BFD071252B0C16002B3C05 /* AccessTests.swift in Sources */,
|
||||
80BFD053252B09DC002B3C05 /* ReorderingTests.swift in Sources */,
|
||||
80BFD04C252B0951002B3C05 /* CapacityTests.swift in Sources */,
|
||||
80BFD02B252B069F002B3C05 /* SortingTests.swift in Sources */,
|
||||
80BFD07F252B0E19002B3C05 /* UpdatesTests.swift in Sources */,
|
||||
80BFD0A9252B1C96002B3C05 /* InsertionsTests.swift in Sources */,
|
||||
80BFD041252B0740002B3C05 /* CodingTests.swift in Sources */,
|
||||
80BE57A6252B3F6000F85D45 /* SubscriptAmbiguityTests.swift in Sources */,
|
||||
80BFD01C252B049E002B3C05 /* InitializationTests.swift in Sources */,
|
||||
80BE579B252B278D00F85D45 /* XCTUnwrapShim.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXTargetDependency section */
|
||||
803F9CF61B925B1C002F728F /* PBXTargetDependency */ = {
|
||||
8055B0441E201C5D009DC3EE /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 803F9CC51B923207002F728F /* OrderedDictionary-OSX */;
|
||||
targetProxy = 803F9CF51B925B1C002F728F /* PBXContainerItemProxy */;
|
||||
target = 8055B0371E201C5D009DC3EE /* OrderedDictionary-Mac */;
|
||||
targetProxy = 8055B0431E201C5D009DC3EE /* PBXContainerItemProxy */;
|
||||
};
|
||||
806097781B92F44F00DB20CF /* PBXTargetDependency */ = {
|
||||
80B28EA21E201EC9007E3A77 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
target = 806097621B92F20400DB20CF /* OrderedDictionary-iOS */;
|
||||
targetProxy = 806097771B92F44F00DB20CF /* PBXContainerItemProxy */;
|
||||
target = 80B28E961E201EC8007E3A77 /* OrderedDictionary-iOS */;
|
||||
targetProxy = 80B28EA11E201EC9007E3A77 /* PBXContainerItemProxy */;
|
||||
};
|
||||
/* End PBXTargetDependency section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
803F9CCC1B923207002F728F /* Debug */ = {
|
||||
8055B04A1E201C5D009DC3EE /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
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;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
@@ -419,29 +528,47 @@
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
803F9CCD1B923207002F728F /* Release */ = {
|
||||
8055B04B1E201C5D009DC3EE /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
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_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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
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;
|
||||
CODE_SIGN_IDENTITY = "-";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
@@ -459,93 +586,99 @@
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = macosx;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
803F9CCF1B923207002F728F /* Debug */ = {
|
||||
8055B04D1E201C5D009DC3EE /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_CODE_COVERAGE = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "Supporting Files/Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MARKETING_VERSION = 4.0.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lukaskubanek.OrderedDictionary;
|
||||
PRODUCT_NAME = OrderedDictionary;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
803F9CD01B923207002F728F /* Release */ = {
|
||||
8055B04E1E201C5D009DC3EE /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_CODE_COVERAGE = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
FRAMEWORK_VERSION = A;
|
||||
INFOPLIST_FILE = "Supporting Files/Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MARKETING_VERSION = 4.0.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lukaskubanek.OrderedDictionary;
|
||||
PRODUCT_NAME = OrderedDictionary;
|
||||
SKIP_INSTALL = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
803F9CF81B925B1C002F728F /* Debug */ = {
|
||||
8055B0501E201C5D009DC3EE /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
INFOPLIST_FILE = "Supporting Files/Info-Tests.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lukaskubanek.OrderedDictionaryTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
803F9CF91B925B1C002F728F /* Release */ = {
|
||||
8055B0511E201C5D009DC3EE /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
INFOPLIST_FILE = "Supporting Files/Info-Tests.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lukaskubanek.OrderedDictionaryTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
806097691B92F20400DB20CF /* Debug */ = {
|
||||
80B28EA91E201EC9007E3A77 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
CLANG_ENABLE_CODE_COVERAGE = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Supporting Files/Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MARKETING_VERSION = 4.0.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lukaskubanek.OrderedDictionary;
|
||||
PRODUCT_NAME = OrderedDictionary;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -554,19 +687,21 @@
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
8060976A1B92F20400DB20CF /* Release */ = {
|
||||
80B28EAA1E201EC9007E3A77 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||
CLANG_ENABLE_CODE_COVERAGE = NO;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
|
||||
DEFINES_MODULE = YES;
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
INFOPLIST_FILE = "Supporting Files/Info.plist";
|
||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MARKETING_VERSION = 4.0.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lukaskubanek.OrderedDictionary;
|
||||
PRODUCT_NAME = OrderedDictionary;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -576,28 +711,26 @@
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
8060977A1B92F44F00DB20CF /* Debug */ = {
|
||||
80B28EAC1E201EC9007E3A77 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
INFOPLIST_FILE = "Supporting Files/Info-Tests.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.lukaskubanek.OrderedDictionary-iOS-Tests";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.lukaskubanek.OrderedDictionary-iOSTests";
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = iphoneos;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
8060977B1B92F44F00DB20CF /* Release */ = {
|
||||
80B28EAD1E201EC9007E3A77 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||
INFOPLIST_FILE = "Supporting Files/Info-Tests.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.lukaskubanek.OrderedDictionary-iOS-Tests";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.lukaskubanek.OrderedDictionary-iOSTests";
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
SDKROOT = iphoneos;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
@@ -606,52 +739,52 @@
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
803F9CC01B923207002F728F /* Build configuration list for PBXProject "OrderedDictionary" */ = {
|
||||
8055B0321E201C5D009DC3EE /* Build configuration list for PBXProject "OrderedDictionary" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
803F9CCC1B923207002F728F /* Debug */,
|
||||
803F9CCD1B923207002F728F /* Release */,
|
||||
8055B04A1E201C5D009DC3EE /* Debug */,
|
||||
8055B04B1E201C5D009DC3EE /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
803F9CCE1B923207002F728F /* Build configuration list for PBXNativeTarget "OrderedDictionary-OSX" */ = {
|
||||
8055B04C1E201C5D009DC3EE /* Build configuration list for PBXNativeTarget "OrderedDictionary-Mac" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
803F9CCF1B923207002F728F /* Debug */,
|
||||
803F9CD01B923207002F728F /* Release */,
|
||||
8055B04D1E201C5D009DC3EE /* Debug */,
|
||||
8055B04E1E201C5D009DC3EE /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
803F9CF71B925B1C002F728F /* Build configuration list for PBXNativeTarget "OrderedDictionary-OSX-Tests" */ = {
|
||||
8055B04F1E201C5D009DC3EE /* Build configuration list for PBXNativeTarget "OrderedDictionary-Mac-Tests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
803F9CF81B925B1C002F728F /* Debug */,
|
||||
803F9CF91B925B1C002F728F /* Release */,
|
||||
8055B0501E201C5D009DC3EE /* Debug */,
|
||||
8055B0511E201C5D009DC3EE /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
806097681B92F20400DB20CF /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS" */ = {
|
||||
80B28EA81E201EC9007E3A77 /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
806097691B92F20400DB20CF /* Debug */,
|
||||
8060976A1B92F20400DB20CF /* Release */,
|
||||
80B28EA91E201EC9007E3A77 /* Debug */,
|
||||
80B28EAA1E201EC9007E3A77 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
806097791B92F44F00DB20CF /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS-Tests" */ = {
|
||||
80B28EAB1E201EC9007E3A77 /* Build configuration list for PBXNativeTarget "OrderedDictionary-iOS-Tests" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
8060977A1B92F44F00DB20CF /* Debug */,
|
||||
8060977B1B92F44F00DB20CF /* Release */,
|
||||
80B28EAC1E201EC9007E3A77 /* Debug */,
|
||||
80B28EAD1E201EC9007E3A77 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 803F9CBD1B923207002F728F /* Project object */;
|
||||
rootObject = 8055B02F1E201C5D009DC3EE /* Project object */;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
+11
-25
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0730"
|
||||
LastUpgradeVersion = "1320"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -11,13 +11,12 @@
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES"
|
||||
hideIssues = "NO">
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "803F9CC51B923207002F728F"
|
||||
BlueprintIdentifier = "8055B0371E201C5D009DC3EE"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-OSX"
|
||||
BlueprintName = "OrderedDictionary-Mac"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
@@ -34,24 +33,13 @@
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "803F9CEE1B925B1C002F728F"
|
||||
BuildableName = "OrderedDictionary-OSX-Tests.xctest"
|
||||
BlueprintName = "OrderedDictionary-OSX-Tests"
|
||||
BlueprintIdentifier = "8055B0401E201C5D009DC3EE"
|
||||
BuildableName = "OrderedDictionary_Mac_Tests.xctest"
|
||||
BlueprintName = "OrderedDictionary-Mac-Tests"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "803F9CC51B923207002F728F"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-OSX"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -66,14 +54,12 @@
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "803F9CC51B923207002F728F"
|
||||
BlueprintIdentifier = "8055B0371E201C5D009DC3EE"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-OSX"
|
||||
BlueprintName = "OrderedDictionary-Mac"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
@@ -84,9 +70,9 @@
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "803F9CC51B923207002F728F"
|
||||
BlueprintIdentifier = "8055B0371E201C5D009DC3EE"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-OSX"
|
||||
BlueprintName = "OrderedDictionary-Mac"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0730"
|
||||
LastUpgradeVersion = "1320"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -11,11 +11,10 @@
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES"
|
||||
hideIssues = "NO">
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "806097621B92F20400DB20CF"
|
||||
BlueprintIdentifier = "80B28E961E201EC8007E3A77"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-iOS"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
@@ -27,31 +26,19 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
codeCoverageEnabled = "YES">
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
<TestableReference
|
||||
skipped = "NO">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "806097701B92F44F00DB20CF"
|
||||
BuildableName = "OrderedDictionary-iOS-Tests.xctest"
|
||||
BlueprintIdentifier = "80B28E9E1E201EC9007E3A77"
|
||||
BuildableName = "OrderedDictionary_iOS_Tests.xctest"
|
||||
BlueprintName = "OrderedDictionary-iOS-Tests"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</TestableReference>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "806097621B92F20400DB20CF"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-iOS"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -66,14 +53,12 @@
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "806097621B92F20400DB20CF"
|
||||
BlueprintIdentifier = "80B28E961E201EC8007E3A77"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-iOS"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
@@ -84,7 +69,7 @@
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "806097621B92F20400DB20CF"
|
||||
BlueprintIdentifier = "80B28E961E201EC8007E3A77"
|
||||
BuildableName = "OrderedDictionary.framework"
|
||||
BlueprintName = "OrderedDictionary-iOS"
|
||||
ReferencedContainer = "container:OrderedDictionary.xcodeproj">
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
// swift-tools-version:5.0
|
||||
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "OrderedDictionary",
|
||||
products: [
|
||||
.library(
|
||||
name: "OrderedDictionary",
|
||||
targets: ["OrderedDictionary"]
|
||||
)
|
||||
],
|
||||
dependencies: [],
|
||||
targets: [
|
||||
.target(
|
||||
name: "OrderedDictionary",
|
||||
dependencies: []
|
||||
),
|
||||
.testTarget(
|
||||
name: "OrderedDictionaryTests",
|
||||
dependencies: ["OrderedDictionary"]
|
||||
)
|
||||
]
|
||||
)
|
||||
@@ -1,129 +0,0 @@
|
||||
// Import the framework
|
||||
import OrderedDictionary
|
||||
|
||||
// ======================================================= //
|
||||
// CONSTRUCTION
|
||||
// ======================================================= //
|
||||
|
||||
// Construct an ordered dictionary using a dictionary literal
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3, "D": 4]
|
||||
print(orderedDictionary) // => [A: 1, B: 2, C: 3, D: 4]
|
||||
|
||||
// ======================================================= //
|
||||
// LOOPING
|
||||
// ======================================================= //
|
||||
|
||||
// Loop through the ordered dictionary
|
||||
for (key, value) in orderedDictionary {
|
||||
print("[\(key): \(value)]") // => [A: 1], => [B: 2], => [C: 3], => [D: 4]
|
||||
}
|
||||
|
||||
// Loop through the ordered dictionary with an additional index
|
||||
for (index, (key, value)) in orderedDictionary.enumerate() {
|
||||
print("(\(index): [\(key): \(value)])") // => (0: [A: 1]), => (1: [B: 2]), => (2: [C: 3]), => (3: [D: 4])
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// ACCESSING CONTENT
|
||||
// ======================================================= //
|
||||
|
||||
// Access the value for an existing key using subscript
|
||||
print(orderedDictionary["A"]) // => Optional(1)
|
||||
|
||||
// Access the value for a non-existent key
|
||||
print(orderedDictionary["X"]) // => nil
|
||||
|
||||
// Access the value for a key using method
|
||||
print(orderedDictionary.valueForKey("A")) // => Optional(1)
|
||||
|
||||
// Access the value for a non-existent key
|
||||
print(orderedDictionary.valueForKey("X")) // => nil
|
||||
|
||||
// Access the key-value pair (element) at an existing index
|
||||
print(orderedDictionary[2]) // => ("C", 3)
|
||||
|
||||
// Access the key-value pair (element) at a non-existent index
|
||||
//print(orderedDictionary[10]) // => fatal error
|
||||
|
||||
// Get the index for an existing key
|
||||
print(orderedDictionary.indexForKey("D")) // => Optional(3)
|
||||
|
||||
// ======================================================= //
|
||||
// MODIFYING CONTENT USING KEYS
|
||||
// ======================================================= //
|
||||
|
||||
// Modify the value for an existing key using subscript
|
||||
orderedDictionary["A"] = 100
|
||||
print(orderedDictionary["A"]) // => Optional(100)
|
||||
|
||||
// Modify the value for an existing key using method
|
||||
orderedDictionary.updateValue(42, forKey: "D")
|
||||
print(orderedDictionary["D"]) // => Optional(42)
|
||||
|
||||
// Set a value for an non-existent key
|
||||
orderedDictionary["E"] = 5
|
||||
print(orderedDictionary) // => [A: 100, B: 2, C: 3, D: 42, E: 5]
|
||||
|
||||
// Set nil value for an existing key
|
||||
orderedDictionary["B"] = nil
|
||||
print(orderedDictionary["B"]) // => nil
|
||||
print(orderedDictionary) // => [A: 100, C: 3, D: 42, E: 5]
|
||||
|
||||
// ======================================================= //
|
||||
// MODIFYING CONTENT USING INDEXES
|
||||
// ======================================================= //
|
||||
|
||||
// Modify the existing element at index using subscript
|
||||
orderedDictionary[2] = ("F", 235)
|
||||
print(orderedDictionary[2]) // => ("F", 235)
|
||||
print(orderedDictionary) // => [A: 100, C: 3, F: 235, E: 5]
|
||||
|
||||
// Modify the existing element at index using method
|
||||
let previousElement = orderedDictionary.updateElement(("K", 12), atIndex: 1)
|
||||
print(orderedDictionary[1]) // => ("K", 12)
|
||||
print(previousElement) // => Optional("C", 3)
|
||||
print(orderedDictionary) // => [A: 100, K: 12, F: 235, E: 5]
|
||||
|
||||
// Set an element to a non-existent index
|
||||
//orderedDictionary[100] = ("L", 0) // => fatal error
|
||||
|
||||
// ======================================================= //
|
||||
// SORTING
|
||||
// ======================================================= //
|
||||
|
||||
// Sort the ordered dictionary using a closure
|
||||
orderedDictionary.sortInPlace { (element1: (key: String, value: Int), element2: (key: String, value: Int)) -> Bool in
|
||||
if element1.value == element2.value {
|
||||
return element1.key < element2.key
|
||||
} else {
|
||||
return element1.value < element2.value
|
||||
}
|
||||
}
|
||||
print(orderedDictionary) // => [E: 5, K: 12, A: 100, F: 235]
|
||||
|
||||
// ======================================================= //
|
||||
// REMOVING CONTENT
|
||||
// ======================================================= //
|
||||
|
||||
// Remove value for an existing key
|
||||
let removedValue = orderedDictionary.removeValueForKey("F")
|
||||
print(removedValue) // => Optional(235)
|
||||
print(orderedDictionary["F"]) // => nil
|
||||
print(orderedDictionary) // => [E: 5, K: 12, A: 100]
|
||||
|
||||
// Remove value for a non-existent key
|
||||
orderedDictionary.removeValueForKey("X")
|
||||
print(orderedDictionary) // => [E: 5, K: 12, A: 100]
|
||||
|
||||
// Remove element at an existing index
|
||||
let removedElement = orderedDictionary.removeAtIndex(1)
|
||||
print(removedElement) // => Optional((K, 12))
|
||||
print(orderedDictionary) // => [E: 5, A: 100]
|
||||
|
||||
// Remove element at a non-existent index
|
||||
orderedDictionary.removeAtIndex(42)
|
||||
print(orderedDictionary) // => [E: 5, A: 100]
|
||||
|
||||
// Remove all elements
|
||||
orderedDictionary.removeAll()
|
||||
print(orderedDictionary) // => [:]
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<playground version='5.0' target-platform='osx'>
|
||||
<timeline fileName='timeline.xctimeline'/>
|
||||
</playground>
|
||||
@@ -1,72 +1,86 @@
|
||||
# OrderedDictionary
|
||||
|
||||
[![][image-1]][1] [![][image-2]][2] [![][image-3]][3] ![][image-4] [![][image-5]][4] [![][image-6]][5]
|
||||
<p align="left">
|
||||
<a href="https://github.com/lukaskubanek/OrderedDictionary/releases">
|
||||
<img src="https://img.shields.io/github/release/lukaskubanek/OrderedDictionary/all.svg?style=flat-square">
|
||||
</a>
|
||||
<a href="https://developer.apple.com/swift">
|
||||
<img src="https://img.shields.io/badge/Swift-5.0-orange.svg?style=flat-square" alt="Swift 5.0">
|
||||
</a>
|
||||
<a href="https://swift.org/package-manager">
|
||||
<img src="https://img.shields.io/badge/SPM-compatible-brightgreen.svg?style=flat-square" alt="Swift Package Manager">
|
||||
</a>
|
||||
<a href="https://github.com/Carthage/Carthage">
|
||||
<img src="https://img.shields.io/badge/Carthage-compatible-brightgreen.svg?style=flat-square" alt="Carthage">
|
||||
</a>
|
||||
<a href="LICENSE.md">
|
||||
<img src="https://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat-square" alt="License: MIT">
|
||||
</a>
|
||||
<a href="https://twitter.com/lukaskubanek">
|
||||
<img src="https://img.shields.io/badge/contact-@lukaskubanek-olive.svg?style=flat-square" alt="Twitter: @lukaskubanek">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
**OrderedDictionary** is a lightweight implementation of an ordered dictionary data structure in Swift.
|
||||
OrderedDictionary is a lightweight implementation of an ordered dictionary data structure in Swift.
|
||||
|
||||
The `OrderedDictionary` structure is an immutable generic collection which combines the features of `Dictionary` and `Array` from the Swift standard library. Like `Dictionary` it stores key-value pairs and maps each key to a value. Like `Array` it stores those pairs sorted and accessible by a zero-based integer index.
|
||||
The `OrderedDictionary<Key: Hashable, Value>` struct is a generic collection that combines the features of the `Dictionary` and `Array` data structures from the Swift standard library. Like `Dictionary`, it stores key-value pairs with each key being unique and maps each key to an associated value. Like `Array`, it stores those pairs sorted and accessible by a zero-based integer index.
|
||||
|
||||
`OrderedDictionary` provides similar APIs like collections in the Swift standard library. This includes accessing contents by keys or indexes, inserting and removing elements, iterating, sorting etc.
|
||||
`OrderedDictionary` provides similar APIs to collections available in the Swift standard library like accessing contents by keys or indices, inserting and removing elements, iterating, sorting, transforming, filtering, etc.
|
||||
|
||||
Internally `OrderedDictionary` uses a backing store composed of an instance of `Dictionary` for storing the key-value pairs and an instance of `Array` for managing the ordered keys. This means it is not the most performant implementation possible, but it gets its job done by reusing most functionality from the Swift standard library.
|
||||
Internally, `OrderedDictionary` uses backing storage composed of a `Dictionary` for storing the key-value pairs and an `Array` for managing the ordered keys. This is certainly not the most performant implementation one can achieve, but it gets its job done while reusing most functionality from the Swift standard library.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Swift 2.2+
|
||||
- Xcode 7.3
|
||||
- iOS 8.0+ / OS X 10.10+
|
||||
- Swift 5.0 or later
|
||||
- Xcode 11 or later
|
||||
- iOS 8 or later / macOS 10.10 or later
|
||||
|
||||
*For support of older Swift versions, please refer to older versions of this library. For Swift 4.2, use version 3.x, and for Swift 4.0-4.1, use version 2.x.*
|
||||
|
||||
*The requirements for Xcode and OS versions only apply when the library is integrated as a framework or via the Xcode project.*
|
||||
|
||||
## Installation
|
||||
|
||||
This library is distributed as a Swift framework and can be integrated into your project in following ways:
|
||||
### Swift Package Manager
|
||||
|
||||
To install OrderedDictionary using the [Swift Package Manager](https://swift.org/package-manager/), add it as a dependency into your `Package.swift` file:
|
||||
|
||||
```swift
|
||||
let package = Package(
|
||||
...
|
||||
dependencies: [
|
||||
.package(url: "https://github.com/lukaskubanek/OrderedDictionary.git", from: "4.0.0")
|
||||
],
|
||||
...
|
||||
)
|
||||
```
|
||||
|
||||
### Carthage
|
||||
|
||||
The easiest way is to use the package manager [Carthage][6].
|
||||
To install OrderedDictionary using [Carthage](https://github.com/Carthage/Carthage), add it as a dependency into your `Cartfile`:
|
||||
|
||||
1. Add `github "lukaskubanek/OrderedDictionary"` to your `Cartfile`.
|
||||
2. Run `carthage bootstrap`.
|
||||
3. Drag either the `OrderedDictionary.xcodeproj` or the `OrderedDictionary.framework` into your project/workspace and link your target against the `OrderedDictionary.framework`.
|
||||
4. Make sure the framework [gets copied][7] to your application bundle.
|
||||
5. Import the framework using `import OrderedDictionary`.
|
||||
```plain
|
||||
github "lukaskubanek/OrderedDictionary" ~> 4.0
|
||||
```
|
||||
|
||||
### Submodule & Xcode Project
|
||||
Then drag either the `OrderedDictionary.xcodeproj` or the `OrderedDictionary.framework` into your Xcode project/workspace and link your target against the `OrderedDictionary.framework`. Make sure that the framework [gets copied](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) to your application bundle.
|
||||
|
||||
Another option is to use [Git submodules][8] and integrating the Xcode project `OrderedDictionary.xcodeproj` directly to your Xcode workspace.
|
||||
### Git Submodules
|
||||
|
||||
## Usage
|
||||
You can also install OrderedDictionary via [Git submodules](http://git-scm.com/book/en/v2/Git-Tools-Submodules) and integrate the project `OrderedDictionary.xcodeproj` from the submodule directly into your Xcode workspace.
|
||||
|
||||
For the usage of this library please refer to the [example playground][9].
|
||||
### Note About CocoaPods
|
||||
|
||||
Although there has been a high demand for [CocoaPods](https://cocoapods.org) support, this distribution method won't be officially supported by this library. If you really want to integrate this library via CocoaPods, you can create and maintain a custom podspec (see the last section of [this post](https://guides.cocoapods.org/syntax/podfile.html#pod)).
|
||||
|
||||
## Usage & Docs
|
||||
|
||||
For the explanation of the API of `OrderedDictionary` and examples on how to use this data structure, please refer to the [documentation comments](Sources/OrderedDictionary/OrderedDictionary.swift) or the [comprehensive test suite](Tests/OrderedDictionaryTests).
|
||||
|
||||
## Changelog
|
||||
|
||||
The changelog is managed on the [GitHub releases page][10].
|
||||
To view the changelog, refer to GitHub's [releases page](https://github.com/lukaskubanek/OrderedDictionary/releases). If you're upgrading from version 3.x, you might want to check out the list of changes made in [version 4.0](https://github.com/lukaskubanek/OrderedDictionary/releases/tag/v4.0.0).
|
||||
|
||||
## Author
|
||||
## Credits
|
||||
|
||||
Lukas Kubanek // [lukaskubanek.com][11] // [@kubanekl][12]
|
||||
|
||||
## License
|
||||
|
||||
**OrderedDictionary** is provided under the [MIT License][13].
|
||||
|
||||
[1]: https://travis-ci.org/lukaskubanek/OrderedDictionary
|
||||
[2]: https://github.com/lukaskubanek/OrderedDictionary/releases
|
||||
[3]: https://developer.apple.com/swift/
|
||||
[4]: https://github.com/Carthage/Carthage
|
||||
[5]: LICENSE.md
|
||||
[6]: https://github.com/Carthage/Carthage
|
||||
[7]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application
|
||||
[8]: http://git-scm.com/book/en/v2/Git-Tools-Submodules
|
||||
[9]: Playgrounds/OrderedDictionary.playground/Contents.swift
|
||||
[10]: https://github.com/lukaskubanek/OrderedDictionary/releases
|
||||
[11]: http://lukaskubanek.com
|
||||
[12]: https://twitter.com/kubanekl
|
||||
[13]: LICENSE.md
|
||||
|
||||
[image-1]: https://img.shields.io/travis/lukaskubanek/OrderedDictionary.svg?style=flat-square "Build"
|
||||
[image-2]: https://img.shields.io/github/release/lukaskubanek/OrderedDictionary.svg?style=flat-square
|
||||
[image-3]: https://img.shields.io/badge/Swift-2.2-orange.svg?style=flat-square "Swift 2.2"
|
||||
[image-4]: https://img.shields.io/badge/platform-osx/ios-yellowgreen.svg?style=flat-square "Platform: OS X, iOS"
|
||||
[image-5]: https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat-square "Carthage compatible"
|
||||
[image-6]: https://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat-square "License: MIT"
|
||||
OrderedDictionary was built by [@lukaskubanek](https://twitter.com/lukaskubanek), the founder and developer of [Diagrams](https://diagrams.app), a native diagram editor for Mac. This data structure is being used extensively for powering Diagrams' data model.
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
//
|
||||
// OrderedDictionary.h
|
||||
// OrderedDictionary
|
||||
//
|
||||
// Created by Lukas Kubanek on 29/08/15.
|
||||
// Copyright © 2015 Lukas Kubanek. All rights reserved.
|
||||
//
|
||||
@@ -1,286 +0,0 @@
|
||||
//
|
||||
// OrderedDictionary.swift
|
||||
// OrderedDictionary
|
||||
//
|
||||
// Created by Lukas Kubanek on 29/08/15.
|
||||
// Copyright © 2015 Lukas Kubanek. All rights reserved.
|
||||
//
|
||||
|
||||
public struct OrderedDictionary<Key: Hashable, Value>: MutableCollectionType {
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Type Aliases
|
||||
// ======================================================= //
|
||||
|
||||
public typealias Element = (Key, Value)
|
||||
|
||||
public typealias Index = Int
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Initialization
|
||||
// ======================================================= //
|
||||
|
||||
public init() {}
|
||||
|
||||
public init(elements: [Element]) {
|
||||
for (key, value) in elements {
|
||||
self[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Accessing Keys & Values
|
||||
// ======================================================= //
|
||||
|
||||
public var orderedKeys: [Key] {
|
||||
return _orderedKeys
|
||||
}
|
||||
|
||||
public var orderedValues: [Value] {
|
||||
return _orderedKeys.flatMap { _keysToValues[$0] }
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Managing Content Using Keys
|
||||
// ======================================================= //
|
||||
|
||||
public subscript(key: Key) -> Value? {
|
||||
get {
|
||||
return valueForKey(key)
|
||||
}
|
||||
set(newValue) {
|
||||
if let newValue = newValue {
|
||||
updateValue(newValue, forKey: key)
|
||||
} else {
|
||||
removeValueForKey(key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func containsKey(key: Key) -> Bool {
|
||||
return _orderedKeys.contains(key)
|
||||
}
|
||||
|
||||
public func valueForKey(key: Key) -> Value? {
|
||||
return _keysToValues[key]
|
||||
}
|
||||
|
||||
public mutating func updateValue(value: Value, forKey key: Key) -> Value? {
|
||||
if _orderedKeys.contains(key) {
|
||||
guard let currentValue = _keysToValues[key] else {
|
||||
fatalError("Inconsistency error occured in OrderedDictionary")
|
||||
}
|
||||
|
||||
_keysToValues[key] = value
|
||||
|
||||
return currentValue
|
||||
} else {
|
||||
_orderedKeys.append(key)
|
||||
_keysToValues[key] = value
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
public mutating func removeValueForKey(key: Key) -> Value? {
|
||||
if let index = _orderedKeys.indexOf(key) {
|
||||
guard let currentValue = _keysToValues[key] else {
|
||||
fatalError("Inconsistency error occured in OrderedDictionary")
|
||||
}
|
||||
|
||||
_orderedKeys.removeAtIndex(index)
|
||||
_keysToValues[key] = nil
|
||||
|
||||
return currentValue
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
public mutating func removeAll(keepCapacity keepCapacity: Bool = true) {
|
||||
_orderedKeys.removeAll(keepCapacity: keepCapacity)
|
||||
_keysToValues.removeAll(keepCapacity: keepCapacity)
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Managing Content Using Indexes
|
||||
// ======================================================= //
|
||||
|
||||
public subscript(index: Index) -> Element {
|
||||
get {
|
||||
guard let element = elementAtIndex(index) else {
|
||||
fatalError("OrderedDictionary index out of range")
|
||||
}
|
||||
|
||||
return element
|
||||
}
|
||||
set(newValue) {
|
||||
updateElement(newValue, atIndex: index)
|
||||
}
|
||||
}
|
||||
|
||||
public func indexForKey(key: Key) -> Index? {
|
||||
return _orderedKeys.indexOf(key)
|
||||
}
|
||||
|
||||
public func elementAtIndex(index: Index) -> Element? {
|
||||
guard _orderedKeys.indices.contains(index) else { return nil }
|
||||
|
||||
let key = _orderedKeys[index]
|
||||
|
||||
guard let value = self._keysToValues[key] else {
|
||||
fatalError("Inconsistency error occured in OrderedDictionary")
|
||||
}
|
||||
|
||||
return (key, value)
|
||||
}
|
||||
|
||||
public mutating func insertElementWithKey(key: Key, value: Value, atIndex index: Index) -> Value? {
|
||||
return insertElement((key, value), atIndex: index)
|
||||
}
|
||||
|
||||
public mutating func insertElement(newElement: Element, atIndex index: Index) -> Value? {
|
||||
guard index >= 0 else {
|
||||
fatalError("Negative OrderedDictionary index is out of range")
|
||||
}
|
||||
|
||||
guard index <= count else {
|
||||
fatalError("OrderedDictionary index out of range")
|
||||
}
|
||||
|
||||
let (key, value) = newElement
|
||||
|
||||
let adjustedIndex: Int
|
||||
let currentValue: Value?
|
||||
|
||||
if let currentIndex = _orderedKeys.indexOf(key) {
|
||||
currentValue = _keysToValues[key]
|
||||
adjustedIndex = (currentIndex < index - 1) ? index - 1 : index
|
||||
|
||||
_orderedKeys.removeAtIndex(currentIndex)
|
||||
_keysToValues[key] = nil
|
||||
} else {
|
||||
currentValue = nil
|
||||
adjustedIndex = index
|
||||
}
|
||||
|
||||
_orderedKeys.insert(key, atIndex: adjustedIndex)
|
||||
_keysToValues[key] = value
|
||||
|
||||
return currentValue
|
||||
}
|
||||
|
||||
public mutating func updateElement(element: Element, atIndex index: Index) -> Element? {
|
||||
guard let currentElement = elementAtIndex(index) else {
|
||||
fatalError("OrderedDictionary index out of range")
|
||||
}
|
||||
|
||||
let (newKey, newValue) = element
|
||||
|
||||
_orderedKeys[index] = newKey
|
||||
_keysToValues[newKey] = newValue
|
||||
|
||||
return currentElement
|
||||
}
|
||||
|
||||
public mutating func removeAtIndex(index: Index) -> Element? {
|
||||
if let element = elementAtIndex(index) {
|
||||
_orderedKeys.removeAtIndex(index)
|
||||
_keysToValues.removeValueForKey(element.0)
|
||||
|
||||
return element
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - CollectionType Conformance
|
||||
// ======================================================= //
|
||||
|
||||
public var startIndex: Index {
|
||||
return _orderedKeys.startIndex
|
||||
}
|
||||
|
||||
public var endIndex: Index {
|
||||
return _orderedKeys.endIndex
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Internal Backing Store
|
||||
// ======================================================= //
|
||||
|
||||
/// The backing store for the ordered keys.
|
||||
private var _orderedKeys = [Key]()
|
||||
|
||||
/// The backing store for the mapping of keys to values.
|
||||
private var _keysToValues = [Key: Value]()
|
||||
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Initializations from Literals
|
||||
// ======================================================= //
|
||||
|
||||
extension OrderedDictionary: ArrayLiteralConvertible {
|
||||
|
||||
public init(arrayLiteral elements: Element...) {
|
||||
self.init(elements: elements)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension OrderedDictionary: DictionaryLiteralConvertible {
|
||||
|
||||
public init(dictionaryLiteral elements: Element...) {
|
||||
self.init(elements: elements)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Description
|
||||
// ======================================================= //
|
||||
|
||||
extension OrderedDictionary: CustomStringConvertible, CustomDebugStringConvertible {
|
||||
|
||||
public var description: String {
|
||||
return constructDescription(debug: false)
|
||||
}
|
||||
|
||||
public var debugDescription: String {
|
||||
return constructDescription(debug: true)
|
||||
}
|
||||
|
||||
private func constructDescription(debug debug: Bool) -> String {
|
||||
// The implementation of the description is inspired by zwaldowski's implementation of the ordered dictionary.
|
||||
// See http://bit.ly/1VL4JUR
|
||||
|
||||
if isEmpty { return "[:]" }
|
||||
|
||||
func descriptionForItem(item: Any) -> String {
|
||||
var description = ""
|
||||
|
||||
if debug {
|
||||
debugPrint(item, separator: "", terminator: "", toStream: &description)
|
||||
} else {
|
||||
print(item, separator: "", terminator: "", toStream: &description)
|
||||
}
|
||||
|
||||
return description
|
||||
}
|
||||
|
||||
let bodyComponents = map({ (key: Key, value: Value) -> String in
|
||||
return descriptionForItem(key) + ": " + descriptionForItem(value)
|
||||
})
|
||||
|
||||
let body = bodyComponents.joinWithSeparator(", ")
|
||||
|
||||
return "[\(body)]"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public func == <Key: Equatable, Value: Equatable>(lhs: OrderedDictionary<Key, Value>, rhs: OrderedDictionary<Key, Value>) -> Bool {
|
||||
return lhs._orderedKeys == rhs._orderedKeys && lhs._keysToValues == rhs._keysToValues
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
extension Dictionary {
|
||||
|
||||
/// Returns an ordered dictionary containing the key-value pairs from the dictionary, sorted
|
||||
/// using the given sort function.
|
||||
///
|
||||
/// - Parameters:
|
||||
/// - areInIncreasingOrder: The sort function which compares the key-value pairs.
|
||||
/// - Returns: The ordered dictionary.
|
||||
///
|
||||
/// - SeeAlso: `OrderedDictionary.init(unsorted:areInIncreasingOrder:)`
|
||||
public func sorted(
|
||||
by areInIncreasingOrder: (Element, Element) throws -> Bool
|
||||
) rethrows -> OrderedDictionary<Key, Value> {
|
||||
return try OrderedDictionary(
|
||||
unsorted: self,
|
||||
areInIncreasingOrder: areInIncreasingOrder
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
extension OrderedDictionary: Encodable where Key: Encodable, Value: Encodable {
|
||||
|
||||
/// Encodes the contents of this ordered dictionary into the given encoder.
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
// Encode the ordered dictionary as an array of alternating key-value pairs.
|
||||
var container = encoder.unkeyedContainer()
|
||||
|
||||
for (key, value) in self {
|
||||
try container.encode(key)
|
||||
try container.encode(value)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension OrderedDictionary: Decodable where Key: Decodable, Value: Decodable {
|
||||
|
||||
/// Creates a new ordered dictionary by decoding from the given decoder.
|
||||
public init(from decoder: Decoder) throws {
|
||||
// Decode the ordered dictionary from an array of alternating key-value pairs.
|
||||
self.init()
|
||||
|
||||
var container = try decoder.unkeyedContainer()
|
||||
|
||||
while !container.isAtEnd {
|
||||
let key = try container.decode(Key.self)
|
||||
guard !container.isAtEnd else { throw DecodingError.unkeyedContainerReachedEndBeforeValue(decoder.codingPath) }
|
||||
let value = try container.decode(Value.self)
|
||||
|
||||
self[key] = value
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension DecodingError {
|
||||
|
||||
fileprivate static func unkeyedContainerReachedEndBeforeValue(
|
||||
_ codingPath: [CodingKey]
|
||||
) -> DecodingError {
|
||||
return DecodingError.dataCorrupted(
|
||||
DecodingError.Context(
|
||||
codingPath: codingPath,
|
||||
debugDescription: "Unkeyed container reached end before value in key-value pair."
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
extension OrderedDictionary {
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Initialization
|
||||
// ============================================================================ //
|
||||
|
||||
@available(*, deprecated, message: "Please use init(values:uniquelyKeyedBy:).", renamed: "init(values:uniquelyKeyedBy:)")
|
||||
public init<S: Sequence>(
|
||||
values: S,
|
||||
keyedBy extractKey: (Value) -> Key
|
||||
) where S.Element == Value {
|
||||
self.init(values: values, uniquelyKeyedBy: extractKey)
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "Please use init(values:uniquelyKeyedBy:).", renamed: "init(values:uniquelyKeyedBy:)")
|
||||
public init(
|
||||
values: [Value],
|
||||
keyedBy keyPath: KeyPath<Value, Key>
|
||||
) {
|
||||
self.init(values: values, uniquelyKeyedBy: keyPath)
|
||||
}
|
||||
|
||||
@available(*, deprecated, message: "Please use init(uniqueKeysWithValues:).", renamed: "init(uniqueKeysWithValues:)")
|
||||
public init<S: Sequence>(_ elements: S) where S.Element == Element {
|
||||
self.init(uniqueKeysWithValues: elements)
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Insertion Checks
|
||||
// ============================================================================ //
|
||||
|
||||
/// Checks whether the given key-value pair can be inserted into to ordered dictionary
|
||||
/// by validating the presence of the key.
|
||||
///
|
||||
/// - Parameters:
|
||||
/// - newElement: The key-value pair to be inserted into the ordered dictionary.
|
||||
/// - Returns: `true` if the key-value pair can be safely inserted; otherwise, `false`.
|
||||
///
|
||||
/// - SeeAlso: `canInsert(key:)`
|
||||
/// - SeeAlso: `canInsert(at:)`
|
||||
@available(*, deprecated, message: "Use canInsert(key:) with the element's key instead.")
|
||||
public func canInsert(_ newElement: Element) -> Bool {
|
||||
return canInsert(key: newElement.key)
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Moving Elements
|
||||
// ============================================================================ //
|
||||
|
||||
/// Moves an existing key-value pair specified by the given key to the new index by removing
|
||||
/// it from its original index first and inserting it at the new index. If the movement is
|
||||
/// actually performed, the previous index of the key-value pair is returned. Otherwise, `nil`
|
||||
/// is returned.
|
||||
///
|
||||
/// - Parameters:
|
||||
/// - key: The key specifying the key-value pair to move.
|
||||
/// - newIndex: The new index the key-value pair should be moved to.
|
||||
/// - Returns: The previous index of the key-value pair if it was sucessfully moved.
|
||||
@available(*, deprecated, message: "Since the concrete behavior of the element movement highly depends on concrete use cases, its official support will be dropped in the future. Please use the public API for modeling a move operation instead.")
|
||||
@discardableResult
|
||||
public mutating func moveElement(forKey key: Key, to newIndex: Index) -> Index? {
|
||||
// Load the previous index and return nil if the index is not found.
|
||||
guard let previousIndex = index(forKey: key) else { return nil }
|
||||
|
||||
// If the previous and new indices match, treat it as if the movement was already
|
||||
// performed.
|
||||
guard previousIndex != newIndex else { return previousIndex }
|
||||
|
||||
// Remove the value for the key at its original index.
|
||||
let value = removeValue(forKey: key)!
|
||||
|
||||
// Validate the new index.
|
||||
precondition(canInsert(at: newIndex), "Cannot move to invalid index in OrderedDictionary")
|
||||
|
||||
// Insert the element at the new index.
|
||||
insert((key: key, value: value), at: newIndex)
|
||||
|
||||
return previousIndex
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
extension OrderedDictionary: CustomStringConvertible {
|
||||
|
||||
/// A textual representation of the ordered dictionary.
|
||||
public var description: String {
|
||||
return makeDescription(debug: false)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension OrderedDictionary: CustomDebugStringConvertible {
|
||||
|
||||
/// A textual representation of the ordered dictionary, suitable for debugging.
|
||||
public var debugDescription: String {
|
||||
return makeDescription(debug: true)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extension OrderedDictionary {
|
||||
|
||||
fileprivate func makeDescription(debug: Bool) -> String {
|
||||
// The implementation of the description is inspired by zwaldowski's implementation of the
|
||||
// ordered dictionary. See https://bit.ly/2RiWfJu
|
||||
|
||||
if isEmpty { return "[:]" }
|
||||
|
||||
let printFunction: (Any, inout String) -> () = {
|
||||
if debug {
|
||||
return { debugPrint($0, separator: "", terminator: "", to: &$1) }
|
||||
} else {
|
||||
return { print($0, separator: "", terminator: "", to: &$1) }
|
||||
}
|
||||
}()
|
||||
|
||||
let descriptionForItem: (Any) -> String = { item in
|
||||
var description = ""
|
||||
printFunction(item, &description)
|
||||
return description
|
||||
}
|
||||
|
||||
let bodyComponents = map { element in
|
||||
return descriptionForItem(element.key) + ": " + descriptionForItem(element.value)
|
||||
}
|
||||
|
||||
let body = bodyComponents.joined(separator: ", ")
|
||||
|
||||
return "[\(body)]"
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,105 @@
|
||||
public struct OrderedDictionarySlice<Key: Hashable, Value>: RandomAccessCollection, MutableCollection {
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Type Aliases
|
||||
// ============================================================================ //
|
||||
|
||||
/// The type of the underlying ordered dictionary.
|
||||
public typealias Base = OrderedDictionary<Key, Value>
|
||||
|
||||
/// The type of the contiguous subrange of the ordered dictionary's elements.
|
||||
public typealias SubSequence = Self
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Initialization
|
||||
// ============================================================================ //
|
||||
|
||||
public init(base: Base, bounds: Base.Indices) {
|
||||
self.base = base
|
||||
self.startIndex = bounds.lowerBound
|
||||
self.endIndex = bounds.upperBound
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Base
|
||||
// ============================================================================ //
|
||||
|
||||
/// The underlying ordered dictionary.
|
||||
public private(set) var base: Base
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Indices
|
||||
// ============================================================================ //
|
||||
|
||||
/// The start index.
|
||||
public let startIndex: Base.Index
|
||||
|
||||
/// The end index.
|
||||
public let endIndex: Base.Index
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Subscripts
|
||||
// ============================================================================ //
|
||||
|
||||
public subscript(
|
||||
position: Base.Index
|
||||
) -> Base.Element {
|
||||
get {
|
||||
base[position]
|
||||
}
|
||||
set(newElement) {
|
||||
base[position] = newElement
|
||||
}
|
||||
}
|
||||
|
||||
public subscript(
|
||||
bounds: Range<Int>
|
||||
) -> OrderedDictionarySlice<Key, Value> {
|
||||
get {
|
||||
base[bounds]
|
||||
}
|
||||
set(newElements) {
|
||||
base[bounds] = newElements
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Reordering Methods Overloads
|
||||
// ============================================================================ //
|
||||
|
||||
public mutating func sort(
|
||||
by areInIncreasingOrder: (Base.Element, Base.Element) throws -> Bool
|
||||
) rethrows {
|
||||
try base._sort(
|
||||
in: indices,
|
||||
by: areInIncreasingOrder
|
||||
)
|
||||
}
|
||||
|
||||
public mutating func reverse() {
|
||||
base._reverse(in: indices)
|
||||
}
|
||||
|
||||
public mutating func shuffle<T>(
|
||||
using generator: inout T
|
||||
) where T: RandomNumberGenerator {
|
||||
base._shuffle(
|
||||
in: indices,
|
||||
using: &generator
|
||||
)
|
||||
}
|
||||
|
||||
public mutating func partition(
|
||||
by belongsInSecondPartition: (Base.Element) throws -> Bool
|
||||
) rethrows -> Index {
|
||||
return try base._partition(
|
||||
in: indices,
|
||||
by: belongsInSecondPartition
|
||||
)
|
||||
}
|
||||
|
||||
public mutating func swapAt(_ i: Base.Index, _ j: Base.Index) {
|
||||
base.swapAt(i, j)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -15,13 +15,13 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.5</string>
|
||||
<string>$(MARKETING_VERSION)</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2015 Lukas Kubanek. All rights reserved.</string>
|
||||
<string>Copyright © 2015-2021 Lukas Kubanek. All rights reserved.</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
import XCTest
|
||||
|
||||
import OrderedDictionaryTests
|
||||
|
||||
var tests = [XCTestCaseEntry]()
|
||||
tests += OrderedDictionaryTests.__allTests()
|
||||
|
||||
XCTMain(tests)
|
||||
@@ -1,307 +0,0 @@
|
||||
//
|
||||
// OrderedDictionaryTests.swift
|
||||
// OrderedDictionaryTests
|
||||
//
|
||||
// Created by Lukas Kubanek on 29/08/15.
|
||||
// Copyright © 2015 Lukas Kubanek. All rights reserved.
|
||||
//
|
||||
|
||||
import XCTest
|
||||
import OrderedDictionary
|
||||
|
||||
class OrderedDictionaryTests: XCTestCase {
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Initialization
|
||||
// ======================================================= //
|
||||
|
||||
func testInitializationUsingArrayLiteral() {
|
||||
let expected = OrderedDictionary<String, Int>(elements: [("A", 1), ("B", 2), ("C", 3)])
|
||||
let actual: OrderedDictionary<String, Int> = [("A", 1), ("B", 2), ("C", 3)]
|
||||
|
||||
XCTAssertTrue(expected == actual)
|
||||
}
|
||||
|
||||
func testInitializationUsingDictionaryLiteral() {
|
||||
let expected = OrderedDictionary<String, Int>(elements: [("A", 1), ("B", 2), ("C", 3)])
|
||||
let actual: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
XCTAssertTrue(expected == actual)
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Description
|
||||
// ======================================================= //
|
||||
|
||||
struct DescribedValue: CustomStringConvertible, CustomDebugStringConvertible {
|
||||
init(_ value: Int) { self.value = value }
|
||||
let value: Int
|
||||
var description: String { return "\(value)" }
|
||||
var debugDescription: String { return "debug(\(value))" }
|
||||
}
|
||||
|
||||
func testDescription() {
|
||||
let expected = "[A: 1, B: 2, C: 3]"
|
||||
|
||||
let orderedDictionary: OrderedDictionary<String, DescribedValue> = ["A": DescribedValue(1), "B": DescribedValue(2), "C": DescribedValue(3)]
|
||||
let actual = orderedDictionary.description
|
||||
|
||||
XCTAssertEqual(expected, actual)
|
||||
}
|
||||
|
||||
func testDebugDescription() {
|
||||
let expected = "[\"A\": debug(1), \"B\": debug(2), \"C\": debug(3)]"
|
||||
|
||||
let orderedDictionary: OrderedDictionary<String, DescribedValue> = ["A": DescribedValue(1), "B": DescribedValue(2), "C": DescribedValue(3)]
|
||||
let actual = orderedDictionary.debugDescription
|
||||
|
||||
XCTAssertEqual(expected, actual)
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Content Access
|
||||
// ======================================================= //
|
||||
|
||||
func testAccessingContent() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary["A"], 1)
|
||||
XCTAssertEqual(orderedDictionary.valueForKey("A"), 1)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("A"), 0)
|
||||
XCTAssertTrue(orderedDictionary.containsKey("A"))
|
||||
XCTAssertTrue(orderedDictionary[0] == ("A", 1))
|
||||
|
||||
XCTAssertEqual(orderedDictionary["B"], 2)
|
||||
XCTAssertEqual(orderedDictionary.valueForKey("B"), 2)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("B"), 1)
|
||||
XCTAssertTrue(orderedDictionary.containsKey("B"))
|
||||
XCTAssertTrue(orderedDictionary[1] == ("B", 2))
|
||||
|
||||
XCTAssertEqual(orderedDictionary["C"], 3)
|
||||
XCTAssertEqual(orderedDictionary.valueForKey("C"), 3)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("C"), 2)
|
||||
XCTAssertTrue(orderedDictionary.containsKey("C"))
|
||||
XCTAssertTrue(orderedDictionary[2] == ("C", 3))
|
||||
}
|
||||
|
||||
func testGenerator() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
var generator = orderedDictionary.generate()
|
||||
|
||||
let indexes = [0, 1, 2]
|
||||
var indexesGenerator = indexes.generate()
|
||||
|
||||
while let (actualKey, actualValue) = generator.next() {
|
||||
let index = indexesGenerator.next()
|
||||
let (expectedKey, expectedValue) = orderedDictionary[index!]
|
||||
|
||||
XCTAssertEqual(expectedKey, actualKey)
|
||||
XCTAssertEqual(expectedValue, actualValue)
|
||||
}
|
||||
|
||||
XCTAssertNil(generator.next())
|
||||
XCTAssertNil(indexesGenerator.next())
|
||||
}
|
||||
|
||||
func testOrderedKeys() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
let expected = ["A", "B", "C"]
|
||||
let actual = orderedDictionary.orderedKeys
|
||||
|
||||
XCTAssertEqual(expected, actual)
|
||||
}
|
||||
|
||||
func testOrderedValues() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
let expected = [1, 2, 3]
|
||||
let actual = orderedDictionary.orderedValues
|
||||
|
||||
XCTAssertEqual(expected, actual)
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Content Modifications
|
||||
// ======================================================= //
|
||||
|
||||
func testKeyBasedModifications() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
orderedDictionary["A"] = 5
|
||||
orderedDictionary["D"] = 10
|
||||
orderedDictionary["B"] = nil
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary["A"], 5)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("A"), 0)
|
||||
XCTAssertTrue(orderedDictionary.containsKey("A"))
|
||||
|
||||
XCTAssertNil(orderedDictionary["B"])
|
||||
XCTAssertNil(orderedDictionary.indexForKey("B"))
|
||||
XCTAssertFalse(orderedDictionary.containsKey("B"))
|
||||
|
||||
XCTAssertEqual(orderedDictionary["C"], 3)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("C"), 1)
|
||||
XCTAssertTrue(orderedDictionary.containsKey("C"))
|
||||
|
||||
XCTAssertEqual(orderedDictionary["D"], 10)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("D"), 2)
|
||||
XCTAssertTrue(orderedDictionary.containsKey("D"))
|
||||
}
|
||||
|
||||
func testIndexBasedModifications() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
orderedDictionary[0] = ("F", 10)
|
||||
orderedDictionary[1] = ("B", 5)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 3)
|
||||
XCTAssertTrue(orderedDictionary[0] == ("F", 10))
|
||||
XCTAssertTrue(orderedDictionary[1] == ("B", 5))
|
||||
XCTAssertTrue(orderedDictionary[2] == ("C", 3))
|
||||
}
|
||||
|
||||
func testRetrievingElementAtNonExistentIndex() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
XCTAssertNil(orderedDictionary.elementAtIndex(42))
|
||||
}
|
||||
|
||||
func testIndexBasedInsertionsOfElementsWithDistinctKeys() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
orderedDictionary.insertElement(("T", 15), atIndex: 0)
|
||||
orderedDictionary.insertElement(("U", 16), atIndex: 2)
|
||||
orderedDictionary.insertElement(("V", 17), atIndex: 5)
|
||||
orderedDictionary.insertElement(("W", 18), atIndex: 2)
|
||||
|
||||
let expected: OrderedDictionary<String, Int> = ["T": 15, "A": 1, "W": 18, "U": 16, "B": 2, "C": 3, "V": 17]
|
||||
let actual = orderedDictionary
|
||||
|
||||
XCTAssertTrue(expected == actual)
|
||||
}
|
||||
|
||||
func testIndexBasedInsertionOfElementWithSameKeyBeforeItsCurrentIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
let previousValue = orderedDictionary.insertElement(("B", 5), atIndex: 0)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 3)
|
||||
XCTAssertEqual(previousValue, 2)
|
||||
|
||||
let expected: OrderedDictionary<String, Int> = ["B": 5, "A": 1, "C": 3]
|
||||
let actual = orderedDictionary
|
||||
|
||||
XCTAssertTrue(expected == actual)
|
||||
}
|
||||
|
||||
func testIndexBasedInsertionOfElementWithSameKeyAtItsCurrentIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
let previousValue = orderedDictionary.insertElement(("B", 5), atIndex: 1)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 3)
|
||||
XCTAssertEqual(previousValue, 2)
|
||||
|
||||
let expected: OrderedDictionary<String, Int> = ["A": 1, "B": 5, "C": 3]
|
||||
let actual = orderedDictionary
|
||||
|
||||
XCTAssertTrue(expected == actual)
|
||||
}
|
||||
|
||||
func testIndexBasedInsertionOfElementWithSameKeyAfterItsCurrentIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
let previousValue = orderedDictionary.insertElement(("B", 5), atIndex: 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 3)
|
||||
XCTAssertEqual(previousValue, 2)
|
||||
|
||||
let expected: OrderedDictionary<String, Int> = ["A": 1, "C": 3, "B": 5]
|
||||
let actual = orderedDictionary
|
||||
|
||||
XCTAssertTrue(expected == actual)
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Content Removal
|
||||
// ======================================================= //
|
||||
|
||||
func testRemoveAll() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
orderedDictionary.removeAll()
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 0)
|
||||
}
|
||||
|
||||
func testKeyBasedRemoval() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3]
|
||||
|
||||
let removedValue1 = orderedDictionary.removeValueForKey("A")
|
||||
let removedValue2 = orderedDictionary.removeValueForKey("K")
|
||||
|
||||
XCTAssertEqual(removedValue1, 1)
|
||||
XCTAssertNil(removedValue2)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 2)
|
||||
|
||||
XCTAssertNil(orderedDictionary["A"])
|
||||
XCTAssertNil(orderedDictionary.indexForKey("A"))
|
||||
|
||||
XCTAssertEqual(orderedDictionary["B"], 2)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("B"), 0)
|
||||
|
||||
XCTAssertEqual(orderedDictionary["C"], 3)
|
||||
XCTAssertEqual(orderedDictionary.indexForKey("C"), 1)
|
||||
}
|
||||
|
||||
func testIndexBasedRemoval() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["A": 1, "B": 2, "C": 3, "D": 4]
|
||||
|
||||
let (expectedKey1, expectedValue1) = ("A", 1)
|
||||
let (actualKey1, actualValue1) = orderedDictionary.removeAtIndex(0)!
|
||||
|
||||
XCTAssertEqual(expectedKey1, actualKey1)
|
||||
XCTAssertEqual(expectedValue1, actualValue1)
|
||||
|
||||
let (expectedKey2, expectedValue2) = ("D", 4)
|
||||
let (actualKey2, actualValue2) = orderedDictionary.removeAtIndex(2)!
|
||||
|
||||
XCTAssertEqual(expectedKey2, actualKey2)
|
||||
XCTAssertEqual(expectedValue2, actualValue2)
|
||||
|
||||
let nonExistentElement = orderedDictionary.removeAtIndex(42)
|
||||
|
||||
XCTAssertNil(nonExistentElement)
|
||||
|
||||
let expected: OrderedDictionary<String, Int> = ["B": 2, "C": 3]
|
||||
let actual = orderedDictionary
|
||||
|
||||
XCTAssertTrue(expected == actual)
|
||||
}
|
||||
|
||||
// ======================================================= //
|
||||
// MARK: - Sorting
|
||||
// ======================================================= //
|
||||
|
||||
func testSortingInPlace() {
|
||||
let actual: OrderedDictionary<String, Int> = {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["E": 4, "G": 3, "A": 3, "D": 1, "B": 4]
|
||||
|
||||
orderedDictionary.sortInPlace { (element1: (key: String, value: Int), element2: (key: String, value: Int)) in
|
||||
if element1.value == element2.value {
|
||||
return element1.key < element2.key
|
||||
} else {
|
||||
return element1.value < element2.value
|
||||
}
|
||||
}
|
||||
|
||||
return orderedDictionary
|
||||
}()
|
||||
|
||||
let expected: OrderedDictionary<String, Int> = ["D": 1, "A": 3, "G": 3, "B": 4, "E": 4]
|
||||
|
||||
XCTAssertTrue(actual == expected)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class AccessTests: XCTestCase {
|
||||
|
||||
func testAccessBasic() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
XCTAssertEqual(orderedDictionary.count, 3)
|
||||
XCTAssertFalse(orderedDictionary.isEmpty)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.indices, 0..<3)
|
||||
XCTAssertEqual(orderedDictionary.startIndex, 0)
|
||||
XCTAssertEqual(orderedDictionary.endIndex, 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary[0].key, "a")
|
||||
XCTAssertEqual(orderedDictionary[1].key, "b")
|
||||
XCTAssertEqual(orderedDictionary[2].key, "c")
|
||||
|
||||
XCTAssertTrue(orderedDictionary.containsKey("a"))
|
||||
XCTAssertTrue(orderedDictionary.containsKey("b"))
|
||||
XCTAssertTrue(orderedDictionary.containsKey("c"))
|
||||
|
||||
XCTAssertEqual(orderedDictionary["a"], 1)
|
||||
XCTAssertEqual(orderedDictionary["b"], 2)
|
||||
XCTAssertEqual(orderedDictionary["c"], 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.value(forKey: "a"), 1)
|
||||
XCTAssertEqual(orderedDictionary.value(forKey: "b"), 2)
|
||||
XCTAssertEqual(orderedDictionary.value(forKey: "c"), 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary.index(forKey: "a"), 0)
|
||||
XCTAssertEqual(orderedDictionary.index(forKey: "b"), 1)
|
||||
XCTAssertEqual(orderedDictionary.index(forKey: "c"), 2)
|
||||
|
||||
XCTAssertNotNil(orderedDictionary.elementAt(0))
|
||||
XCTAssertNotNil(orderedDictionary.elementAt(1))
|
||||
XCTAssertNotNil(orderedDictionary.elementAt(2))
|
||||
}
|
||||
|
||||
func testAccessSlice() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
let slice = orderedDictionary[2..<4]
|
||||
|
||||
XCTAssertEqual(slice.count, 2)
|
||||
XCTAssertFalse(slice.isEmpty)
|
||||
|
||||
XCTAssertEqual(slice.indices, 2..<4)
|
||||
XCTAssertEqual(slice.startIndex, 2)
|
||||
XCTAssertEqual(slice.endIndex, 4)
|
||||
|
||||
XCTAssertEqual(orderedDictionary[2].key, "c")
|
||||
XCTAssertEqual(orderedDictionary[3].key, "d")
|
||||
}
|
||||
|
||||
func testAccessOrderedKeys() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary.orderedKeys,
|
||||
["a", "b", "c"]
|
||||
)
|
||||
}
|
||||
|
||||
func testAccessOrderedValues() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
XCTAssertEqual(
|
||||
Array(orderedDictionary.orderedValues),
|
||||
[1, 2, 3]
|
||||
)
|
||||
}
|
||||
|
||||
func testAccessElementAtInvalidIndex() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
XCTAssertNil(orderedDictionary.elementAt(-1))
|
||||
XCTAssertNil(orderedDictionary.elementAt(3))
|
||||
}
|
||||
|
||||
func testAccessUnsortedDictionary() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary.unorderedDictionary,
|
||||
["a": 1, "b": 2, "c": 3]
|
||||
)
|
||||
}
|
||||
|
||||
func testIteratorInForLoop() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
var keys = [String]()
|
||||
var values = [Int]()
|
||||
|
||||
for (key, value) in orderedDictionary {
|
||||
keys.append(key)
|
||||
values.append(value)
|
||||
}
|
||||
|
||||
XCTAssertEqual(keys, ["a", "b", "c"])
|
||||
XCTAssertEqual(values, [1, 2, 3])
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class CapacityTests: XCTestCase {
|
||||
|
||||
func testCapacityReservationViaInit() {
|
||||
let orderedDictionary = OrderedDictionary<String, Int>(minimumCapacity: 10)
|
||||
|
||||
XCTAssertGreaterThanOrEqual(orderedDictionary.capacity, 10)
|
||||
}
|
||||
|
||||
func testCapacityReservationViaMethod() {
|
||||
var orderedDictionary = OrderedDictionary<String, Int>()
|
||||
|
||||
XCTAssertEqual(orderedDictionary.capacity, 0)
|
||||
|
||||
orderedDictionary.reserveCapacity(10)
|
||||
|
||||
XCTAssertGreaterThanOrEqual(orderedDictionary.capacity, 10)
|
||||
XCTAssertLessThan(orderedDictionary.capacity, 20)
|
||||
|
||||
orderedDictionary.reserveCapacity(20)
|
||||
|
||||
XCTAssertGreaterThanOrEqual(orderedDictionary.capacity, 20)
|
||||
}
|
||||
|
||||
func testCapacityGrowForElementInsertion() {
|
||||
var orderedDictionary = OrderedDictionary<String, Int>()
|
||||
|
||||
XCTAssertEqual(orderedDictionary.capacity, 0)
|
||||
|
||||
orderedDictionary["a"] = 1
|
||||
|
||||
XCTAssertEqual(orderedDictionary.capacity, 1)
|
||||
|
||||
orderedDictionary["b"] = 2
|
||||
orderedDictionary["a"] = 3
|
||||
|
||||
XCTAssertEqual(orderedDictionary.capacity, 2)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class CodingTests: XCTestCase {
|
||||
|
||||
func testEncodingAndDecodingViaJSON() throws {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let jsonEncoder = JSONEncoder()
|
||||
let data = try jsonEncoder.encode(orderedDictionary)
|
||||
let actualString = String(data: data, encoding: .utf8)
|
||||
|
||||
let expectedString = "[\"a\",1,\"b\",2,\"c\",3]"
|
||||
|
||||
XCTAssertEqual(actualString, expectedString)
|
||||
|
||||
let jsonDecoder = JSONDecoder()
|
||||
let actual = try jsonDecoder.decode(OrderedDictionary<String, Int>.self, from: data)
|
||||
|
||||
let expected = orderedDictionary
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
func testEncodingAndDecodingViaPropertyList() throws {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let plistEncoder = PropertyListEncoder()
|
||||
let data = try plistEncoder.encode(orderedDictionary)
|
||||
|
||||
let plistDecoder = PropertyListDecoder()
|
||||
let actual = try plistDecoder.decode(OrderedDictionary<String, Int>.self, from: data)
|
||||
|
||||
let expected = orderedDictionary
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
struct DescribedValue: CustomStringConvertible, CustomDebugStringConvertible {
|
||||
init(_ value: Int) { self.value = value }
|
||||
let value: Int
|
||||
var description: String { return "\(value)" }
|
||||
var debugDescription: String { return "debug(\(value))" }
|
||||
}
|
||||
|
||||
class DescriptionTests: XCTestCase {
|
||||
|
||||
func testEmptyDescription() {
|
||||
let orderedDictionary = OrderedDictionary<String, DescribedValue>()
|
||||
|
||||
XCTAssertEqual(orderedDictionary.description, "[:]")
|
||||
}
|
||||
|
||||
func testDescription() {
|
||||
let orderedDictionary: OrderedDictionary = [
|
||||
"a": DescribedValue(1),
|
||||
"b": DescribedValue(2),
|
||||
"c": DescribedValue(3)
|
||||
]
|
||||
|
||||
XCTAssertEqual(orderedDictionary.description, "[a: 1, b: 2, c: 3]")
|
||||
}
|
||||
|
||||
func testEmptyDebugDescription() {
|
||||
let orderedDictionary = OrderedDictionary<String, DescribedValue>()
|
||||
|
||||
XCTAssertEqual(orderedDictionary.debugDescription, "[:]")
|
||||
}
|
||||
|
||||
func testDebugDescription() {
|
||||
let orderedDictionary: OrderedDictionary = [
|
||||
"a": DescribedValue(1),
|
||||
"b": DescribedValue(2),
|
||||
"c": DescribedValue(3)
|
||||
]
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary.debugDescription,
|
||||
"[\"a\": debug(1), \"b\": debug(2), \"c\": debug(3)]"
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class InitializationTests: XCTestCase {
|
||||
|
||||
func testInitializationFromArrayLiteral() {
|
||||
let actual: OrderedDictionary = [
|
||||
("a", 1),
|
||||
("b", 2),
|
||||
("c", 3)
|
||||
]
|
||||
|
||||
let expected = OrderedDictionary(uniqueKeysWithValues: [
|
||||
(key: "a", value: 1),
|
||||
(key: "b", value: 2),
|
||||
(key: "c", value: 3)
|
||||
])
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
func testInitializationFromDictionaryLiteral() {
|
||||
let actual: OrderedDictionary = [
|
||||
"a": 1,
|
||||
"b": 2,
|
||||
"c": 3
|
||||
]
|
||||
|
||||
let expected = OrderedDictionary(uniqueKeysWithValues: [
|
||||
(key: "a", value: 1),
|
||||
(key: "b", value: 2),
|
||||
(key: "c", value: 3)
|
||||
])
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
func testInitializationFromValuesAndKeyProviderClosure() {
|
||||
let actual = OrderedDictionary(
|
||||
values: [1, 2, 3],
|
||||
uniquelyKeyedBy: { String($0) }
|
||||
)
|
||||
|
||||
let expected = OrderedDictionary(uniqueKeysWithValues: [
|
||||
(key: "1", value: 1),
|
||||
(key: "2", value: 2),
|
||||
(key: "3", value: 3)
|
||||
])
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
func testInitializationFromValuesAndKeyPath() {
|
||||
let actual = OrderedDictionary(
|
||||
values: ["a", "b", "c"],
|
||||
uniquelyKeyedBy: \.self
|
||||
)
|
||||
|
||||
let expected = OrderedDictionary(uniqueKeysWithValues: [
|
||||
(key: "a", value: "a"),
|
||||
(key: "b", value: "b"),
|
||||
(key: "c", value: "c")
|
||||
])
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
func testInitializationFromUnsortedDictionaryAndSortFunction() {
|
||||
let actual = OrderedDictionary(
|
||||
unsorted: [
|
||||
2: "foo",
|
||||
1: "bar",
|
||||
4: "baz",
|
||||
5: "bat",
|
||||
3: "bam"
|
||||
],
|
||||
areInIncreasingOrder: { $0.key < $1.key }
|
||||
)
|
||||
|
||||
let expected = OrderedDictionary(uniqueKeysWithValues: [
|
||||
(key: 1, value: "bar"),
|
||||
(key: 2, value: "foo"),
|
||||
(key: 3, value: "bam"),
|
||||
(key: 4, value: "baz"),
|
||||
(key: 5, value: "bat")
|
||||
])
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class InsertionsTests: XCTestCase {
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Index-based Insertion
|
||||
// ============================================================================ //
|
||||
|
||||
func testIndexBasedInsertion_uniqueKey_startIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let newElement = (key: "d", value: 4)
|
||||
orderedDictionary.insert(newElement, at: 0)
|
||||
XCTAssertEqual(orderedDictionary, ["d": 4, "a": 1, "b": 2, "c": 3])
|
||||
}
|
||||
|
||||
func testIndexBasedInsertion_uniqueKey_middleIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let newElement = (key: "d", value: 4)
|
||||
orderedDictionary.insert(newElement, at: 2)
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "d": 4, "c": 3])
|
||||
}
|
||||
|
||||
func testIndexBasedInsertion_uniqueKey_endIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let newElement = (key: "d", value: 4)
|
||||
orderedDictionary.insert(newElement, at: 3)
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3, "d": 4])
|
||||
}
|
||||
|
||||
func testIndexBasedInsertion_duplicateKey() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
XCTAssertFalse(orderedDictionary.canInsert(key: "a"))
|
||||
XCTAssertTrue(orderedDictionary.canInsert(key: "d"))
|
||||
}
|
||||
|
||||
func testIndexBasedInsertion_invalidIndex() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
XCTAssertFalse(orderedDictionary.canInsert(at: -1))
|
||||
XCTAssertFalse(orderedDictionary.canInsert(at: 4))
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Key-based Insertion
|
||||
// ============================================================================ //
|
||||
|
||||
func testKeyBasedInsertion() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
orderedDictionary["d"] = 4
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3, "d": 4])
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class MapFilterTests: XCTestCase {
|
||||
|
||||
func testMapValues() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary.mapValues { String($0) },
|
||||
["a": "1", "b": "2", "c": "3", "d": "4"]
|
||||
)
|
||||
}
|
||||
|
||||
func testCompactMapValues() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary.compactMapValues { $0.isMultiple(of: 2) ? String($0) : nil },
|
||||
["b": "2", "d": "4"]
|
||||
)
|
||||
}
|
||||
|
||||
func testFilter() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary.filter { $0.value.isMultiple(of: 2) },
|
||||
["b": 2, "d": 4]
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class RemovalTests: XCTestCase {
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Key-based Removal Via removeValue(forKey:)
|
||||
// ============================================================================ //
|
||||
|
||||
func testKeyBasedRemoval_viaMethod_existingKey() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let value = orderedDictionary.removeValue(forKey: "b")
|
||||
|
||||
XCTAssertEqual(value, 2)
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "c": 3])
|
||||
}
|
||||
|
||||
func testKeyBasedRemoval_viaMethod_invalidKey() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let value = orderedDictionary.removeValue(forKey: "d")
|
||||
|
||||
XCTAssertNil(value)
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Key-based Removal Via subscript(key:)
|
||||
// ============================================================================ //
|
||||
|
||||
func testKeyBasedRemoval_viaSubscript_existingKey() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
orderedDictionary["b"] = nil
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "c": 3])
|
||||
}
|
||||
|
||||
func testKeyBasedRemoval_viaSubscript_invalidKey() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
orderedDictionary["d"] = nil
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Index-based Removal Via Method
|
||||
// ============================================================================ //
|
||||
|
||||
func testIndexBasedRemoval_viaMethod_validIndex() throws {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let (key, value) = try XCTUnwrap(orderedDictionary.remove(at: 2))
|
||||
|
||||
XCTAssertEqual(key, "c")
|
||||
XCTAssertEqual(value, 3)
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2])
|
||||
}
|
||||
|
||||
func testIndexBasedRemoval_viaMethod_invalidIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let element = orderedDictionary.remove(at: 5)
|
||||
|
||||
XCTAssertNil(element)
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Remove All
|
||||
// ============================================================================ //
|
||||
|
||||
func testRemoveAll() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
orderedDictionary.removeAll()
|
||||
|
||||
XCTAssertEqual(orderedDictionary, [])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Pop First & Last
|
||||
// ============================================================================ //
|
||||
|
||||
func testPopFirstEmpty() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = []
|
||||
|
||||
let first = orderedDictionary.popFirst()
|
||||
|
||||
XCTAssertNil(first)
|
||||
}
|
||||
|
||||
func testPopFirstNonEmpty() throws {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
let first = try XCTUnwrap(orderedDictionary.popFirst())
|
||||
|
||||
XCTAssertEqual(first.key, "a")
|
||||
XCTAssertEqual(first.value, 1)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["b": 2, "c": 3, "d": 4])
|
||||
}
|
||||
|
||||
func testPopLastEmpty() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = []
|
||||
|
||||
let last = orderedDictionary.popLast()
|
||||
|
||||
XCTAssertNil(last)
|
||||
}
|
||||
|
||||
func testPopLastNonEmpty() throws {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
let last = try XCTUnwrap(orderedDictionary.popLast())
|
||||
|
||||
XCTAssertEqual(last.key, "d")
|
||||
XCTAssertEqual(last.value, 4)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Removal First & Last
|
||||
// ============================================================================ //
|
||||
|
||||
func testRemoveFirstNonEmpty() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
let first = orderedDictionary.removeFirst()
|
||||
|
||||
XCTAssertEqual(first.key, "a")
|
||||
XCTAssertEqual(first.value, 1)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["b": 2, "c": 3, "d": 4])
|
||||
}
|
||||
|
||||
func testRemoveLastNonEmpty() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
let last = orderedDictionary.removeLast()
|
||||
|
||||
XCTAssertEqual(last.key, "d")
|
||||
XCTAssertEqual(last.value, 4)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3])
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class ReorderingTests: XCTestCase {
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Reversal
|
||||
// ============================================================================ //
|
||||
|
||||
func testReversal() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
orderedDictionary.reverse()
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["d": 4, "c": 3, "b": 2, "a": 1])
|
||||
}
|
||||
|
||||
func testReversal_throughSlice() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
orderedDictionary[1..<3].reverse()
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "c": 3, "b": 2, "d": 4])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Partitioning
|
||||
// ============================================================================ //
|
||||
|
||||
func testPartitioning() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
let index = orderedDictionary.partition(by: { $0.value.isMultiple(of: 2) })
|
||||
|
||||
XCTAssertEqual(index, 2)
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "c": 3, "b": 2, "d": 4])
|
||||
}
|
||||
|
||||
func testPartitioning_throughSlice() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
let index = orderedDictionary[0..<3].partition(by: { !$0.value.isMultiple(of: 2) })
|
||||
|
||||
XCTAssertEqual(index, 1)
|
||||
XCTAssertEqual(orderedDictionary, ["b": 2, "a": 1, "c": 3, "d": 4])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Swapping
|
||||
// ============================================================================ //
|
||||
|
||||
func testSwapAtDifferentIndices() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
orderedDictionary.swapAt(1, 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "d": 4, "c": 3, "b": 2])
|
||||
}
|
||||
|
||||
func testSwapAtSameIndex() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
orderedDictionary.swapAt(0, 0)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3, "d": 4])
|
||||
}
|
||||
|
||||
func testSwapAtDifferentIndices_throughSlice() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
orderedDictionary[1..<4].swapAt(1, 3)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "d": 4, "c": 3, "b": 2])
|
||||
}
|
||||
|
||||
func testSwapAtSameIndex_throughSlice() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3, "d": 4]
|
||||
|
||||
orderedDictionary[0..<1].swapAt(0, 0)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 2, "c": 3, "d": 4])
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
func sortByValuesAndKeys<Key: Comparable, Value: Comparable>(
|
||||
element1: (key: Key, value: Value),
|
||||
element2: (key: Key, value: Value)
|
||||
) -> Bool {
|
||||
if element1.value != element2.value {
|
||||
return element1.value < element2.value
|
||||
} else {
|
||||
return element1.key < element2.key
|
||||
}
|
||||
}
|
||||
|
||||
class SortingTests: XCTestCase {
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Mutating Sort
|
||||
// ============================================================================ //
|
||||
|
||||
func testMutatingSort() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["e": 4, "g": 3, "a": 3, "d": 1, "b": 4]
|
||||
|
||||
orderedDictionary.sort(by: sortByValuesAndKeys)
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary,
|
||||
["d": 1, "a": 3, "g": 3, "b": 4, "e": 4]
|
||||
)
|
||||
}
|
||||
|
||||
func testMutatingSort_throughSlice() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["e": 4, "g": 3, "a": 3, "d": 1, "b": 4]
|
||||
|
||||
orderedDictionary[2..<5].sort(by: sortByValuesAndKeys)
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary,
|
||||
["e": 4, "g": 3, "d": 1, "a": 3, "b": 4]
|
||||
)
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Non-mutating Sort
|
||||
// ============================================================================ //
|
||||
|
||||
func testSortingWithoutMutation() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["e": 4, "g": 3, "a": 3, "d": 1, "b": 4]
|
||||
|
||||
XCTAssertEqual(
|
||||
orderedDictionary.sorted(by: sortByValuesAndKeys),
|
||||
["d": 1, "a": 3, "g": 3, "b": 4, "e": 4]
|
||||
)
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Sorting Unsorted Dictionary
|
||||
// ============================================================================ //
|
||||
|
||||
func testSortingUnsortedDictionary() {
|
||||
let dictionary = [
|
||||
2: "foo",
|
||||
1: "bar",
|
||||
4: "baz",
|
||||
5: "bat",
|
||||
3: "bam"
|
||||
]
|
||||
|
||||
let actual = dictionary.sorted { $0.key < $1.key }
|
||||
|
||||
let expected: OrderedDictionary<Int, String> = [
|
||||
1: "bar",
|
||||
2: "foo",
|
||||
3: "bam",
|
||||
4: "baz",
|
||||
5: "bat"
|
||||
]
|
||||
|
||||
XCTAssertEqual(actual, expected)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
// See #49
|
||||
class SubscriptAmbiguityTests: XCTestCase {
|
||||
|
||||
func testAccess() {
|
||||
let orderedDictionary: OrderedDictionary<Int, String> = [1: "a", 2: "b", 3: "c"]
|
||||
|
||||
let valueForKey = orderedDictionary[1] as String?
|
||||
let elementAtIndex = orderedDictionary[1] as (key: Int, value: String)
|
||||
|
||||
XCTAssertEqual(valueForKey, "a")
|
||||
XCTAssertEqual(elementAtIndex.key, 2)
|
||||
XCTAssertEqual(elementAtIndex.value, "b")
|
||||
}
|
||||
|
||||
func testIndexBasedUpdate() {
|
||||
var orderedDictionary: OrderedDictionary<Int, String> = [1: "a", 2: "b", 3: "c"]
|
||||
|
||||
orderedDictionary[1] = (key: 2, value: "x")
|
||||
|
||||
XCTAssertEqual(orderedDictionary, [1: "a", 2: "x", 3: "c"])
|
||||
}
|
||||
|
||||
func testKeyBasedUpdate() {
|
||||
var orderedDictionary: OrderedDictionary<Int, String> = [1: "a", 2: "b", 3: "c"]
|
||||
|
||||
orderedDictionary[1] = "x"
|
||||
|
||||
XCTAssertEqual(orderedDictionary, [1: "x", 2: "b", 3: "c"])
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
import Foundation
|
||||
import OrderedDictionary
|
||||
import XCTest
|
||||
|
||||
class UpdatesTests: XCTestCase {
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Index-based Updates Via update(_:at:)
|
||||
// ============================================================================ //
|
||||
|
||||
func testIndexBasedUpdate_viaMethod_sameKey() throws {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let newElement = (key: "b", value: 0)
|
||||
let previousElement = try XCTUnwrap(orderedDictionary.update(newElement, at: 1))
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 0, "c": 3])
|
||||
|
||||
XCTAssertEqual(previousElement.key, "b")
|
||||
XCTAssertEqual(previousElement.value, 2)
|
||||
}
|
||||
|
||||
func testIndexBasedUpdate_viaMethod_newUniqueKey() throws {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let newElement = (key: "d", value: 0)
|
||||
let previousElement = try XCTUnwrap(orderedDictionary.update(newElement, at: 1))
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "d": 0, "c": 3])
|
||||
|
||||
XCTAssertEqual(previousElement.key, "b")
|
||||
XCTAssertEqual(previousElement.value, 2)
|
||||
}
|
||||
|
||||
func testIndexBasedUpdate_viaMethod_duplicateKey() {
|
||||
let orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let element = (key: "a", value: 42)
|
||||
|
||||
XCTAssertTrue(orderedDictionary.canUpdate(element, at: 0))
|
||||
XCTAssertFalse(orderedDictionary.canUpdate(element, at: 1))
|
||||
XCTAssertFalse(orderedDictionary.canUpdate(element, at: 2))
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Index-based Updates Via subscript(position:)
|
||||
// ============================================================================ //
|
||||
|
||||
func testIndexBasedUpdate_viaSubscriptSingle_sameKey() throws {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
orderedDictionary[1] = (key: "b", value: 0)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "b": 0, "c": 3])
|
||||
}
|
||||
|
||||
func testIndexBasedUpdate_viaSubscriptSingle_newUniqueKey() throws {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
orderedDictionary[1] = (key: "d", value: 0)
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "d": 0, "c": 3])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Index-based Updates Via subscript(bounds:)
|
||||
// ============================================================================ //
|
||||
|
||||
func testIndexBasedUpdate_viaSubscriptMultiple_newUniqueKeys() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let sliceOrderedDictionary: OrderedDictionary<String, Int> = ["d": 0, "e": 0]
|
||||
let slice = sliceOrderedDictionary[0..<2]
|
||||
|
||||
orderedDictionary[1..<3] = slice
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "d": 0, "e": 0])
|
||||
}
|
||||
|
||||
func testIndexBasedUpdate_viaSubscriptMultiple_sameKeys() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let sliceOrderedDictionary: OrderedDictionary<String, Int> = ["c": 0, "b": 0]
|
||||
let slice = sliceOrderedDictionary[0..<2]
|
||||
|
||||
orderedDictionary[1..<3] = slice
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "c": 0, "b": 0])
|
||||
}
|
||||
|
||||
func testIndexBasedUpdate_viaSubscriptMultiple_mixedKeys() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
let sliceOrderedDictionary: OrderedDictionary<String, Int> = ["d": 0, "c": 0]
|
||||
let slice = sliceOrderedDictionary[0..<2]
|
||||
|
||||
orderedDictionary[1..<3] = slice
|
||||
|
||||
XCTAssertEqual(orderedDictionary, ["a": 1, "d": 0, "c": 0])
|
||||
}
|
||||
|
||||
// ============================================================================ //
|
||||
// MARK: - Key-based Updates
|
||||
// ============================================================================ //
|
||||
|
||||
func testKeyBasedUpdate() {
|
||||
var orderedDictionary: OrderedDictionary<String, Int> = ["a": 1, "b": 2, "c": 3]
|
||||
|
||||
// Update
|
||||
orderedDictionary["a"] = 5
|
||||
XCTAssertEqual(orderedDictionary, ["a": 5, "b": 2, "c": 3])
|
||||
|
||||
// Insertion
|
||||
orderedDictionary["d"] = 10
|
||||
XCTAssertEqual(orderedDictionary, ["a": 5, "b": 2, "c": 3, "d": 10])
|
||||
XCTAssertTrue(orderedDictionary.containsKey("d"))
|
||||
|
||||
// Removal
|
||||
orderedDictionary["b"] = nil
|
||||
XCTAssertEqual(orderedDictionary, ["a": 5, "c": 3, "d": 10])
|
||||
XCTAssertFalse(orderedDictionary.containsKey("b"))
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
// https://github.com/realm/SwiftLint/pull/2965
|
||||
// https://bugs.swift.org/browse/SR-11501
|
||||
#if compiler(<5.1) || (SWIFT_PACKAGE && os(macOS))
|
||||
internal enum UnwrapError: Error {
|
||||
case missingValue
|
||||
}
|
||||
|
||||
internal func XCTUnwrap<T>(
|
||||
_ expression: @autoclosure () throws -> T?,
|
||||
_ message: @autoclosure () -> String = ""
|
||||
) throws -> T {
|
||||
if let value = try expression() {
|
||||
return value
|
||||
} else {
|
||||
throw UnwrapError.missingValue
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,183 @@
|
||||
#if !canImport(ObjectiveC)
|
||||
import XCTest
|
||||
|
||||
extension AccessTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__AccessTests = [
|
||||
("testAccessBasic", testAccessBasic),
|
||||
("testAccessElementAtInvalidIndex", testAccessElementAtInvalidIndex),
|
||||
("testAccessOrderedKeys", testAccessOrderedKeys),
|
||||
("testAccessOrderedValues", testAccessOrderedValues),
|
||||
("testAccessSlice", testAccessSlice),
|
||||
("testAccessUnsortedDictionary", testAccessUnsortedDictionary),
|
||||
("testIteratorInForLoop", testIteratorInForLoop),
|
||||
]
|
||||
}
|
||||
|
||||
extension CapacityTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__CapacityTests = [
|
||||
("testCapacityGrowForElementInsertion", testCapacityGrowForElementInsertion),
|
||||
("testCapacityReservationViaInit", testCapacityReservationViaInit),
|
||||
("testCapacityReservationViaMethod", testCapacityReservationViaMethod),
|
||||
]
|
||||
}
|
||||
|
||||
extension CodingTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__CodingTests = [
|
||||
("testEncodingAndDecodingViaJSON", testEncodingAndDecodingViaJSON),
|
||||
("testEncodingAndDecodingViaPropertyList", testEncodingAndDecodingViaPropertyList),
|
||||
]
|
||||
}
|
||||
|
||||
extension DescriptionTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__DescriptionTests = [
|
||||
("testDebugDescription", testDebugDescription),
|
||||
("testDescription", testDescription),
|
||||
("testEmptyDebugDescription", testEmptyDebugDescription),
|
||||
("testEmptyDescription", testEmptyDescription),
|
||||
]
|
||||
}
|
||||
|
||||
extension InitializationTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__InitializationTests = [
|
||||
("testInitializationFromArrayLiteral", testInitializationFromArrayLiteral),
|
||||
("testInitializationFromDictionaryLiteral", testInitializationFromDictionaryLiteral),
|
||||
("testInitializationFromUnsortedDictionaryAndSortFunction", testInitializationFromUnsortedDictionaryAndSortFunction),
|
||||
("testInitializationFromValuesAndKeyPath", testInitializationFromValuesAndKeyPath),
|
||||
("testInitializationFromValuesAndKeyProviderClosure", testInitializationFromValuesAndKeyProviderClosure),
|
||||
]
|
||||
}
|
||||
|
||||
extension InsertionsTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__InsertionsTests = [
|
||||
("testIndexBasedInsertion_duplicateKey", testIndexBasedInsertion_duplicateKey),
|
||||
("testIndexBasedInsertion_invalidIndex", testIndexBasedInsertion_invalidIndex),
|
||||
("testIndexBasedInsertion_uniqueKey_endIndex", testIndexBasedInsertion_uniqueKey_endIndex),
|
||||
("testIndexBasedInsertion_uniqueKey_middleIndex", testIndexBasedInsertion_uniqueKey_middleIndex),
|
||||
("testIndexBasedInsertion_uniqueKey_startIndex", testIndexBasedInsertion_uniqueKey_startIndex),
|
||||
("testKeyBasedInsertion", testKeyBasedInsertion),
|
||||
]
|
||||
}
|
||||
|
||||
extension MapFilterTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__MapFilterTests = [
|
||||
("testCompactMapValues", testCompactMapValues),
|
||||
("testFilter", testFilter),
|
||||
("testMapValues", testMapValues),
|
||||
]
|
||||
}
|
||||
|
||||
extension RemovalTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__RemovalTests = [
|
||||
("testIndexBasedRemoval_viaMethod_invalidIndex", testIndexBasedRemoval_viaMethod_invalidIndex),
|
||||
("testIndexBasedRemoval_viaMethod_validIndex", testIndexBasedRemoval_viaMethod_validIndex),
|
||||
("testKeyBasedRemoval_viaMethod_existingKey", testKeyBasedRemoval_viaMethod_existingKey),
|
||||
("testKeyBasedRemoval_viaMethod_invalidKey", testKeyBasedRemoval_viaMethod_invalidKey),
|
||||
("testKeyBasedRemoval_viaSubscript_existingKey", testKeyBasedRemoval_viaSubscript_existingKey),
|
||||
("testKeyBasedRemoval_viaSubscript_invalidKey", testKeyBasedRemoval_viaSubscript_invalidKey),
|
||||
("testPopFirstEmpty", testPopFirstEmpty),
|
||||
("testPopFirstNonEmpty", testPopFirstNonEmpty),
|
||||
("testPopLastEmpty", testPopLastEmpty),
|
||||
("testPopLastNonEmpty", testPopLastNonEmpty),
|
||||
("testRemoveAll", testRemoveAll),
|
||||
("testRemoveFirstNonEmpty", testRemoveFirstNonEmpty),
|
||||
("testRemoveLastNonEmpty", testRemoveLastNonEmpty),
|
||||
]
|
||||
}
|
||||
|
||||
extension ReorderingTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__ReorderingTests = [
|
||||
("testPartitioning", testPartitioning),
|
||||
("testPartitioning_throughSlice", testPartitioning_throughSlice),
|
||||
("testReversal", testReversal),
|
||||
("testReversal_throughSlice", testReversal_throughSlice),
|
||||
("testSwapAtDifferentIndices", testSwapAtDifferentIndices),
|
||||
("testSwapAtDifferentIndices_throughSlice", testSwapAtDifferentIndices_throughSlice),
|
||||
("testSwapAtSameIndex", testSwapAtSameIndex),
|
||||
("testSwapAtSameIndex_throughSlice", testSwapAtSameIndex_throughSlice),
|
||||
]
|
||||
}
|
||||
|
||||
extension SortingTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__SortingTests = [
|
||||
("testMutatingSort", testMutatingSort),
|
||||
("testMutatingSort_throughSlice", testMutatingSort_throughSlice),
|
||||
("testSortingUnsortedDictionary", testSortingUnsortedDictionary),
|
||||
("testSortingWithoutMutation", testSortingWithoutMutation),
|
||||
]
|
||||
}
|
||||
|
||||
extension SubscriptAmbiguityTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__SubscriptAmbiguityTests = [
|
||||
("testAccess", testAccess),
|
||||
("testIndexBasedUpdate", testIndexBasedUpdate),
|
||||
("testKeyBasedUpdate", testKeyBasedUpdate),
|
||||
]
|
||||
}
|
||||
|
||||
extension UpdatesTests {
|
||||
// DO NOT MODIFY: This is autogenerated, use:
|
||||
// `swift test --generate-linuxmain`
|
||||
// to regenerate.
|
||||
static let __allTests__UpdatesTests = [
|
||||
("testIndexBasedUpdate_viaMethod_duplicateKey", testIndexBasedUpdate_viaMethod_duplicateKey),
|
||||
("testIndexBasedUpdate_viaMethod_newUniqueKey", testIndexBasedUpdate_viaMethod_newUniqueKey),
|
||||
("testIndexBasedUpdate_viaMethod_sameKey", testIndexBasedUpdate_viaMethod_sameKey),
|
||||
("testIndexBasedUpdate_viaSubscriptMultiple_mixedKeys", testIndexBasedUpdate_viaSubscriptMultiple_mixedKeys),
|
||||
("testIndexBasedUpdate_viaSubscriptMultiple_newUniqueKeys", testIndexBasedUpdate_viaSubscriptMultiple_newUniqueKeys),
|
||||
("testIndexBasedUpdate_viaSubscriptMultiple_sameKeys", testIndexBasedUpdate_viaSubscriptMultiple_sameKeys),
|
||||
("testIndexBasedUpdate_viaSubscriptSingle_newUniqueKey", testIndexBasedUpdate_viaSubscriptSingle_newUniqueKey),
|
||||
("testIndexBasedUpdate_viaSubscriptSingle_sameKey", testIndexBasedUpdate_viaSubscriptSingle_sameKey),
|
||||
("testKeyBasedUpdate", testKeyBasedUpdate),
|
||||
]
|
||||
}
|
||||
|
||||
public func __allTests() -> [XCTestCaseEntry] {
|
||||
return [
|
||||
testCase(AccessTests.__allTests__AccessTests),
|
||||
testCase(CapacityTests.__allTests__CapacityTests),
|
||||
testCase(CodingTests.__allTests__CodingTests),
|
||||
testCase(DescriptionTests.__allTests__DescriptionTests),
|
||||
testCase(InitializationTests.__allTests__InitializationTests),
|
||||
testCase(InsertionsTests.__allTests__InsertionsTests),
|
||||
testCase(MapFilterTests.__allTests__MapFilterTests),
|
||||
testCase(RemovalTests.__allTests__RemovalTests),
|
||||
testCase(ReorderingTests.__allTests__ReorderingTests),
|
||||
testCase(SortingTests.__allTests__SortingTests),
|
||||
testCase(SubscriptAmbiguityTests.__allTests__SubscriptAmbiguityTests),
|
||||
testCase(UpdatesTests.__allTests__UpdatesTests),
|
||||
]
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user