Skip to content

Commit

Permalink
Optimise parsing by removing excessive copying.
Browse files Browse the repository at this point in the history
  • Loading branch information
maciejtrybilo committed Dec 2, 2023
1 parent 4654d5e commit 230efda
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 23 deletions.
20 changes: 0 additions & 20 deletions Sources/XMLCoder/Auxiliaries/KeyedStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,23 +75,3 @@ extension KeyedStorage: CustomStringConvertible {
return "[\(result)]"
}
}

extension KeyedStorage where Key == String, Value == Box {
func merge(element: XMLCoderElement) -> KeyedStorage<String, Box> {
var result = self

let hasElements = !element.elements.isEmpty
let hasAttributes = !element.attributes.isEmpty
let hasText = element.stringValue != nil

if hasElements || hasAttributes {
result.append(element.transformToBoxTree(), at: element.key)
} else if hasText {
result.append(element.transformToBoxTree(), at: element.key)
} else {
result.append(SingleKeyedBox(key: element.key, element: NullBox()), at: element.key)
}

return result
}
}
22 changes: 19 additions & 3 deletions Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,25 @@ struct XMLCoderElement: Equatable {
let attributes = KeyedStorage(self.attributes.map { attribute in
(key: attribute.key, value: StringBox(attribute.value) as SimpleBox)
})
let storage = KeyedStorage<String, Box>()
let elements = self.elements.reduce(storage) { $0.merge(element: $1) }
return KeyedBox(elements: elements, attributes: attributes)

var storage = KeyedStorage<String, Box>()

for element in self.elements {

let hasElements = !element.elements.isEmpty
let hasAttributes = !element.attributes.isEmpty
let hasText = element.stringValue != nil

if hasElements || hasAttributes {
storage.append(element.transformToBoxTree(), at: element.key)
} else if hasText {
storage.append(element.transformToBoxTree(), at: element.key)
} else {
storage.append(SingleKeyedBox(key: element.key, element: NullBox()), at: element.key)
}
}

return KeyedBox(elements: storage, attributes: attributes)
}

func toXMLString(
Expand Down

0 comments on commit 230efda

Please sign in to comment.