utils.cpp
1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "utils.h"
std::list<std::__cxx11::string> split(const std::string &input, const char sep, size_t max, bool keep_empty_parts)
{
std::list<std::string> list;
size_t start = 0;
size_t end;
while (list.size() < max && (end = input.find(sep, start)) != std::string::npos)
{
if (start != end || keep_empty_parts)
list.push_back(input.substr(start, end - start));
start = end + 1; // increase by length of seperator.
}
if (start != input.size() || keep_empty_parts)
list.push_back(input.substr(start, std::string::npos));
return list;
}
bool topicsMatch(const std::string &subscribeTopic, const std::string &publishTopic)
{
if (subscribeTopic.find("+") == std::string::npos && subscribeTopic.find("#") == std::string::npos)
return subscribeTopic == publishTopic;
const std::list<std::string> subscribeParts = split(subscribeTopic, '/');
const std::list<std::string> publishParts = split(publishTopic, '/');
auto subscribe_itr = subscribeParts.begin();
auto publish_itr = publishParts.begin();
bool result = true;
while (subscribe_itr != subscribeParts.end() && publish_itr != publishParts.end())
{
const std::string &subscribe_subtopic = *subscribe_itr++;
const std::string &publish_subtopic = *publish_itr++;
if (subscribe_subtopic == "+")
continue;
if (subscribe_subtopic == "#")
return true;
if (subscribe_subtopic != publish_subtopic)
return false;
}
result = subscribe_itr == subscribeParts.end() && publish_itr == publishParts.end();
return result;
}