Semantics are unchanged.
Some special case handling was changed to early-out, because of that the
indentation changed but the logic is the same as before.
- introduced class MatchTraits with enums that replace bool template
parameters
- (minor: made negation the last template parameters because negation
executes last during evaluation)