Skip to content

Commit b3b5721

Browse files
committed
Generalize distributor_rpc for any set of methods.
1 parent d3c78ad commit b3b5721

File tree

13 files changed

+991
-667
lines changed

13 files changed

+991
-667
lines changed

Makefile.am

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,9 +321,12 @@ include_bitcoin_network_config_HEADERS = \
321321
include_bitcoin_network_distributorsdir = ${includedir}/bitcoin/network/distributors
322322
include_bitcoin_network_distributors_HEADERS = \
323323
include/bitcoin/network/distributors/distributor.hpp \
324+
include/bitcoin/network/distributors/distributor_bitcoind.hpp \
325+
include/bitcoin/network/distributors/distributor_electrum.hpp \
324326
include/bitcoin/network/distributors/distributor_http.hpp \
325327
include/bitcoin/network/distributors/distributor_peer.hpp \
326328
include/bitcoin/network/distributors/distributor_rpc.hpp \
329+
include/bitcoin/network/distributors/distributor_stratum_v1.hpp \
327330
include/bitcoin/network/distributors/distributors.hpp
328331

329332
include_bitcoin_network_impl_asyncdir = ${includedir}/bitcoin/network/impl/async
@@ -341,6 +344,10 @@ include_bitcoin_network_impl_async_races_HEADERS = \
341344
include/bitcoin/network/impl/async/races/race_unity.ipp \
342345
include/bitcoin/network/impl/async/races/race_volume.ipp
343346

347+
include_bitcoin_network_impl_distributorsdir = ${includedir}/bitcoin/network/impl/distributors
348+
include_bitcoin_network_impl_distributors_HEADERS = \
349+
include/bitcoin/network/impl/distributors/distributor_rpc.ipp
350+
344351
include_bitcoin_network_logdir = ${includedir}/bitcoin/network/log
345352
include_bitcoin_network_log_HEADERS = \
346353
include/bitcoin/network/log/capture.hpp \

builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,12 @@
260260
<ClInclude Include="..\..\..\..\include\bitcoin\network\config\utilities.hpp" />
261261
<ClInclude Include="..\..\..\..\include\bitcoin\network\define.hpp" />
262262
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor.hpp" />
263+
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_bitcoind.hpp" />
264+
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_electrum.hpp" />
263265
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_http.hpp" />
264266
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_peer.hpp" />
265267
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_rpc.hpp" />
268+
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_stratum_v1.hpp" />
266269
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributors.hpp" />
267270
<ClInclude Include="..\..\..\..\include\bitcoin\network\error.hpp" />
268271
<ClInclude Include="..\..\..\..\include\bitcoin\network\log\capture.hpp" />
@@ -380,6 +383,7 @@
380383
<None Include="..\..\..\..\include\bitcoin\network\impl\async\races\race_volume.ipp" />
381384
<None Include="..\..\..\..\include\bitcoin\network\impl\async\subscriber.ipp" />
382385
<None Include="..\..\..\..\include\bitcoin\network\impl\async\unsubscriber.ipp" />
386+
<None Include="..\..\..\..\include\bitcoin\network\impl\distributors\distributor_rpc.ipp" />
383387
<None Include="packages.config" />
384388
</ItemGroup>
385389
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

