2121
2222#include < algorithm>
2323#include < iterator>
24+ #include < numeric>
2425#include < unordered_map>
2526#include < utility>
2627#include < bitcoin/system.hpp>
@@ -517,15 +518,13 @@ spend_set CLASS::to_spend_set(const tx_link& link) const NOEXCEPT
517518 return set;
518519}
519520
520- // block to puts (forward navigation)
521+ // txs to puts (forward navigation)
521522// ----------------------------------------------------------------------------
522523
523524TEMPLATE
524- spend_links CLASS::to_block_spends (const header_link& link ) const NOEXCEPT
525+ spend_links CLASS::to_spends (const tx_links& txs ) const NOEXCEPT
525526{
526527 spend_links spends{};
527- const auto txs = to_spending_transactions (link);
528-
529528 for (const auto & tx: txs)
530529 {
531530 const auto tx_spends = to_spends (tx);
@@ -536,11 +535,9 @@ spend_links CLASS::to_block_spends(const header_link& link) const NOEXCEPT
536535}
537536
538537TEMPLATE
539- output_links CLASS::to_block_outputs (const header_link& link ) const NOEXCEPT
538+ output_links CLASS::to_outputs (const tx_links& txs ) const NOEXCEPT
540539{
541540 output_links outputs{};
542- const auto txs = to_transactions (link);
543-
544541 for (const auto & tx: txs)
545542 {
546543 const auto tx_outputs = to_outputs (tx);
@@ -551,18 +548,36 @@ output_links CLASS::to_block_outputs(const header_link& link) const NOEXCEPT
551548}
552549
553550TEMPLATE
554- output_links CLASS::to_block_prevouts (const header_link& link ) const NOEXCEPT
551+ output_links CLASS::to_prevouts (const tx_links& txs ) const NOEXCEPT
555552{
556- output_links prevouts{};
557- const auto txs = to_spending_transactions (link);
553+ const auto ins = to_spends (txs);
554+ output_links outs (ins.size ());
555+ const auto fn = [this ](auto spend) NOEXCEPT{ return to_prevout (spend); };
558556
559- for (const auto & tx: txs)
560- {
561- const auto tx_prevouts = to_prevouts (tx);
562- prevouts.insert (prevouts.end (), tx_prevouts.begin (), tx_prevouts.end ());
563- }
557+ // C++17 incomplete on GCC/CLang, so presently parallel only on MSVC++.
558+ std_transform (bc::par_unseq, ins.begin (), ins.end (), outs.begin (), fn);
559+ return outs;
560+ }
564561
565- return prevouts;
562+ // block to puts (forward navigation)
563+ // ----------------------------------------------------------------------------
564+
565+ TEMPLATE
566+ spend_links CLASS::to_block_spends (const header_link& link) const NOEXCEPT
567+ {
568+ return to_spends (to_spending_transactions (link));
569+ }
570+
571+ TEMPLATE
572+ output_links CLASS::to_block_outputs (const header_link& link) const NOEXCEPT
573+ {
574+ return to_outputs (to_transactions (link));
575+ }
576+
577+ TEMPLATE
578+ output_links CLASS::to_block_prevouts (const header_link& link) const NOEXCEPT
579+ {
580+ return to_prevouts (to_spending_transactions (link));
566581}
567582
568583// block to txs (forward navigation)
0 commit comments