mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-06 14:21:43 +08:00
gdb/dwarf: use std::equal_range in cooked_index_shard::find
Looking at `cooked_index_shard::find`, I thought that we could make a small optimization: when finding the upper bound, we already know the lower bound. And we know that the upper bound is >= the lower bound. So we could pass `lower` as the first argument of the `std::upper_bound` call to cut the part of the search space that is below `lower`. It then occured to me that what we do is basically what `std::equal_range` is for, so why not use it. Implementations of `std::equal_range` are likely do to things as efficiently as possible. Unfortunately, because `cooked_index_entry::compare` is sensitive to the order of its parameters, we need to provide two different comparison functions (just like we do know, to the lower_bound and upper_bound calls). But I think that the use of equal_range makes it clear what the intent of the code is. Regression tested using the various DWARF target boards on Debian 12. Change-Id: Idfad812fb9abae1b942d81ad9976aeed7c2cf762 Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
parent
8cbf7d2a47
commit
ebfdb1089b
@ -547,25 +547,28 @@ cooked_index_shard::finalize (const parent_map_map *parent_maps)
|
||||
cooked_index_shard::range
|
||||
cooked_index_shard::find (const std::string &name, bool completing) const
|
||||
{
|
||||
cooked_index_entry::comparison_mode mode = (completing
|
||||
? cooked_index_entry::COMPLETE
|
||||
: cooked_index_entry::MATCH);
|
||||
|
||||
auto lower = std::lower_bound (m_entries.cbegin (), m_entries.cend (), name,
|
||||
[=] (const cooked_index_entry *entry,
|
||||
const std::string &n)
|
||||
struct comparator
|
||||
{
|
||||
return cooked_index_entry::compare (entry->canonical, n.c_str (), mode) < 0;
|
||||
});
|
||||
cooked_index_entry::comparison_mode mode;
|
||||
|
||||
auto upper = std::upper_bound (m_entries.cbegin (), m_entries.cend (), name,
|
||||
[=] (const std::string &n,
|
||||
const cooked_index_entry *entry)
|
||||
{
|
||||
return cooked_index_entry::compare (entry->canonical, n.c_str (), mode) > 0;
|
||||
});
|
||||
bool operator() (const cooked_index_entry *entry,
|
||||
const char *name) const noexcept
|
||||
{
|
||||
return cooked_index_entry::compare (entry->canonical, name, mode) < 0;
|
||||
}
|
||||
|
||||
return range (lower, upper);
|
||||
bool operator() (const char *name,
|
||||
const cooked_index_entry *entry) const noexcept
|
||||
{
|
||||
return cooked_index_entry::compare (entry->canonical, name, mode) > 0;
|
||||
}
|
||||
};
|
||||
|
||||
return std::make_from_tuple<range>
|
||||
(std::equal_range (m_entries.cbegin (), m_entries.cend (), name.c_str (),
|
||||
comparator { (completing
|
||||
? cooked_index_entry::COMPLETE
|
||||
: cooked_index_entry::MATCH) }));
|
||||
}
|
||||
|
||||
/* See cooked-index.h. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user