From e8bb80883684b89cce8799933a0c6a35905292e3 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 23 Nov 2022 23:40:57 +0800 Subject: [PATCH] LMAssembly // Again use struct in lieu of class if possible. --- .../LangModelAssembly/LMInstantiator.swift | 27 ++++++++++--------- .../SubLMs/lmAssociates.swift | 6 ++--- .../LangModelAssembly/SubLMs/lmCassette.swift | 6 ++--- .../LangModelAssembly/SubLMs/lmCoreEX.swift | 6 ++--- .../LangModelAssembly/SubLMs/lmCoreNS.swift | 6 ++--- .../SubLMs/lmPlainBopomofo.swift | 6 ++--- .../SubLMs/lmReplacements.swift | 6 ++--- 7 files changed, 33 insertions(+), 30 deletions(-) diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/LMInstantiator.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/LMInstantiator.swift index 70472e97..5d28b965 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/LMInstantiator.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/LMInstantiator.swift @@ -56,40 +56,43 @@ extension vChewingLM { // 聲明原廠語言模組: // Reverse 的話,第一欄是注音,第二欄是對應的漢字,第三欄是可能的權重。 // 不 Reverse 的話,第一欄是漢字,第二欄是對應的注音,第三欄是可能的權重。 - let lmCore = LMCoreNS( + var lmCore = LMCoreNS( reverse: false, consolidate: false, defaultScore: -9.9, forceDefaultScore: false ) - let lmMisc = LMCoreNS( + var lmMisc = LMCoreNS( reverse: true, consolidate: false, defaultScore: -1.0, forceDefaultScore: false ) // 簡體中文模式與繁體中文模式共用全字庫擴展模組,故靜態處理。 // 不然,每個模式都會讀入一份全字庫,會多佔用 100MB 記憶體。 - static let lmCNS = vChewingLM.LMCoreNS( + static var lmCNS = vChewingLM.LMCoreNS( reverse: true, consolidate: false, defaultScore: -11.0, forceDefaultScore: false ) - static let lmSymbols = vChewingLM.LMCoreNS( + static var lmSymbols = vChewingLM.LMCoreNS( reverse: true, consolidate: false, defaultScore: -13.0, forceDefaultScore: false ) // 磁帶資料模組。「currentCassette」對外唯讀,僅用來讀取磁帶本身的中繼資料(Metadata)。 - static let lmCassette = LMCassette() - public var currentCassette: LMCassette { Self.lmCassette } + static var lmCassette = LMCassette() + public var currentCassette: LMCassette { + get { Self.lmCassette } + set { Self.lmCassette = newValue } + } // 聲明使用者語言模組。 // 使用者語言模組使用多執行緒的話,可能會導致一些問題。有時間再仔細排查看看。 - let lmUserPhrases = LMCoreEX( + var lmUserPhrases = LMCoreEX( reverse: true, consolidate: true, defaultScore: 0, forceDefaultScore: false ) - let lmFiltered = LMCoreEX( + var lmFiltered = LMCoreEX( reverse: true, consolidate: true, defaultScore: 0, forceDefaultScore: true ) - let lmUserSymbols = LMCoreEX( + var lmUserSymbols = LMCoreEX( reverse: true, consolidate: true, defaultScore: -12.0, forceDefaultScore: true ) - let lmReplacements = LMReplacements() - let lmAssociates = LMAssociates() - let lmPlainBopomofo = LMPlainBopomofo() + var lmReplacements = LMReplacements() + var lmAssociates = LMAssociates() + var lmPlainBopomofo = LMPlainBopomofo() // MARK: - 工具函式 diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift index cb2555cb..c8ad6756 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmAssociates.swift @@ -12,7 +12,7 @@ import PinyinPhonaConverter import Shared extension vChewingLM { - public class LMAssociates { + @frozen public struct LMAssociates { var rangeMap: [String: [(Range, Int)]] = [:] var strData: String = "" @@ -35,7 +35,7 @@ extension vChewingLM { return "(\(arrTarget0),\(arrTarget[1]))" } - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } LMConsolidator.fixEOF(path: path) @@ -65,7 +65,7 @@ extension vChewingLM { return true } - public func clear() { + public mutating func clear() { rangeMap.removeAll() } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift index da3fee1a..d85c3a51 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCassette.swift @@ -14,7 +14,7 @@ import Shared extension vChewingLM { /// 磁帶模組,用來方便使用者自行擴充字根輸入法。 - public class LMCassette { + @frozen public struct LMCassette { public private(set) var nameShort: String = "" public private(set) var nameENG: String = "" public private(set) var nameCJK: String = "" @@ -65,7 +65,7 @@ extension vChewingLM { /// 第三欄資料為對應字根、可有可無。第一欄與第二欄分別為「字詞」與「統計頻次」。 /// - Parameter path: 檔案路徑。 /// - Returns: 是否載入成功。 - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } if FileManager.default.fileExists(atPath: path) { do { @@ -156,7 +156,7 @@ extension vChewingLM { return false } - public func clear() { + public mutating func clear() { keyNameMap.removeAll() charDefMap.removeAll() charDefWildcardMap.removeAll() diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift index 60f552d1..cba7d952 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreEX.swift @@ -16,7 +16,7 @@ extension vChewingLM { /// 需要資料的時候,直接拿 range 去 strData 取資料。 /// 資料記錄原理與上游 C++ 的 ParselessLM 差不多,但用的是 Swift 原生手段。 /// 主要時間消耗仍在 For 迴圈,但這個算法可以顯著減少記憶體佔用。 - public class LMCoreEX { + @frozen public struct LMCoreEX { /// 資料庫辭典。索引內容為注音字串,資料內容則為字串首尾範圍、方便自 strData 取資料。 var rangeMap: [String: [Range]] = [:] /// 資料庫字串陣列。 @@ -56,7 +56,7 @@ extension vChewingLM { /// 將資料從檔案讀入至資料庫辭典內。 /// - parameters: /// - path: 給定路徑。 - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } if allowConsolidation { @@ -88,7 +88,7 @@ extension vChewingLM { } /// 將當前語言模組的資料庫辭典自記憶體內卸除。 - public func clear() { + public mutating func clear() { rangeMap.removeAll() } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift index 5c710880..06e55492 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmCoreNS.swift @@ -14,7 +14,7 @@ extension vChewingLM { /// 與之前的 LMCore 不同,LMCoreNS 直接讀取 plist。 /// 這樣一來可以節省在舊 mac 機種內的資料讀入速度。 /// 目前僅針對輸入法原廠語彙資料檔案使用 plist 格式。 - public class LMCoreNS { + @frozen public struct LMCoreNS { /// 資料庫辭典。索引內容為經過加密的注音字串,資料內容則為 UTF8 資料陣列。 var rangeMap: [String: [Data]] = [:] /// 【已作廢】資料庫字串陣列。在 LMCoreNS 內沒有作用。 @@ -57,7 +57,7 @@ extension vChewingLM { /// 將資料從檔案讀入至資料庫辭典內。 /// - parameters: /// - path: 給定路徑。 - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } do { @@ -74,7 +74,7 @@ extension vChewingLM { } /// 將當前語言模組的資料庫辭典自記憶體內卸除。 - public func clear() { + public mutating func clear() { rangeMap.removeAll() } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift index 049564f0..eb25dc67 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmPlainBopomofo.swift @@ -11,7 +11,7 @@ import Foundation import Shared extension vChewingLM { - public class LMPlainBopomofo { + @frozen public struct LMPlainBopomofo { var rangeMap: [String: String] = [:] public var count: Int { rangeMap.count } @@ -22,7 +22,7 @@ extension vChewingLM { public var isLoaded: Bool { !rangeMap.isEmpty } - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } do { @@ -39,7 +39,7 @@ extension vChewingLM { return true } - public func clear() { + public mutating func clear() { rangeMap.removeAll() } diff --git a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift index 6de5a9b1..4abf4a7a 100644 --- a/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift +++ b/Packages/vChewing_LangModelAssembly/Sources/LangModelAssembly/SubLMs/lmReplacements.swift @@ -10,7 +10,7 @@ import Shared extension vChewingLM { - public class LMReplacements { + @frozen public struct LMReplacements { var rangeMap: [String: Range] = [:] var strData: String = "" @@ -22,7 +22,7 @@ extension vChewingLM { public var isLoaded: Bool { !rangeMap.isEmpty } - @discardableResult public func open(_ path: String) -> Bool { + @discardableResult public mutating func open(_ path: String) -> Bool { if isLoaded { return false } LMConsolidator.fixEOF(path: path) @@ -50,7 +50,7 @@ extension vChewingLM { return true } - public func clear() { + public mutating func clear() { rangeMap.removeAll() }