Skip to content

Commit 9cc8e87

Browse files
theStackmartinusMarcoFalke
committed
refactor: introduce single-separator split helper SplitString
This helper uses spanparsing::Split internally and enables to replace all calls to boost::split where only a single separator is passed. Co-authored-by: Martin Ankerl <[email protected]> Co-authored-by: MarcoFalke <[email protected]>
1 parent 2b5a741 commit 9cc8e87

File tree

12 files changed

+47
-71
lines changed

12 files changed

+47
-71
lines changed

src/bitcoin-tx.cpp

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
#include <memory>
3232
#include <stdio.h>
3333

34-
#include <boost/algorithm/string.hpp>
35-
3634
static bool fCreateBlank;
3735
static std::map<std::string,UniValue> registers;
3836
static const int CONTINUE_EXECUTION=-1;
@@ -251,8 +249,7 @@ static T TrimAndParse(const std::string& int_str, const std::string& err)
251249

252250
static void MutateTxAddInput(CMutableTransaction& tx, const std::string& strInput)
253251
{
254-
std::vector<std::string> vStrInputParts;
255-
boost::split(vStrInputParts, strInput, boost::is_any_of(":"));
252+
std::vector<std::string> vStrInputParts = SplitString(strInput, ':');
256253

257254
// separate TXID:VOUT in string
258255
if (vStrInputParts.size()<2)
@@ -287,8 +284,7 @@ static void MutateTxAddInput(CMutableTransaction& tx, const std::string& strInpu
287284
static void MutateTxAddOutAddr(CMutableTransaction& tx, const std::string& strInput)
288285
{
289286
// Separate into VALUE:ADDRESS
290-
std::vector<std::string> vStrInputParts;
291-
boost::split(vStrInputParts, strInput, boost::is_any_of(":"));
287+
std::vector<std::string> vStrInputParts = SplitString(strInput, ':');
292288

293289
if (vStrInputParts.size() != 2)
294290
throw std::runtime_error("TX output missing or too many separators");
@@ -312,8 +308,7 @@ static void MutateTxAddOutAddr(CMutableTransaction& tx, const std::string& strIn
312308
static void MutateTxAddOutPubKey(CMutableTransaction& tx, const std::string& strInput)
313309
{
314310
// Separate into VALUE:PUBKEY[:FLAGS]
315-
std::vector<std::string> vStrInputParts;
316-
boost::split(vStrInputParts, strInput, boost::is_any_of(":"));
311+
std::vector<std::string> vStrInputParts = SplitString(strInput, ':');
317312

318313
if (vStrInputParts.size() < 2 || vStrInputParts.size() > 3)
319314
throw std::runtime_error("TX output missing or too many separators");
@@ -356,8 +351,7 @@ static void MutateTxAddOutPubKey(CMutableTransaction& tx, const std::string& str
356351
static void MutateTxAddOutMultiSig(CMutableTransaction& tx, const std::string& strInput)
357352
{
358353
// Separate into VALUE:REQUIRED:NUMKEYS:PUBKEY1:PUBKEY2:....[:FLAGS]
359-
std::vector<std::string> vStrInputParts;
360-
boost::split(vStrInputParts, strInput, boost::is_any_of(":"));
354+
std::vector<std::string> vStrInputParts = SplitString(strInput, ':');
361355

362356
// Check that there are enough parameters
363357
if (vStrInputParts.size()<3)
@@ -460,8 +454,7 @@ static void MutateTxAddOutData(CMutableTransaction& tx, const std::string& strIn
460454
static void MutateTxAddOutScript(CMutableTransaction& tx, const std::string& strInput)
461455
{
462456
// separate VALUE:SCRIPT[:FLAGS]
463-
std::vector<std::string> vStrInputParts;
464-
boost::split(vStrInputParts, strInput, boost::is_any_of(":"));
457+
std::vector<std::string> vStrInputParts = SplitString(strInput, ':');
465458
if (vStrInputParts.size() < 2)
466459
throw std::runtime_error("TX output missing separator");
467460

src/chainparams.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@
1010
#include <deploymentinfo.h>
1111
#include <hash.h> // for signet block challenge hash
1212
#include <script/interpreter.h>
13+
#include <util/string.h>
1314
#include <util/system.h>
1415

1516
#include <assert.h>
1617

17-
#include <boost/algorithm/string/classification.hpp>
18-
#include <boost/algorithm/string/split.hpp>
19-
2018
static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward)
2119
{
2220
CMutableTransaction txNew;
@@ -528,8 +526,7 @@ void CRegTestParams::UpdateActivationParametersFromArgs(const ArgsManager& args)
528526
if (!args.IsArgSet("-vbparams")) return;
529527

530528
for (const std::string& strDeployment : args.GetArgs("-vbparams")) {
531-
std::vector<std::string> vDeploymentParams;
532-
boost::split(vDeploymentParams, strDeployment, boost::is_any_of(":"));
529+
std::vector<std::string> vDeploymentParams = SplitString(strDeployment, ':');
533530
if (vDeploymentParams.size() < 3 || 4 < vDeploymentParams.size()) {
534531
throw std::runtime_error("Version bits parameters malformed, expecting deployment:start:end[:min_activation_height]");
535532
}

src/rest.cpp

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
#include <any>
3333
#include <string>
3434

35-
#include <boost/algorithm/string.hpp>
36-
3735
#include <univalue.h>
3836

3937
using node::GetTransaction;
@@ -192,8 +190,7 @@ static bool rest_headers(const std::any& context,
192190
return false;
193191
std::string param;
194192
const RESTResponseFormat rf = ParseDataFormat(param, strURIPart);
195-
std::vector<std::string> path;
196-
boost::split(path, param, boost::is_any_of("/"));
193+
std::vector<std::string> path = SplitString(param, '/');
197194

198195
std::string raw_count;
199196
std::string hashStr;
@@ -363,8 +360,7 @@ static bool rest_filter_header(const std::any& context, HTTPRequest* req, const
363360
std::string param;
364361
const RESTResponseFormat rf = ParseDataFormat(param, strURIPart);
365362

366-
std::vector<std::string> uri_parts;
367-
boost::split(uri_parts, param, boost::is_any_of("/"));
363+
std::vector<std::string> uri_parts = SplitString(param, '/');
368364
std::string raw_count;
369365
std::string raw_blockhash;
370366
if (uri_parts.size() == 3) {
@@ -484,8 +480,7 @@ static bool rest_block_filter(const std::any& context, HTTPRequest* req, const s
484480
const RESTResponseFormat rf = ParseDataFormat(param, strURIPart);
485481

486482
// request is sent over URI scheme /rest/blockfilter/filtertype/blockhash
487-
std::vector<std::string> uri_parts;
488-
boost::split(uri_parts, param, boost::is_any_of("/"));
483+
std::vector<std::string> uri_parts = SplitString(param, '/');
489484
if (uri_parts.size() != 2) {
490485
return RESTERR(req, HTTP_BAD_REQUEST, "Invalid URI format. Expected /rest/blockfilter/<filtertype>/<blockhash>");
491486
}
@@ -713,7 +708,7 @@ static bool rest_getutxos(const std::any& context, HTTPRequest* req, const std::
713708
if (param.length() > 1)
714709
{
715710
std::string strUriParams = param.substr(1);
716-
boost::split(uriParts, strUriParams, boost::is_any_of("/"));
711+
uriParts = SplitString(strUriParams, '/');
717712
}
718713

719714
// throw exception in case of an empty request

src/rpc/server.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@
99
#include <shutdown.h>
1010
#include <sync.h>
1111
#include <util/strencodings.h>
12+
#include <util/string.h>
1213
#include <util/system.h>
1314

14-
#include <boost/algorithm/string/classification.hpp>
15-
#include <boost/algorithm/string/split.hpp>
1615
#include <boost/signals2/signal.hpp>
1716

1817
#include <cassert>
@@ -407,8 +406,7 @@ static inline JSONRPCRequest transformNamedArguments(const JSONRPCRequest& in, c
407406
// Process expected parameters.
408407
int hole = 0;
409408
for (const std::string &argNamePattern: argNames) {
410-
std::vector<std::string> vargNames;
411-
boost::algorithm::split(vargNames, argNamePattern, boost::algorithm::is_any_of("|"));
409+
std::vector<std::string> vargNames = SplitString(argNamePattern, '|');
412410
auto fr = argsIn.end();
413411
for (const std::string & argName : vargNames) {
414412
fr = argsIn.find(argName);

src/rpc/util.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515

1616
#include <tuple>
1717

18-
#include <boost/algorithm/string/classification.hpp>
19-
#include <boost/algorithm/string/split.hpp>
20-
2118
const std::string UNIX_EPOCH_TIME = "UNIX epoch time";
2219
const std::string EXAMPLE_ADDRESS[2] = {"bc1q09vm5lfy0j5reeulh4x5752q25uqqvz34hufdl", "bc1q02ad21edsxd23d32dfgqqsz4vv4nmtfzuklhy3"};
2320

@@ -513,8 +510,7 @@ RPCHelpMan::RPCHelpMan(std::string name, std::string description, std::vector<RP
513510
{
514511
std::set<std::string> named_args;
515512
for (const auto& arg : m_args) {
516-
std::vector<std::string> names;
517-
boost::split(names, arg.m_names, boost::is_any_of("|"));
513+
std::vector<std::string> names = SplitString(arg.m_names, '|');
518514
// Should have unique named arguments
519515
for (const std::string& name : names) {
520516
CHECK_NONFATAL(named_args.insert(name).second);
@@ -665,8 +661,7 @@ UniValue RPCHelpMan::GetArgMap() const
665661
UniValue arr{UniValue::VARR};
666662
for (int i{0}; i < int(m_args.size()); ++i) {
667663
const auto& arg = m_args.at(i);
668-
std::vector<std::string> arg_names;
669-
boost::split(arg_names, arg.m_names, boost::is_any_of("|"));
664+
std::vector<std::string> arg_names = SplitString(arg.m_names, '|');
670665
for (const auto& arg_name : arg_names) {
671666
UniValue map{UniValue::VARR};
672667
map.push_back(m_name);

src/test/fuzz/script_assets_test_minimizer.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#include <streams.h>
1212
#include <univalue.h>
1313
#include <util/strencodings.h>
14+
#include <util/string.h>
1415

15-
#include <boost/algorithm/string.hpp>
1616
#include <cstdint>
1717
#include <string>
1818
#include <vector>
@@ -130,8 +130,7 @@ unsigned int ParseScriptFlags(const std::string& str)
130130
if (str.empty()) return 0;
131131

132132
unsigned int flags = 0;
133-
std::vector<std::string> words;
134-
boost::algorithm::split(words, str, boost::algorithm::is_any_of(","));
133+
std::vector<std::string> words = SplitString(str, ',');
135134

136135
for (const std::string& word : words) {
137136
auto it = FLAG_NAMES.find(word);

src/test/transaction_tests.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
#include <map>
3232
#include <string>
3333

34-
#include <boost/algorithm/string/classification.hpp>
35-
#include <boost/algorithm/string/split.hpp>
3634
#include <boost/test/unit_test.hpp>
3735

3836
#include <univalue.h>
@@ -70,8 +68,7 @@ unsigned int ParseScriptFlags(std::string strFlags)
7068
{
7169
if (strFlags.empty() || strFlags == "NONE") return 0;
7270
unsigned int flags = 0;
73-
std::vector<std::string> words;
74-
boost::algorithm::split(words, strFlags, boost::algorithm::is_any_of(","));
71+
std::vector<std::string> words = SplitString(strFlags, ',');
7572

7673
for (const std::string& word : words)
7774
{

src/torcontrol.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@
2424
#include <set>
2525
#include <vector>
2626

27-
#include <boost/algorithm/string/classification.hpp>
2827
#include <boost/algorithm/string/replace.hpp>
29-
#include <boost/algorithm/string/split.hpp>
3028

3129
#include <event2/buffer.h>
3230
#include <event2/bufferevent.h>
@@ -347,8 +345,8 @@ void TorController::get_socks_cb(TorControlConnection& _conn, const TorControlRe
347345
for (const auto& line : reply.lines) {
348346
if (0 == line.compare(0, 20, "net/listeners/socks=")) {
349347
const std::string port_list_str = line.substr(20);
350-
std::vector<std::string> port_list;
351-
boost::split(port_list, port_list_str, boost::is_any_of(" "));
348+
std::vector<std::string> port_list = SplitString(port_list_str, ' ');
349+
352350
for (auto& portstr : port_list) {
353351
if (portstr.empty()) continue;
354352
if ((portstr[0] == '"' || portstr[0] == '\'') && portstr.size() >= 2 && (*portstr.rbegin() == portstr[0])) {
@@ -542,8 +540,10 @@ void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorContro
542540
if (l.first == "AUTH") {
543541
std::map<std::string,std::string> m = ParseTorReplyMapping(l.second);
544542
std::map<std::string,std::string>::iterator i;
545-
if ((i = m.find("METHODS")) != m.end())
546-
boost::split(methods, i->second, boost::is_any_of(","));
543+
if ((i = m.find("METHODS")) != m.end()) {
544+
std::vector<std::string> m_vec = SplitString(i->second, ',');
545+
methods = std::set<std::string>(m_vec.begin(), m_vec.end());
546+
}
547547
if ((i = m.find("COOKIEFILE")) != m.end())
548548
cookiefile = i->second;
549549
} else if (l.first == "VERSION") {

src/util/spanparsing.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,4 @@ Span<const char> Expr(Span<const char>& sp)
4848
return ret;
4949
}
5050

51-
std::vector<Span<const char>> Split(const Span<const char>& sp, char sep)
52-
{
53-
std::vector<Span<const char>> ret;
54-
auto it = sp.begin();
55-
auto start = it;
56-
while (it != sp.end()) {
57-
if (*it == sep) {
58-
ret.emplace_back(start, it);
59-
start = it + 1;
60-
}
61-
++it;
62-
}
63-
ret.emplace_back(start, it);
64-
return ret;
65-
}
66-
6751
} // namespace spanparsing

src/util/spanparsing.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,22 @@ Span<const char> Expr(Span<const char>& sp);
4343
* Note that this function does not care about braces, so splitting
4444
* "foo(bar(1),2),3) on ',' will return {"foo(bar(1)", "2)", "3)"}.
4545
*/
46-
std::vector<Span<const char>> Split(const Span<const char>& sp, char sep);
46+
template <typename T = Span<const char>>
47+
std::vector<T> Split(const Span<const char>& sp, char sep)
48+
{
49+
std::vector<T> ret;
50+
auto it = sp.begin();
51+
auto start = it;
52+
while (it != sp.end()) {
53+
if (*it == sep) {
54+
ret.emplace_back(start, it);
55+
start = it + 1;
56+
}
57+
++it;
58+
}
59+
ret.emplace_back(start, it);
60+
return ret;
61+
}
4762

4863
} // namespace spanparsing
4964

0 commit comments

Comments
 (0)