22
22
#include < ripple/rpc/impl/Handler.h>
23
23
#include < ripple/rpc/impl/RPCHelpers.h>
24
24
25
+ #include < boost/container/flat_map.hpp>
26
+
25
27
namespace ripple {
26
28
namespace RPC {
27
29
namespace {
@@ -57,6 +59,19 @@ handle(JsonContext& context, Object& object)
57
59
return status;
58
60
};
59
61
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
+
60
75
Handler const handlerArray[]{
61
76
// Some handlers not specified here are added to the table via addHandler()
62
77
// Request-response methods
@@ -174,7 +189,8 @@ Handler const handlerArray[]{
174
189
class HandlerTable
175
190
{
176
191
private:
177
- using handler_table_t = std::multimap<std::string, Handler>;
192
+ using handler_table_t =
193
+ boost::container::flat_multimap<std::string, Handler>;
178
194
179
195
// Use with equal_range to enforce that API range of a newly added handler
180
196
// does not overlap with API range of an existing handler with same name
@@ -244,15 +260,15 @@ class HandlerTable
244
260
std::vector<char const *>
245
261
getHandlerNames () const
246
262
{
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;
252
264
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
+ }
254
270
255
- return std::vector< char const *>{names. begin (), names. end ()} ;
271
+ return ret ;
256
272
}
257
273
258
274
private:
@@ -270,15 +286,7 @@ class HandlerTable
270
286
HandlerImpl::minApiVer,
271
287
HandlerImpl::maxApiVer));
272
288
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>()});
282
290
}
283
291
};
284
292
0 commit comments