1 #ifndef OSMIUM_UTIL_STRING_MATCHER_HPP 2 #define OSMIUM_UTIL_STRING_MATCHER_HPP 49 #if defined(__GLIBCXX__) 50 # if ((__cplusplus >= 201402L) || \ 51 defined(_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT) || \ 52 defined(_GLIBCXX_REGEX_STATE_LIMIT)) 53 # define OSMIUM_WITH_REGEX 55 # pragma message("Disabling regex functionality. See source code for info.") 57 #elif defined(__clang__) 58 # if ((__clang_major__ > 3) || \ 59 (__clang_minor__ == 3 && __clang_minor__ > 5)) 60 # define OSMIUM_WITH_REGEX 62 # pragma message("Disabling regex functionality") 66 #include <boost/variant.hpp> 88 bool match(
const char* )
const noexcept {
92 template <
typename TChar,
typename TTraits>
93 void print(std::basic_ostream<TChar, TTraits>& out)
const {
94 out <<
"always_false";
106 bool match(
const char* )
const noexcept {
110 template <
typename TChar,
typename TTraits>
111 void print(std::basic_ostream<TChar, TTraits>& out)
const {
112 out <<
"always_true";
126 explicit equal(
const std::string& str) :
134 bool match(
const char* test_string)
const noexcept {
135 return !std::strcmp(m_str.c_str(), test_string);
138 template <
typename TChar,
typename TTraits>
139 void print(std::basic_ostream<TChar, TTraits>& out)
const {
140 out <<
"equal[" << m_str <<
']';
154 explicit prefix(
const std::string& str) :
162 bool match(
const char* test_string)
const noexcept {
163 return m_str.compare(0, std::string::npos, test_string, 0, m_str.size()) == 0;
166 template <
typename TChar,
typename TTraits>
167 void print(std::basic_ostream<TChar, TTraits>& out)
const {
168 out <<
"prefix[" << m_str <<
']';
190 bool match(
const char* test_string)
const noexcept {
191 return std::strstr(test_string, m_str.c_str()) !=
nullptr;
194 template <
typename TChar,
typename TTraits>
195 void print(std::basic_ostream<TChar, TTraits>& out)
const {
196 out <<
"substring[" << m_str <<
']';
201 #ifdef OSMIUM_WITH_REGEX 211 explicit regex(
const std::regex& regex) :
215 bool match(
const char* test_string)
const noexcept {
216 return std::regex_search(test_string, m_regex);
219 template <
typename TChar,
typename TTraits>
220 void print(std::basic_ostream<TChar, TTraits>& out)
const {
240 explicit list(
const std::vector<std::string>& strings) :
245 m_strings.push_back(str);
250 m_strings.push_back(str);
254 bool match(
const char* test_string)
const noexcept {
255 for (
const auto& s : m_strings) {
256 if (!std::strcmp(s.c_str(), test_string)) {
264 template <
typename TChar,
typename TTraits>
265 void print(std::basic_ostream<TChar, TTraits>& out)
const {
267 for (
const auto& s : m_strings) {
268 out <<
'[' << s <<
']';
282 #ifdef OSMIUM_WITH_REGEX 299 template <
typename TMatcher>
301 return t.match(m_str);
306 template <
typename TChar,
typename TTraits>
309 std::basic_ostream<TChar, TTraits>*
m_out;
317 template <
typename TMatcher>
330 m_matcher(always_false{}) {
342 m_matcher(always_false{}) {
344 m_matcher = always_true{};
354 m_matcher(equal{str}) {
363 m_matcher(equal{str}) {
366 #ifdef OSMIUM_WITH_REGEX 384 m_matcher(
list{strings}) {
394 template <
typename TMatcher,
typename std::enable_if<
395 std::is_base_of<matcher, TMatcher>::value,
int>
::type = 0>
414 template <
typename TChar,
typename TTraits>
415 void print(std::basic_ostream<TChar, TTraits>& out)
const {
421 template <
typename TChar,
typename TTraits>
422 inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out,
const StringMatcher& matcher) {
429 #endif // OSMIUM_UTIL_STRING_MATCHER_HPP list(const std::vector< std::string > &strings)
Definition: string_matcher.hpp:240
equal(const char *str)
Definition: string_matcher.hpp:130
Definition: string_matcher.hpp:230
StringMatcher(TMatcher &&matcher)
Definition: string_matcher.hpp:396
bool operator()(const char *str) const noexcept
Definition: string_matcher.hpp:403
type
Definition: entity_bits.hpp:63
Definition: string_matcher.hpp:102
StringMatcher(const std::string &str)
Definition: string_matcher.hpp:362
boost::variant< always_false, always_true, equal, prefix, substring, list > matcher_type
Definition: string_matcher.hpp:285
equal(const std::string &str)
Definition: string_matcher.hpp:126
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:111
list & add_string(const char *str)
Definition: string_matcher.hpp:244
Definition: string_matcher.hpp:307
print_visitor(std::basic_ostream< TChar, TTraits > &out)
Definition: string_matcher.hpp:313
Definition: reader_iterator.hpp:39
StringMatcher(const std::vector< std::string > &strings)
Definition: string_matcher.hpp:383
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:254
Definition: string_matcher.hpp:120
bool match(const char *) const noexcept
Definition: string_matcher.hpp:88
StringMatcher()
Definition: string_matcher.hpp:329
Definition: string_matcher.hpp:78
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:415
Definition: string_matcher.hpp:176
match_visitor(const char *str) noexcept
Definition: string_matcher.hpp:295
std::vector< std::string > m_strings
Definition: string_matcher.hpp:232
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:265
Definition: string_matcher.hpp:73
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:93
prefix(const std::string &str)
Definition: string_matcher.hpp:154
bool operator()(const TMatcher &t) const noexcept
Definition: string_matcher.hpp:300
substring(const std::string &str)
Definition: string_matcher.hpp:182
std::string m_str
Definition: string_matcher.hpp:150
Definition: string_matcher.hpp:148
Definition: string_matcher.hpp:84
StringMatcher(const char *str)
Definition: string_matcher.hpp:353
StringMatcher(bool result)
Definition: string_matcher.hpp:341
list & add_string(const std::string &str)
Definition: string_matcher.hpp:249
prefix(const char *str)
Definition: string_matcher.hpp:158
substring(const char *str)
Definition: string_matcher.hpp:186
matcher_type m_matcher
Definition: string_matcher.hpp:287
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:139
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:190
std::basic_ostream< TChar, TTraits > * m_out
Definition: string_matcher.hpp:309
const char * m_str
Definition: string_matcher.hpp:291
Definition: string_matcher.hpp:289
bool match(const char *) const noexcept
Definition: string_matcher.hpp:106
std::string m_str
Definition: string_matcher.hpp:178
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:167
list()
Definition: string_matcher.hpp:236
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:195
bool operator()(const std::string &str) const noexcept
Definition: string_matcher.hpp:410
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:162
std::string m_str
Definition: string_matcher.hpp:122
void operator()(const TMatcher &t) const noexcept
Definition: string_matcher.hpp:318
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:134