You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Currently, the key-extracting optimization mechanism incorrectly catches some volatile-qualified glvalues (due to _Remove_cvref_t) and attempts to bind them to a const K& reference, which makes the program ill-formed. This PR make the mechanism never catch volatile glvalues, which makes volatile accepted under some conditions as specified by the standard.
In piecewise construction, when the first tuple argument is a 1-tuple, it's sometimes possible to directly treat its only tuple element as the key. Also, since C++23, it should be possible to directly get the key from suitable tuple<K, V> and array<K, 2> without additional construction. This PR attempts to extend the optimization mechanism to catch these cases.
The mechanism should also be usable for flat_set and flat_map.
Note that subrange is intentionally ignored because the corresponding get function copies (or moves) the key, which doesn't seem desired.
frederick-vs-ja
changed the title
Fix and extend key extraction for unique map containers
Fix and extend key extraction for unique map/set containers
Oct 28, 2024
Thanks for noticing and fixing this! ๐ฆ ๐๏ธ ๐ ๏ธ
We usually changelog bugfixes as higher priority than perf improvements, but in this case volatile is extremely obscure while tuple and array aren't, so I'm going to changelog this as being primarily a perf improvement.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Currently, the key-extracting optimization mechanism incorrectly catches some
volatile
-qualified glvalues (due to_Remove_cvref_t
) and attempts to bind them to aconst K&
reference, which makes the program ill-formed. This PR make the mechanism never catchvolatile
glvalues, which makesvolatile
accepted under some conditions as specified by the standard.In piecewise construction, when the first
tuple
argument is a 1-tuple
, it's sometimes possible to directly treat its only tuple element as the key. Also, since C++23, it should be possible to directly get the key from suitabletuple<K, V>
andarray<K, 2>
without additional construction. This PR attempts to extend the optimization mechanism to catch these cases.The mechanism should also be usable for
flat_set
andflat_map
.Note that
subrange
is intentionally ignored because the correspondingget
function copies (or moves) the key, which doesn't seem desired.