Improve implementation of flags cloneAndReplace
This MR simplifies the implementation of the cloneAndReplace. Before each operation was basically copying large dictionary of the flags. Now the "rewiring" is remembered and used when constructing the flag address. The flags are effiectively only shallow copied irrespectively if they are locked or not (btw I do not think we have usecase for cloneAndReplace for unlocked flags). I have measured the time spent on this operation in code like:
newflags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.LowPtPass")
# now access some flags to makre sure slower reading is not spoiling the benefit of faster c&r
vals = newflags.Tracking.ActiveConfig.extension, newflags.Tracking.ActiveConfig.maxSctHoles, newflags.Tracking.ActiveConfig.useSeedFilter, newflags.Tracking.ActiveConfig.radMax
newflags = flags.cloneAndReplace("Tracking.ActiveConfig", "Tracking.LowPtRoIPass")
....
The time (on 4 such operations) changed from 0.04s to 0.014 (about 3times faster).
The implementation will also be very easy to modify if we will like to maintain the access to rewired flags that @jmasik and @sutt need. Tagging @tstreble @tadej @wlampl @fwinkl
Edited by Thomas Strebler