diff options
author | Andrew Chow <achow101-github@achow101.com> | 2022-05-31 17:39:19 -0400 |
---|---|---|
committer | Andrew Chow <github@achow101.com> | 2023-12-08 14:54:48 -0500 |
commit | e1abfb5b2037ca4fe5a05aa578030c8016491c8b (patch) | |
tree | 7a16d2f76ed6a6eb88629dc63757a82e01b5667c /src/wallet/coincontrol.cpp | |
parent | dce1dfbc47050404bcf3ce2461e8baff0b088ffb (diff) | |
download | bitcoin-e1abfb5b2037ca4fe5a05aa578030c8016491c8b.tar.xz |
wallet: Introduce and use PreselectedInput class in CCoinControl
Instead of having different maps for selected inputs, external inputs,
and input weight in CCoinControl, have a class PreselectedInput which
tracks stores that information for each input.
Diffstat (limited to 'src/wallet/coincontrol.cpp')
-rw-r--r-- | src/wallet/coincontrol.cpp | 79 |
1 files changed, 57 insertions, 22 deletions
diff --git a/src/wallet/coincontrol.cpp b/src/wallet/coincontrol.cpp index 2087119db9..a4f3bdac23 100644 --- a/src/wallet/coincontrol.cpp +++ b/src/wallet/coincontrol.cpp @@ -14,69 +14,104 @@ CCoinControl::CCoinControl() bool CCoinControl::HasSelected() const { - return !m_selected_inputs.empty(); + return !m_selected.empty(); } -bool CCoinControl::IsSelected(const COutPoint& output) const +bool CCoinControl::IsSelected(const COutPoint& outpoint) const { - return m_selected_inputs.count(output) > 0; + return m_selected.count(outpoint) > 0; } -bool CCoinControl::IsExternalSelected(const COutPoint& output) const +bool CCoinControl::IsExternalSelected(const COutPoint& outpoint) const { - return m_external_txouts.count(output) > 0; + const auto it = m_selected.find(outpoint); + return it != m_selected.end() && it->second.HasTxOut(); } std::optional<CTxOut> CCoinControl::GetExternalOutput(const COutPoint& outpoint) const { - const auto ext_it = m_external_txouts.find(outpoint); - if (ext_it == m_external_txouts.end()) { + const auto it = m_selected.find(outpoint); + if (it == m_selected.end() || !it->second.HasTxOut()) { return std::nullopt; } - - return std::make_optional(ext_it->second); + return it->second.GetTxOut(); } -void CCoinControl::Select(const COutPoint& output) +PreselectedInput& CCoinControl::Select(const COutPoint& outpoint) { - m_selected_inputs.insert(output); + return m_selected[outpoint]; } void CCoinControl::SelectExternal(const COutPoint& outpoint, const CTxOut& txout) { - m_selected_inputs.insert(outpoint); - m_external_txouts.emplace(outpoint, txout); + m_selected[outpoint].SetTxOut(txout); } -void CCoinControl::UnSelect(const COutPoint& output) +void CCoinControl::UnSelect(const COutPoint& outpoint) { - m_selected_inputs.erase(output); + m_selected.erase(outpoint); } void CCoinControl::UnSelectAll() { - m_selected_inputs.clear(); + m_selected.clear(); } std::vector<COutPoint> CCoinControl::ListSelected() const { - return {m_selected_inputs.begin(), m_selected_inputs.end()}; + std::vector<COutPoint> outpoints; + std::transform(m_selected.begin(), m_selected.end(), std::back_inserter(outpoints), + [](const std::map<COutPoint, PreselectedInput>::value_type& pair) { + return pair.first; + }); + return outpoints; } void CCoinControl::SetInputWeight(const COutPoint& outpoint, int64_t weight) { - m_input_weights[outpoint] = weight; + m_selected[outpoint].SetInputWeight(weight); } bool CCoinControl::HasInputWeight(const COutPoint& outpoint) const { - return m_input_weights.count(outpoint) > 0; + const auto it = m_selected.find(outpoint); + return it != m_selected.end() && it->second.HasInputWeight(); } int64_t CCoinControl::GetInputWeight(const COutPoint& outpoint) const { - auto it = m_input_weights.find(outpoint); - assert(it != m_input_weights.end()); - return it->second; + return m_selected.at(outpoint).GetInputWeight(); +} + +void PreselectedInput::SetTxOut(const CTxOut& txout) +{ + m_txout = txout; +} + +CTxOut PreselectedInput::GetTxOut() const +{ + assert(m_txout.has_value()); + return m_txout.value(); +} + +bool PreselectedInput::HasTxOut() const +{ + return m_txout.has_value(); +} + +void PreselectedInput::SetInputWeight(int64_t weight) +{ + m_weight = weight; +} + +int64_t PreselectedInput::GetInputWeight() const +{ + assert(m_weight.has_value()); + return m_weight.value(); +} + +bool PreselectedInput::HasInputWeight() const +{ + return m_weight.has_value(); } } // namespace wallet |