mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-10 04:15:54 +00:00
0a8986bc77
Saving both memory and processing, we can move entries from one savepoint to another, specially when the target is empty as it often is during transaction processing
52 lines
1.3 KiB
Nim
52 lines
1.3 KiB
Nim
# Nimbus
|
|
# Copyright (c) 2023-2024 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
# http://opensource.org/licenses/MIT)
|
|
# at your option. This file may not be copied, modified, or distributed except
|
|
# according to those terms.
|
|
|
|
{.push raises: [], gcsafe.}
|
|
|
|
import
|
|
std/[tables, sets]
|
|
|
|
# Utilities for merging source data into a target taking care to move data and
|
|
# leave the source empty
|
|
func mergeAndReset*(tgt, src: var auto) =
|
|
tgt = move(src)
|
|
|
|
func mergeAndReset*(tgt, src: var seq) =
|
|
mixin mergeAndReset
|
|
if tgt.len == 0:
|
|
swap(tgt, src)
|
|
else:
|
|
let tlen = tgt.len
|
|
tgt.setLen(tgt.len + src.len)
|
|
for i, sv in src.mpairs():
|
|
mergeAndReset(tgt[tlen + i], sv)
|
|
src.reset()
|
|
|
|
func mergeAndReset*(tgt, src: var HashSet) =
|
|
mixin mergeAndReset
|
|
if tgt.len == 0:
|
|
swap(tgt, src)
|
|
else:
|
|
for sv in src.items():
|
|
tgt.incl(sv)
|
|
src.reset()
|
|
|
|
func mergeAndReset*(tgt, src: var Table) =
|
|
mixin mergeAndReset
|
|
if tgt.len == 0:
|
|
swap(tgt, src)
|
|
else:
|
|
for k, sv in src.mpairs():
|
|
tgt.withValue(k, tv):
|
|
mergeAndReset(tv[], sv)
|
|
do:
|
|
tgt[k] = move(sv)
|
|
src.reset()
|