Skip to content

Commit 0124517

Browse files
committed
Switch to flat_multimap, minor improvements
1 parent 2f8c9c7 commit 0124517

File tree

2 files changed

+26
-18
lines changed

2 files changed

+26
-18
lines changed

src/ripple/rpc/impl/Handler.cpp

+25-17
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <ripple/rpc/impl/Handler.h>
2323
#include <ripple/rpc/impl/RPCHelpers.h>
2424

25+
#include <boost/container/flat_map.hpp>
26+
2527
namespace ripple {
2628
namespace RPC {
2729
namespace {
@@ -57,6 +59,19 @@ handle(JsonContext& context, Object& object)
5759
return status;
5860
};
5961

62+
template <typename HandlerImpl>
63+
Handler
64+
handlerFrom()
65+
{
66+
return {
67+
HandlerImpl::name,
68+
&handle<Json::Value, HandlerImpl>,
69+
HandlerImpl::role,
70+
HandlerImpl::condition,
71+
HandlerImpl::minApiVer,
72+
HandlerImpl::maxApiVer};
73+
}
74+
6075
Handler const handlerArray[]{
6176
// Some handlers not specified here are added to the table via addHandler()
6277
// Request-response methods
@@ -174,7 +189,8 @@ Handler const handlerArray[]{
174189
class HandlerTable
175190
{
176191
private:
177-
using handler_table_t = std::multimap<std::string, Handler>;
192+
using handler_table_t =
193+
boost::container::flat_multimap<std::string, Handler>;
178194

179195
// Use with equal_range to enforce that API range of a newly added handler
180196
// does not overlap with API range of an existing handler with same name
@@ -244,15 +260,15 @@ class HandlerTable
244260
std::vector<char const*>
245261
getHandlerNames() const
246262
{
247-
static constexpr auto less = [](const char* const lh,
248-
const char* const rh) -> bool {
249-
return std::strcmp(lh, rh);
250-
};
251-
std::set<const char* const, decltype(less)> names;
263+
std::vector<char const*> ret;
252264
for (auto const& i : table_)
253-
names.insert(i.second.name_);
265+
{
266+
// Note, table_ is always ordered, allowing such a simple check
267+
if (ret.empty() || std::strcmp(ret.back(), i.second.name_) != 0)
268+
ret.push_back(i.second.name_);
269+
}
254270

255-
return std::vector<char const*>{names.begin(), names.end()};
271+
return ret;
256272
}
257273

258274
private:
@@ -270,15 +286,7 @@ class HandlerTable
270286
HandlerImpl::minApiVer,
271287
HandlerImpl::maxApiVer));
272288

273-
Handler h;
274-
h.name_ = HandlerImpl::name;
275-
h.valueMethod_ = &handle<Json::Value, HandlerImpl>;
276-
h.role_ = HandlerImpl::role;
277-
h.condition_ = HandlerImpl::condition;
278-
h.minApiVer_ = HandlerImpl::minApiVer;
279-
h.maxApiVer_ = HandlerImpl::maxApiVer;
280-
281-
table_.insert({HandlerImpl::name, h});
289+
table_.insert({HandlerImpl::name, handlerFrom<HandlerImpl>()});
282290
}
283291
};
284292

src/ripple/rpc/impl/Handler.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct Handler
5555
RPC::Condition condition_;
5656

5757
unsigned minApiVer_ = 1;
58-
unsigned maxApiVer_ = RPC::apiMaximumValidVersion;
58+
unsigned maxApiVer_ = apiMaximumValidVersion;
5959
};
6060

6161
Handler const*

0 commit comments

Comments
 (0)