@@ -34,31 +34,100 @@ namespace database {
3434
3535// ununsed
3636TEMPLATE
37- code CLASS::get_unconfirmed_unspent (const stopper& , unspents& ,
38- const hash_digest& , bool ) const NOEXCEPT
37+ code CLASS::get_unconfirmed_unspent (const stopper& cancel , unspents& out ,
38+ const hash_digest& key , bool turbo ) const NOEXCEPT
3939{
40- return {};
40+ output_links outs{};
41+ if (const auto ec = to_address_outputs (cancel, outs, key))
42+ return ec;
43+
44+ out.clear ();
45+ out.resize (outs.size ());
46+ return parallel_unspent_transform (cancel, turbo, out, outs,
47+ [this ](const auto & , auto & cancel, auto & fail) NOEXCEPT -> unspent
48+ {
49+ if (cancel || fail)
50+ return {};
51+
52+ // TODO: return unconfirmed unspent outputs for address key.
53+ return {};
54+ });
4155}
4256
4357// ununsed
4458TEMPLATE
45- code CLASS::get_confirmed_unspent (const stopper& , unspents& ,
46- const hash_digest& , bool ) const NOEXCEPT
59+ code CLASS::get_confirmed_unspent (const stopper& cancel , unspents& out ,
60+ const hash_digest& key , bool turbo ) const NOEXCEPT
4761{
48- return {};
62+ output_links outs{};
63+ if (const auto ec = to_address_outputs (cancel, outs, key))
64+ return ec;
65+
66+ out.clear ();
67+ out.resize (outs.size ());
68+ return parallel_unspent_transform (cancel, turbo, out, outs,
69+ [this ](const auto & , auto & cancel, auto & fail) NOEXCEPT -> unspent
70+ {
71+ if (cancel || fail)
72+ return {};
73+
74+ // TODO: return confirmed unspent outputs for address key.
75+ return {};
76+ });
4977}
5078
5179// server/electrum
5280TEMPLATE
53- code CLASS::get_unspent (const stopper& , unspents& ,
54- const hash_digest& , bool ) const NOEXCEPT
81+ code CLASS::get_unspent (const stopper& cancel , unspents& out ,
82+ const hash_digest& key , bool turbo ) const NOEXCEPT
5583{
56- return {};
84+ output_links outs{};
85+ if (const auto ec = to_address_outputs (cancel, outs, key))
86+ return ec;
87+
88+ out.clear ();
89+ out.resize (outs.size ());
90+ return parallel_unspent_transform (cancel, turbo, out, outs,
91+ [this ](const auto & , auto & cancel, auto & fail) NOEXCEPT -> unspent
92+ {
93+ if (cancel || fail)
94+ return {};
95+
96+ // TODO: return unspent outputs for address key.
97+ return {};
98+ });
5799}
58100
59- // turbos
101+ // utilities
60102// ----------------------------------------------------------------------------
61- // protected
103+ // private/static
104+
105+ TEMPLATE
106+ template <typename Functor>
107+ code CLASS::parallel_unspent_transform (const stopper& cancel, bool turbo,
108+ unspents& out, const output_links& outs, Functor&& functor) NOEXCEPT
109+ {
110+ const auto policy = poolstl::execution::par_if (turbo);
111+ stopper fail{};
112+
113+ out.clear ();
114+ out.resize (outs.size ());
115+ std::transform (policy, outs.cbegin (), outs.cend (), out.begin (),
116+ [&functor, &cancel, &fail](const auto & output) NOEXCEPT
117+ {
118+ return functor (output, cancel, fail);
119+ });
120+
121+ if (fail)
122+ return error::integrity;
123+
124+ if (cancel)
125+ return error::canceled;
126+
127+ unspent::sort_and_dedup (out);
128+ return error::success;
129+ }
130+
62131
63132} // namespace database
64133} // namespace libbitcoin
0 commit comments