builds/msvc/vs2022/libbitcoin-network/libbitcoin-network.vcxproj.filters

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
<UniqueIdentifier>{564EB540-D6B6-425C-0000-0000000000C1}</UniqueIdentifier>
3939
</Filter>
4040
<Filter Include="include\bitcoin\network\impl\async\races">
41+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-0000000000E1}</UniqueIdentifier>
42+
</Filter>
43+
<Filter Include="include\bitcoin\network\impl\distributors">
4144
<UniqueIdentifier>{564EB540-D6B6-425C-0000-0000000000D1}</UniqueIdentifier>
4245
</Filter>
4346
<Filter Include="include\bitcoin\network\log">
@@ -47,22 +50,22 @@
4750
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000008}</UniqueIdentifier>
4851
</Filter>
4952
<Filter Include="include\bitcoin\network\messages\http">
50-
<UniqueIdentifier>{564EB540-D6B6-425C-0000-0000000000E1}</UniqueIdentifier>
53+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-0000000000F1}</UniqueIdentifier>
5154
</Filter>
5255
<Filter Include="include\bitcoin\network\messages\http\enums">
53-
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000003}</UniqueIdentifier>
56+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000004}</UniqueIdentifier>
5457
</Filter>
5558
<Filter Include="include\bitcoin\network\messages\json">
56-
<UniqueIdentifier>{564EB540-D6B6-425C-0000-0000000000F1}</UniqueIdentifier>
59+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000002}</UniqueIdentifier>
5760
</Filter>
5861
<Filter Include="include\bitcoin\network\messages\json\enums">
59-
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000004}</UniqueIdentifier>
62+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000005}</UniqueIdentifier>
6063
</Filter>
6164
<Filter Include="include\bitcoin\network\messages\peer">
62-
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000002}</UniqueIdentifier>
65+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000003}</UniqueIdentifier>
6366
</Filter>
6467
<Filter Include="include\bitcoin\network\messages\peer\enums">
65-
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000005}</UniqueIdentifier>
68+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000006}</UniqueIdentifier>
6669
</Filter>
6770
<Filter Include="include\bitcoin\network\net">
6871
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000009}</UniqueIdentifier>
@@ -74,7 +77,7 @@
7477
<UniqueIdentifier>{564EB540-D6B6-425C-0000-0000000000A1}</UniqueIdentifier>
7578
</Filter>
7679
<Filter Include="resource">
77-
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000006}</UniqueIdentifier>
80+
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000007}</UniqueIdentifier>
7881
</Filter>
7982
<Filter Include="src">
8083
<UniqueIdentifier>{564EB540-D6B6-425C-0000-000000000000}</UniqueIdentifier>
@@ -509,6 +512,12 @@
509512
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor.hpp">
510513
<Filter>include\bitcoin\network\distributors</Filter>
511514
</ClInclude>
515+
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_bitcoind.hpp">
516+
<Filter>include\bitcoin\network\distributors</Filter>
517+
</ClInclude>
518+
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_electrum.hpp">
519+
<Filter>include\bitcoin\network\distributors</Filter>
520+
</ClInclude>
512521
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_http.hpp">
513522
<Filter>include\bitcoin\network\distributors</Filter>
514523
</ClInclude>
@@ -518,6 +527,9 @@
518527
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_rpc.hpp">
519528
<Filter>include\bitcoin\network\distributors</Filter>
520529
</ClInclude>
530+
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributor_stratum_v1.hpp">
531+
<Filter>include\bitcoin\network\distributors</Filter>
532+
</ClInclude>
521533
<ClInclude Include="..\..\..\..\include\bitcoin\network\distributors\distributors.hpp">
522534
<Filter>include\bitcoin\network\distributors</Filter>
523535
</ClInclude>
@@ -865,6 +877,9 @@
865877
<None Include="..\..\..\..\include\bitcoin\network\impl\async\unsubscriber.ipp">
866878
<Filter>include\bitcoin\network\impl\async</Filter>
867879
</None>
880+
<None Include="..\..\..\..\include\bitcoin\network\impl\distributors\distributor_rpc.ipp">
881+
<Filter>include\bitcoin\network\impl\distributors</Filter>
882+
</None>
868883
<None Include="packages.config" />
869884
</ItemGroup>
870885
<ItemGroup>

include/bitcoin/network.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,12 @@
5151
#include <bitcoin/network/config/endpoint.hpp>
5252
#include <bitcoin/network/config/utilities.hpp>
5353
#include <bitcoin/network/distributors/distributor.hpp>
54+
#include <bitcoin/network/distributors/distributor_bitcoind.hpp>
55+
#include <bitcoin/network/distributors/distributor_electrum.hpp>
5456
#include <bitcoin/network/distributors/distributor_http.hpp>
5557
#include <bitcoin/network/distributors/distributor_peer.hpp>
5658
#include <bitcoin/network/distributors/distributor_rpc.hpp>
59+
#include <bitcoin/network/distributors/distributor_stratum_v1.hpp>
5760
#include <bitcoin/network/distributors/distributors.hpp>
5861
#include <bitcoin/network/log/capture.hpp>
5962
#include <bitcoin/network/log/levels.hpp>

