mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 07:09:15 +01:00
Merge bitcoin/bitcoin#33192: refactor: unify container presence checks
d9319b06cfrefactor: unify container presence checks - non-trivial counts (Lőrinc)039307554erefactor: unify container presence checks - trivial counts (Lőrinc)8bb9219b63refactor: unify container presence checks - find (Lőrinc) Pull request description: ### Summary Instead of counting occurrences in sets and maps, the C++20 `::contains` method expresses the intent unambiguously and can return early on first encounter. ### Context Applied clang‑tidy's [readability‑container‑contains](https://clang.llvm.org/extra/clang-tidy/checks/readability/container-contains.html) check, though many cases required manual changes since tidy couldn't fix them automatically. ### Changes The changes made here were: | From | To | |------------------------|------------------| | `m.find(k) == m.end()` | `!m.contains(k)` | | `m.find(k) != m.end()` | `m.contains(k)` | | `m.count(k)` | `m.contains(k)` | | `!m.count(k)` | `!m.contains(k)` | | `m.count(k) == 0` | `!m.contains(k)` | | `m.count(k) != 1` | `!m.contains(k)` | | `m.count(k) == 1` | `m.contains(k)` | | `m.count(k) < 1` | `!m.contains(k)` | | `m.count(k) > 0` | `m.contains(k)` | | `m.count(k) != 0` | `m.contains(k)` | > Note that `== 1`/`!= 1`/`< 1` only apply to simple [maps](https://en.cppreference.com/w/cpp/container/map/contains)/[sets](https://en.cppreference.com/w/cpp/container/set/contains) and had to be changed manually. There are many other cases that could have been changed, but we've reverted most of those to reduce conflict with other open PRs. ----- <details> <summary>clang-tidy command on Mac</summary> ```bash rm -rfd build && \ cmake -B build \ -DCMAKE_C_COMPILER="$(brew --prefix llvm)/bin/clang" \ -DCMAKE_CXX_COMPILER="$(brew --prefix llvm)/bin/clang++" \ -DCMAKE_OSX_SYSROOT="$(xcrun --show-sdk-path)" \ -DCMAKE_C_FLAGS="-target arm64-apple-macos11" \ -DCMAKE_CXX_FLAGS="-target arm64-apple-macos11" \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DBUILD_BENCH=ON -DBUILD_FUZZ_BINARY=ON -DBUILD_FOR_FUZZING=ON "$(brew --prefix llvm)/bin/run-clang-tidy" -quiet -p build -j$(nproc) -checks='-*,readability-container-contains' | grep -v 'clang-tidy' ``` </details> Note: this is a take 2 of https://github.com/bitcoin/bitcoin/pull/33094 with fewer contentious changes. ACKs for top commit: optout21: reACKd9319b06cfsedited: ACKd9319b06cfjanb84: re ACKd9319b06cfpablomartin4btc: re-ACKd9319b06cfryanofsky: Code review ACKd9319b06cf. I manually reviewed the full change, and it seems there are a lot of positive comments about this and no more very significant conflicts, so I will merge it shortly. Tree-SHA512: e4415221676cfb88413ccc446e5f4369df7a55b6642347277667b973f515c3c8ee5bfa9ee0022479c8de945c89fbc9ff61bd8ba086e70f30298cbc1762610fe1
This commit is contained in:
@@ -73,7 +73,7 @@ MiniMiner::MiniMiner(const CTxMemPool& mempool, const std::vector<COutPoint>& ou
|
||||
|
||||
// Add every entry to m_entries_by_txid and m_entries, except the ones that will be replaced.
|
||||
for (const auto& txiter : cluster) {
|
||||
if (!m_to_be_replaced.count(txiter->GetTx().GetHash())) {
|
||||
if (!m_to_be_replaced.contains(txiter->GetTx().GetHash())) {
|
||||
auto [ancestor_count, ancestor_size, ancestor_fee] = mempool.CalculateAncestorData(*txiter);
|
||||
auto [mapiter, success] = m_entries_by_txid.emplace(txiter->GetTx().GetHash(),
|
||||
MiniMinerMempoolEntry{/*tx_in=*/txiter->GetSharedTx(),
|
||||
@@ -101,13 +101,13 @@ MiniMiner::MiniMiner(const CTxMemPool& mempool, const std::vector<COutPoint>& ou
|
||||
// Cache descendants for future use. Unlike the real mempool, a descendant MiniMinerMempoolEntry
|
||||
// will not exist without its ancestor MiniMinerMempoolEntry, so these sets won't be invalidated.
|
||||
std::vector<MockEntryMap::iterator> cached_descendants;
|
||||
const bool remove{m_to_be_replaced.count(txid) > 0};
|
||||
const bool remove{m_to_be_replaced.contains(txid)};
|
||||
CTxMemPool::setEntries descendants;
|
||||
mempool.CalculateDescendants(txiter, descendants);
|
||||
Assume(descendants.count(txiter) > 0);
|
||||
Assume(descendants.contains(txiter));
|
||||
for (const auto& desc_txiter : descendants) {
|
||||
const auto txid_desc = desc_txiter->GetTx().GetHash();
|
||||
const bool remove_desc{m_to_be_replaced.count(txid_desc) > 0};
|
||||
const bool remove_desc{m_to_be_replaced.contains(txid_desc)};
|
||||
auto desc_it{m_entries_by_txid.find(txid_desc)};
|
||||
Assume((desc_it == m_entries_by_txid.end()) == remove_desc);
|
||||
if (remove) Assume(remove_desc);
|
||||
@@ -136,7 +136,7 @@ MiniMiner::MiniMiner(const std::vector<MiniMinerMempoolEntry>& manual_entries,
|
||||
for (const auto& entry : manual_entries) {
|
||||
const auto& txid = entry.GetTx().GetHash();
|
||||
// We need to know the descendant set of every transaction.
|
||||
if (!Assume(descendant_caches.count(txid) > 0)) {
|
||||
if (!Assume(descendant_caches.contains(txid))) {
|
||||
m_ready_to_calculate = false;
|
||||
return;
|
||||
}
|
||||
@@ -201,7 +201,7 @@ void MiniMiner::DeleteAncestorPackage(const std::set<MockEntryMap::iterator, Ite
|
||||
Assume(ancestors.size() >= 1);
|
||||
// "Mine" all transactions in this ancestor set.
|
||||
for (auto& anc : ancestors) {
|
||||
Assume(m_in_block.count(anc->first) == 0);
|
||||
Assume(!m_in_block.contains(anc->first));
|
||||
m_in_block.insert(anc->first);
|
||||
m_total_fees += anc->second.GetModifiedFee();
|
||||
m_total_vsize += anc->second.GetTxSize();
|
||||
@@ -240,7 +240,7 @@ void MiniMiner::SanityCheck() const
|
||||
entry->second.GetModFeesWithAncestors() >= entry->second.GetModifiedFee();}));
|
||||
// None of the entries should be to-be-replaced transactions
|
||||
Assume(std::all_of(m_to_be_replaced.begin(), m_to_be_replaced.end(),
|
||||
[&](const auto& txid){return m_entries_by_txid.find(txid) == m_entries_by_txid.end();}));
|
||||
[&](const auto& txid){ return !m_entries_by_txid.contains(txid); }));
|
||||
}
|
||||
|
||||
void MiniMiner::BuildMockTemplate(std::optional<CFeeRate> target_feerate)
|
||||
@@ -274,7 +274,7 @@ void MiniMiner::BuildMockTemplate(std::optional<CFeeRate> target_feerate)
|
||||
ancestors.insert(*iter);
|
||||
for (const auto& input : (*iter)->second.GetTx().vin) {
|
||||
if (auto parent_it{m_entries_by_txid.find(input.prevout.hash)}; parent_it != m_entries_by_txid.end()) {
|
||||
if (ancestors.count(parent_it) == 0) {
|
||||
if (!ancestors.contains(parent_it)) {
|
||||
to_process.insert(parent_it);
|
||||
}
|
||||
}
|
||||
@@ -400,7 +400,7 @@ std::optional<CAmount> MiniMiner::CalculateTotalBumpFees(const CFeeRate& target_
|
||||
for (const auto& [txid, outpoints] : m_requested_outpoints_by_txid) {
|
||||
// Skip any ancestors that already have a miner score higher than the target feerate
|
||||
// (already "made it" into the block)
|
||||
if (m_in_block.count(txid)) continue;
|
||||
if (m_in_block.contains(txid)) continue;
|
||||
auto iter = m_entries_by_txid.find(txid);
|
||||
if (iter == m_entries_by_txid.end()) continue;
|
||||
to_process.insert(iter);
|
||||
@@ -413,7 +413,7 @@ std::optional<CAmount> MiniMiner::CalculateTotalBumpFees(const CFeeRate& target_
|
||||
const CTransaction& tx = (*iter)->second.GetTx();
|
||||
for (const auto& input : tx.vin) {
|
||||
if (auto parent_it{m_entries_by_txid.find(input.prevout.hash)}; parent_it != m_entries_by_txid.end()) {
|
||||
if (!has_been_processed.count(input.prevout.hash)) {
|
||||
if (!has_been_processed.contains(input.prevout.hash)) {
|
||||
to_process.insert(parent_it);
|
||||
}
|
||||
ancestors.insert(parent_it);
|
||||
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
// Read the version
|
||||
uint16_t version;
|
||||
s >> version;
|
||||
if (m_supported_versions.find(version) == m_supported_versions.end()) {
|
||||
if (!m_supported_versions.contains(version)) {
|
||||
throw std::ios_base::failure(strprintf("Version of snapshot %s does not match any of the supported versions.", version));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user