71 const auto iter = find_entry(key);
72 if (iter == entries_.end()) {
73 return std::optional<TokenSet>{};
79 auto iter = find_entry(key);
80 if (iter == entries_.end()) {
81 entries_.emplace_back(key, std::move(tokens));
83 iter->second = std::move(tokens);
89 auto iter = find_entry(key);
90 if (iter != entries_.end()) {
97 using Entry = std::pair<TokenKey, TokenSet>;
99 static bool matches(
const MetadataMap& lhs,
const MetadataMap& rhs) {
100 if (lhs.size() != rhs.size()) {
104 auto lhs_iter = lhs.begin();
105 auto rhs_iter = rhs.begin();
106 for (; lhs_iter != lhs.end(); ++lhs_iter, ++rhs_iter) {
118 matches(lhs.attributes, rhs.attributes);
121 std::vector<Entry>::iterator find_entry(
const TokenKey& key) {
122 for (
auto iter = entries_.begin(); iter != entries_.end(); ++iter) {
123 if (matches(iter->first, key)) {
127 return entries_.end();
130 std::vector<Entry>::const_iterator find_entry(
const TokenKey& key)
const {
131 for (
auto iter = entries_.begin(); iter != entries_.end(); ++iter) {
132 if (matches(iter->first, key)) {
136 return entries_.end();
139 std::vector<Entry> entries_;
bool constant_time_string_equal(std::string_view lhs, std::string_view rhs) noexcept
Compare two strings without data-dependent early exit.
Definition constant_time.hpp:17