include/bitcoin/network/distributors/distributor.hpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,66 @@
1919
#ifndef LIBBITCOIN_NETWORK_DISTRIBUTORS_DISTRIBUTOR_HPP
2020
#define LIBBITCOIN_NETWORK_DISTRIBUTORS_DISTRIBUTOR_HPP
2121

22+
#include <algorithm>
23+
#include <tuple>
2224
#include <bitcoin/network/define.hpp>
2325

26+
// TODO: move this.
27+
2428
namespace libbitcoin {
2529
namespace network {
30+
namespace rpc {
31+
32+
BC_PUSH_WARNING(NO_UNSAFE_COPY_N)
33+
BC_PUSH_WARNING(NO_ARRAY_TO_POINTER_DECAY)
34+
35+
enum class group { positional, named, either };
36+
37+
/// Non-type template parameter (NTTP) dynamically defines a name for type.
38+
template <size_t Length>
39+
struct method_name
40+
{
41+
constexpr method_name(const char (&text)[Length])
42+
{
43+
std::copy_n(text, Length, name);
44+
}
45+
46+
char name[Length]{};
47+
static constexpr auto length = sub1(Length);
48+
};
49+
50+
template <method_name Unique, typename... Args>
51+
struct method
52+
{
53+
static constexpr std::string_view name{ Unique.name, Unique.length };
54+
55+
using tag = method;
56+
using args = std::tuple<Args...>;
57+
using names_t = std::array<std::string_view, sizeof...(Args)>;
58+
59+
/// Required for construction of tag{}.
60+
constexpr method() NOEXCEPT {}
61+
62+
template <typename ...ParameterNames,
63+
if_equal<sizeof...(ParameterNames), sizeof...(Args)> = true>
64+
constexpr method(ParameterNames&&... names) NOEXCEPT
65+
: names_{ std::forward<ParameterNames>(names)... }
66+
{
67+
}
68+
69+
constexpr const names_t& names() const NOEXCEPT
70+
{
71+
return names_;
72+
}
73+
74+
private:
75+
const names_t names_;
76+
};
77+
78+
BC_POP_WARNING()
79+
BC_POP_WARNING()
2680

81+
} // namespace rpc
2782
} // namespace network
2883
} // namespace libbitcoin
2984

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* Copyright (c) 2011-2025 libbitcoin developers (see AUTHORS)
3+
*
4+
* This file is part of libbitcoin.
5+
*
6+
* This program is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Affero General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Affero General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Affero General Public License
17+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
#ifndef LIBBITCOIN_NETWORK_DISTRIBUTORS_DISTRIBUTOR_BITCOIND_HPP
20+
#define LIBBITCOIN_NETWORK_DISTRIBUTORS_DISTRIBUTOR_BITCOIND_HPP
21+
22+
#include <bitcoin/network/define.hpp>
23+
#include <bitcoin/network/distributors/distributor.hpp>
24+
25+
namespace libbitcoin {
26+
namespace network {
27+
28+
struct bitcoind
29+
{
30+
static constexpr std::tuple methods
31+
{
32+
rpc::method<"get_version">{},
33+
rpc::method<"add_element", int, int>{ "a", "b" },
34+
};
35+
36+
using type = decltype(methods);
37+
static constexpr auto size = std::tuple_size_v<type>;
38+
static constexpr rpc::group mode = rpc::group::either;
39+
};
40+
41+
} // namespace network
42+
} // namespace libbitcoin
43+
44+
#endif
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* Copyright (c) 2011-2025 libbitcoin developers (see AUTHORS)
3+
*
4+
* This file is part of libbitcoin.
5+
*
6+
* This program is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU Affero General Public License as published by
8+
* the Free Software Foundation, either version 3 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU Affero General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Affero General Public License
17+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
#ifndef LIBBITCOIN_NETWORK_DISTRIBUTORS_DISTRIBUTOR_ELECTRUM_HPP
20+
#define LIBBITCOIN_NETWORK_DISTRIBUTORS_DISTRIBUTOR_ELECTRUM_HPP
21+
22+
#include <bitcoin/network/define.hpp>
23+
24+
namespace libbitcoin {
25+
namespace network {
26+
27+
} // namespace network
28+
} // namespace libbitcoin
29+
30+
#endif

0 commit comments

Comments
 (0)