From 8d457783e00ae693e2874a5515cf958670c006c3 Mon Sep 17 00:00:00 2001 From: Sergey Date: Sun, 24 Sep 2017 02:33:45 +0300 Subject: [PATCH 1/2] Swift client --- baseline/swift_client/Strategy.swift | 28 ++ .../swift_client/client/BaseStrategy.swift | 10 + clients/swift_client/client/Socket.swift | 138 ++++++++ clients/swift_client/client/api.swift | 247 +++++++++++++++ clients/swift_client/client/main.swift | 66 ++++ .../client/project.xcodeproj/project.pbxproj | 294 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 186533 bytes 8 files changed, 790 insertions(+) create mode 100644 baseline/swift_client/Strategy.swift create mode 100644 clients/swift_client/client/BaseStrategy.swift create mode 100644 clients/swift_client/client/Socket.swift create mode 100644 clients/swift_client/client/api.swift create mode 100644 clients/swift_client/client/main.swift create mode 100644 clients/swift_client/client/project.xcodeproj/project.pbxproj create mode 100644 clients/swift_client/client/project.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 clients/swift_client/client/project.xcodeproj/project.xcworkspace/xcuserdata/sergey.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/baseline/swift_client/Strategy.swift b/baseline/swift_client/Strategy.swift new file mode 100644 index 0000000..3407ac4 --- /dev/null +++ b/baseline/swift_client/Strategy.swift @@ -0,0 +1,28 @@ +import Foundation + +class Strategy: BaseStrategy { + let debug:Debug + required init(debug:Debug) + { + self.debug = debug + } + func onTick(myElevators:[Elevator], enemyElevators:[Elevator], myPassenger:[Passenger], enemyPassenger: [Passenger]) { + myElevators.forEach({ elevator in + myPassenger.forEach({ + if $0.state.rawValue < 5{ + if elevator.state != .moving + { + elevator.go(toFloor: $0.fromFloor) + } + if elevator.floor == $0.fromFloor + { + $0.set(elevator: elevator) + } + } + }) + if !elevator.passengers.isEmpty && elevator.state != .moving{ + elevator.go(toFloor: elevator.passengers.first!.destFloor) + } + }) + } +} diff --git a/clients/swift_client/client/BaseStrategy.swift b/clients/swift_client/client/BaseStrategy.swift new file mode 100644 index 0000000..b14ec5c --- /dev/null +++ b/clients/swift_client/client/BaseStrategy.swift @@ -0,0 +1,10 @@ +import Foundation + +protocol Debug { + func log(object:AnyObject) + func `extension`(object:AnyObject) +} +protocol BaseStrategy { + init(debug:Debug) + func onTick(myElevators:[Elevator], enemyElevators:[Elevator], myPassenger:[Passenger], enemyPassenger: [Passenger]) +} diff --git a/clients/swift_client/client/Socket.swift b/clients/swift_client/client/Socket.swift new file mode 100644 index 0000000..1998216 --- /dev/null +++ b/clients/swift_client/client/Socket.swift @@ -0,0 +1,138 @@ +// +// Copyright (c) 2016 iAchieved.it LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +import Foundation + +public protocol SocketDelegate { + +} + +public class Socket:NSObject, StreamDelegate { + let host: String + let port: Int + fileprivate let readConditions = NSCondition() + fileprivate let writeConditions = NSCondition() + fileprivate let inputStream: InputStream + fileprivate let outputStream: OutputStream + fileprivate let readBuffer = UnsafeMutablePointer.allocate(capacity: 1024) + fileprivate var readData = Data() + init(host:String, port:Int) { + self.host = host + self.port = port + var input:InputStream? + var out:OutputStream? + Stream.getStreamsToHost(withName: host, port: port, inputStream: &input, outputStream: &out) + inputStream = input! + outputStream = out! + super.init() + inputStream.delegate = self; + outputStream.delegate = self; + } + + func connect() throws { + Thread.detachNewThread { + let runLoop = RunLoop.current + self.inputStream.schedule(in: runLoop, forMode: .commonModes) + self.outputStream.schedule(in: runLoop, forMode: .commonModes); + self.inputStream.open() + self.outputStream.open() + while self.inputStream.streamStatus != .closed + { + runLoop.run(until: Date().addingTimeInterval(1)) + } + } + } + + func readLine() -> Data? { + var line:Data! + var appendingStart = 0 + while line == nil { + if let eol = readData.subdata(in: appendingStart.. = 0.. Bool { + return self.elevator != -1; + } + + +} + +class Elevator:Codable,ProvideMessages { + enum State: Int,Codable{ + case waiting = 0, moving, opening, filling, closing + } + let passengers:[Passenger] + let state: State + let timeOnFloor: Int + var nextFloor: Int + let y:Float + let speed: Float + let type: String + let id:Int + let floor:Int + + internal var messages = [Message]() + + init(passengers:[Passenger],state:State,timeOnFloor:Int,nextFlor:Int,y:Float,speed:Float,type:String, id: Int, floor: Int) { + self.passengers = passengers + self.state = state + self.timeOnFloor = timeOnFloor + self.nextFloor = nextFlor + self.y = y + self.speed = speed + self.type = type + self.id = id + self.floor = floor + } + + enum CodingKeys: String, CodingKey { + case passengers,state,y,speed,type,id,floor + case timeOnFloor = "time_on_floor" + case nextFloor = "next_floor" + } + + func go(toFloor floor:Int) + { + self.nextFloor = floor; + self.messages.append(GoToFloor(elevatorId: self.id, floor: floor)) + } +} + +class DebugLog: Debug,ProvideMessages { + var messages = [Message]() + func log(object: AnyObject) { + messages.append(LogMessage(text: object.debugDescription)) + } + + func `extension`(object: AnyObject) { + messages.append(LogMessage(text: object.debugDescription)) + } + + +} diff --git a/clients/swift_client/client/main.swift b/clients/swift_client/client/main.swift new file mode 100644 index 0000000..5e9a7c9 --- /dev/null +++ b/clients/swift_client/client/main.swift @@ -0,0 +1,66 @@ +import Foundation + +class Client { + let socket:Socket + let solutionID: Int + let strategy: BaseStrategy + let debug = DebugLog() + init(host:String, port: Int, solutionID: Int) { + socket = Socket(host: host, port: port) + self.solutionID = solutionID + strategy = Strategy(debug: debug) + } + + func run() { + let decoder = JSONDecoder() + let encoder = JSONEncoder() + try! socket.connect() + socket.write(data: "{\"solution_id\": \(solutionID)}\n".data(using: .utf8)!) + + guard let data = socket.readLine() else { + print("Can't read data") + return + + } + + let _ = try! decoder.decode(FirstMessage.self, from: data) + + while true{ + guard let data = socket.readLine() else { + print("Can't read data") + break + } + do { + let state = try decoder.decode(WorldState.self, from: data) + strategy.onTick(myElevators: state.myElevators, enemyElevators: state.enemyElevators, myPassenger: state.myPassenger, enemyPassenger: state.enemyPassenger) + + + var messagesToSend = [Message]() + var objects:[ProvideMessages] = state.myElevators+state.enemyElevators + objects.append(debug) + for sendObject in objects + { + messagesToSend.append(contentsOf: sendObject.messages) + } + debug.messages.removeAll() + + var sendData = try! encoder.encode(messagesToSend) + sendData.append("\n".data(using: .utf8)!) + socket.write(data: sendData) + }catch { + if let message = try? decoder.decode([String:String].self, from: data), let text = message["message"] + { + print("Close with message: \(text)") + }else{ + print("\(error)") + } + } + } + } +} + + +let host = ProcessInfo.processInfo.environment["WORLD_NAME"] ?? "127.0.0.1" +let solutionId = Int(ProcessInfo.processInfo.environment["SOLUTION_ID"] ?? "") ?? 0 +let client = Client(host: host, port: 8000, solutionID:solutionId); +client.run() diff --git a/clients/swift_client/client/project.xcodeproj/project.pbxproj b/clients/swift_client/client/project.xcodeproj/project.pbxproj new file mode 100644 index 0000000..38e24c7 --- /dev/null +++ b/clients/swift_client/client/project.xcodeproj/project.pbxproj @@ -0,0 +1,294 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + A571A63C1F75949B00EC449E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A571A63B1F75949B00EC449E /* main.swift */; }; + A571A6431F75983000EC449E /* Socket.swift in Sources */ = {isa = PBXBuildFile; fileRef = A571A6421F75983000EC449E /* Socket.swift */; }; + A571A6451F75AF4300EC449E /* api.swift in Sources */ = {isa = PBXBuildFile; fileRef = A571A6441F75AF4300EC449E /* api.swift */; }; + A571A6471F75DA3B00EC449E /* BaseStrategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A571A6461F75DA3B00EC449E /* BaseStrategy.swift */; }; + A571A6491F75DAE900EC449E /* Strategy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A571A6481F75DAE900EC449E /* Strategy.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + A571A6361F75949B00EC449E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + A571A6381F75949B00EC449E /* client */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = client; sourceTree = BUILT_PRODUCTS_DIR; }; + A571A63B1F75949B00EC449E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + A571A6421F75983000EC449E /* Socket.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Socket.swift; sourceTree = ""; }; + A571A6441F75AF4300EC449E /* api.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = api.swift; sourceTree = ""; }; + A571A6461F75DA3B00EC449E /* BaseStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseStrategy.swift; sourceTree = ""; }; + A571A6481F75DAE900EC449E /* Strategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Strategy.swift; path = ../../../baseline/swift_client/Strategy.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A571A6351F75949B00EC449E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + A571A62F1F75949A00EC449E = { + isa = PBXGroup; + children = ( + A571A63A1F75949B00EC449E /* client */, + A571A6391F75949B00EC449E /* Products */, + ); + sourceTree = ""; + }; + A571A6391F75949B00EC449E /* Products */ = { + isa = PBXGroup; + children = ( + A571A6381F75949B00EC449E /* client */, + ); + name = Products; + sourceTree = ""; + }; + A571A63A1F75949B00EC449E /* client */ = { + isa = PBXGroup; + children = ( + A571A63B1F75949B00EC449E /* main.swift */, + A571A6421F75983000EC449E /* Socket.swift */, + A571A6441F75AF4300EC449E /* api.swift */, + A571A6461F75DA3B00EC449E /* BaseStrategy.swift */, + A571A6481F75DAE900EC449E /* Strategy.swift */, + ); + name = client; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + A571A6371F75949B00EC449E /* client */ = { + isa = PBXNativeTarget; + buildConfigurationList = A571A63F1F75949B00EC449E /* Build configuration list for PBXNativeTarget "client" */; + buildPhases = ( + A571A6341F75949B00EC449E /* Sources */, + A571A6351F75949B00EC449E /* Frameworks */, + A571A6361F75949B00EC449E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = client; + productName = TestSwift; + productReference = A571A6381F75949B00EC449E /* client */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A571A6301F75949A00EC449E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 0900; + ORGANIZATIONNAME = home; + TargetAttributes = { + A571A6371F75949B00EC449E = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = A571A6331F75949A00EC449E /* Build configuration list for PBXProject "project" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = A571A62F1F75949A00EC449E; + productRefGroup = A571A6391F75949B00EC449E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A571A6371F75949B00EC449E /* client */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + A571A6341F75949B00EC449E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A571A6491F75DAE900EC449E /* Strategy.swift in Sources */, + A571A63C1F75949B00EC449E /* main.swift in Sources */, + A571A6451F75AF4300EC449E /* api.swift in Sources */, + A571A6431F75983000EC449E /* Socket.swift in Sources */, + A571A6471F75DA3B00EC449E /* BaseStrategy.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A571A63D1F75949B00EC449E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + A571A63E1F75949B00EC449E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + }; + name = Release; + }; + A571A6401F75949B00EC449E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + A571A6411F75949B00EC449E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A571A6331F75949A00EC449E /* Build configuration list for PBXProject "project" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A571A63D1F75949B00EC449E /* Debug */, + A571A63E1F75949B00EC449E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A571A63F1F75949B00EC449E /* Build configuration list for PBXNativeTarget "client" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A571A6401F75949B00EC449E /* Debug */, + A571A6411F75949B00EC449E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = A571A6301F75949A00EC449E /* Project object */; +} diff --git a/clients/swift_client/client/project.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/clients/swift_client/client/project.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..06aa6b4 --- /dev/null +++ b/clients/swift_client/client/project.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/clients/swift_client/client/project.xcodeproj/project.xcworkspace/xcuserdata/sergey.xcuserdatad/UserInterfaceState.xcuserstate b/clients/swift_client/client/project.xcodeproj/project.xcworkspace/xcuserdata/sergey.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..1bae4beef3573dfe3d3a4f6d7915000b59abcf64 GIT binary patch literal 186533 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 Date: Mon, 25 Sep 2017 02:21:59 +0300 Subject: [PATCH 2/2] Rework parser to passenger containe elevator object --- clients/swift_client/client/api.swift | 60 ++++++++++++++++++++++++-- clients/swift_client/client/main.swift | 14 +++--- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/clients/swift_client/client/api.swift b/clients/swift_client/client/api.swift index 2ea27dc..49e9b59 100644 --- a/clients/swift_client/client/api.swift +++ b/clients/swift_client/client/api.swift @@ -10,6 +10,8 @@ protocol ProvideMessages { var messages:[Message] {get} } + + class SetElevator:Message { struct Arguments:Encodable { let passengerId: Int @@ -119,6 +121,19 @@ struct FirstMessage: Codable { } struct WorldState:Codable { + + class DecodeContext{ + static let key = CodingUserInfoKey(rawValue: "elevators")! + private(set) var elevators: [Int:Elevator]! + func set(elevators:[Elevator]) { + self.elevators = elevators.reduce(Dictionary()) {dict, element in + var dict = dict + dict[element.id] = element + return dict + } + } + } + let myElevators:[Elevator] let myPassenger:[Passenger] let enemyElevators:[Elevator] @@ -130,6 +145,21 @@ struct WorldState:Codable { case enemyElevators = "enemy_elevators" case enemyPassenger = "enemy_passengers" } + + public init(from decoder: Decoder) throws + { + let container = try decoder.container(keyedBy: CodingKeys.self) + myElevators = try container.decode([Elevator].self, forKey: .myElevators) + enemyElevators = try container.decode([Elevator].self, forKey: .enemyElevators) + + if let context = decoder.userInfo[DecodeContext.key] as? DecodeContext + { + context.set(elevators: myElevators+enemyElevators) + } + + myPassenger = try container.decode([Passenger].self, forKey: .myPassenger) + enemyPassenger = try container.decode([Passenger].self, forKey: .enemyPassenger) + } } class Passenger:Codable,ProvideMessages { @@ -147,7 +177,7 @@ class Passenger:Codable,ProvideMessages { let x:Int let y:Float let type:String - private(set) var elevator: Int = -1 + private(set) var elevator: Elevator? = nil internal var messages = [Message]() @@ -174,19 +204,41 @@ class Passenger:Codable,ProvideMessages { } enum CodingKeys: String, CodingKey { - case weight,state,y,floor,type,id,x + case weight,state,y,floor,type,id,x,elevator case destFloor = "dest_floor" case fromFloor = "from_floor" case timeToAway = "time_to_away" + + } + + public required init(from decoder: Decoder) throws + { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.id = try container.decode(Int.self, forKey: .id) + self.destFloor = try container.decode(Int.self, forKey: .destFloor) + self.weight = try container.decode(Float.self, forKey: .weight) + self.fromFloor = try container.decode(Int.self, forKey: .fromFloor) + self.floor = try container.decode(Int.self, forKey: .floor) + self.timeToAway = try container.decode(Int.self, forKey: .timeToAway) + self.state = try container.decode(State.self, forKey: .state) + self.x = try container.decode(Int.self, forKey: .x) + self.y = try container.decode(Float.self, forKey: .y) + self.type = try container.decode(String.self, forKey: .type) + + + if let elevatorId = try? container.decode(Int.self, forKey: .elevator), let context = decoder.userInfo[WorldState.DecodeContext.key] as? WorldState.DecodeContext + { + self.elevator = context.elevators[elevatorId] + } } func set(elevator: Elevator) { - self.elevator = elevator.id; + self.elevator = elevator; self.messages.append(SetElevator(elevatorId: elevator.id, passengerId: self.id)) } func hasElevator() -> Bool { - return self.elevator != -1; + return self.elevator != nil; } diff --git a/clients/swift_client/client/main.swift b/clients/swift_client/client/main.swift index 5e9a7c9..146a8d9 100644 --- a/clients/swift_client/client/main.swift +++ b/clients/swift_client/client/main.swift @@ -3,16 +3,17 @@ import Foundation class Client { let socket:Socket let solutionID: Int - let strategy: BaseStrategy + var strategy: BaseStrategy! let debug = DebugLog() init(host:String, port: Int, solutionID: Int) { socket = Socket(host: host, port: port) self.solutionID = solutionID - strategy = Strategy(debug: debug) + } func run() { let decoder = JSONDecoder() + decoder.userInfo[WorldState.DecodeContext.key] = WorldState.DecodeContext() let encoder = JSONEncoder() try! socket.connect() socket.write(data: "{\"solution_id\": \(solutionID)}\n".data(using: .utf8)!) @@ -23,8 +24,8 @@ class Client { } - let _ = try! decoder.decode(FirstMessage.self, from: data) - + let first = try! decoder.decode(FirstMessage.self, from: data) + strategy = Strategy(debug: debug,type: first.color) while true{ guard let data = socket.readLine() else { print("Can't read data") @@ -36,7 +37,7 @@ class Client { var messagesToSend = [Message]() - var objects:[ProvideMessages] = state.myElevators+state.enemyElevators + var objects:[ProvideMessages] = state.myElevators as [ProvideMessages] + state.myPassenger as [ProvideMessages] objects.append(debug) for sendObject in objects { @@ -46,6 +47,7 @@ class Client { var sendData = try! encoder.encode(messagesToSend) sendData.append("\n".data(using: .utf8)!) + socket.write(data: sendData) }catch { if let message = try? decoder.decode([String:String].self, from: data), let text = message["message"] @@ -54,6 +56,8 @@ class Client { }else{ print("\(error)") } + + break; } } }