struct CaseSet
: Optimize by match
ing on len
once per set_ctx
#1283
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.
In C,
case_set
works byswitch
ing once onlen
, once perset_ctx
, but myCaseSet
implementation in Rust accidentally switched tomatch
ing onbuf.len()
each time. This goes back to the original, optimal behavior.To do this,
set_ctx
is made a rank-2 polymorphic "closure". This does not exist in Rust, so it's emulated through a generic trait with a generic method. This inner generic overtrait CaseSetter
is what allowsfn CaseSet::one
to select the correctCaseSetterN
at compile time.However, this means that closures can't be used anymore, which is very annoying. To partially remedy this, I added the
set_ctx!
macro, which emulates theset_ctx
closure as much as possible. All captures (up vars inrustc
) and their types must be declared.I didn't actually benchmark this or look at the asm yet, though, if anyone wants to do that.