1 #ifndef OSMIUM_UTIL_STRING_MATCHER_HPP
2 #define OSMIUM_UTIL_STRING_MATCHER_HPP
36 #include <boost/variant.hpp>
52 #if defined(__GLIBCXX__)
53 # if ((__cplusplus >= 201402L) || \
54 defined(_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT) || \
55 defined(_GLIBCXX_REGEX_STATE_LIMIT))
56 # define OSMIUM_WITH_REGEX
58 # pragma message("Disabling regex functionality. See source code for info.")
60 #elif defined(__clang__)
61 # if ((__clang_major__ > 3) || \
62 (__clang_minor__ == 3 && __clang_minor__ > 5))
63 # define OSMIUM_WITH_REGEX
65 # pragma message("Disabling regex functionality")
89 static bool match(
const char* ) noexcept {
93 template <
typename TChar,
typename TTraits>
94 void print(std::basic_ostream<TChar, TTraits>& out)
const {
95 out <<
"always_false";
107 static bool match(
const char* ) noexcept {
111 template <
typename TChar,
typename TTraits>
112 void print(std::basic_ostream<TChar, TTraits>& out)
const {
113 out <<
"always_true";
135 bool match(
const char* test_string)
const noexcept {
136 return !std::strcmp(
m_str.c_str(), test_string);
139 template <
typename TChar,
typename TTraits>
140 void print(std::basic_ostream<TChar, TTraits>& out)
const {
141 out <<
"equal[" <<
m_str <<
']';
163 bool match(
const char* test_string)
const noexcept {
164 return m_str.compare(0, std::string::npos, test_string, 0,
m_str.size()) == 0;
167 template <
typename TChar,
typename TTraits>
168 void print(std::basic_ostream<TChar, TTraits>& out)
const {
169 out <<
"prefix[" <<
m_str <<
']';
191 bool match(
const char* test_string)
const noexcept {
192 return std::strstr(test_string,
m_str.c_str()) !=
nullptr;
195 template <
typename TChar,
typename TTraits>
196 void print(std::basic_ostream<TChar, TTraits>& out)
const {
197 out <<
"substring[" <<
m_str <<
']';
202 #ifdef OSMIUM_WITH_REGEX
206 class regex :
public matcher {
212 explicit regex(std::regex regex) :
213 m_regex(
std::move(regex)) {
216 bool match(
const char* test_string)
const noexcept {
217 return std::regex_search(test_string, m_regex);
220 template <
typename TChar,
typename TTraits>
221 void print(std::basic_ostream<TChar, TTraits>& out)
const {
239 explicit list(std::vector<std::string> strings) :
253 bool match(
const char* test_string)
const noexcept {
255 [&test_string](
const std::string& s){
256 return s == test_string;
260 template <
typename TChar,
typename TTraits>
261 void print(std::basic_ostream<TChar, TTraits>& out)
const {
264 out <<
'[' << s <<
']';
278 #ifdef OSMIUM_WITH_REGEX
295 template <
typename TMatcher>
297 return t.match(
m_str);
302 template <
typename TChar,
typename TTraits>
305 std::basic_ostream<TChar, TTraits>*
m_out;
313 template <
typename TMatcher>
365 #ifdef OSMIUM_WITH_REGEX
396 template <
typename TMatcher,
typename X =
typename std::enable_if<
397 std::is_base_of<matcher, TMatcher>::value,
void>
::type>
416 template <
typename TChar,
typename TTraits>
417 void print(std::basic_ostream<TChar, TTraits>& out)
const {
423 template <
typename TChar,
typename TTraits>
424 inline std::basic_ostream<TChar, TTraits>&
operator<<(std::basic_ostream<TChar, TTraits>& out,
const StringMatcher& matcher) {
Definition: string_matcher.hpp:85
static bool match(const char *) noexcept
Definition: string_matcher.hpp:89
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:94
Definition: string_matcher.hpp:103
static bool match(const char *) noexcept
Definition: string_matcher.hpp:107
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:112
Definition: string_matcher.hpp:121
equal(const char *str)
Definition: string_matcher.hpp:131
std::string m_str
Definition: string_matcher.hpp:123
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:135
equal(std::string str)
Definition: string_matcher.hpp:127
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:140
Definition: string_matcher.hpp:231
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:253
list & add_string(const std::string &str)
Definition: string_matcher.hpp:248
std::vector< std::string > m_strings
Definition: string_matcher.hpp:233
list & add_string(const char *str)
Definition: string_matcher.hpp:243
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:261
list(std::vector< std::string > strings)
Definition: string_matcher.hpp:239
Definition: string_matcher.hpp:285
match_visitor(const char *str) noexcept
Definition: string_matcher.hpp:291
const char * m_str
Definition: string_matcher.hpp:287
bool operator()(const TMatcher &t) const noexcept
Definition: string_matcher.hpp:296
Definition: string_matcher.hpp:79
Definition: string_matcher.hpp:149
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:168
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:163
prefix(std::string str)
Definition: string_matcher.hpp:155
std::string m_str
Definition: string_matcher.hpp:151
prefix(const char *str)
Definition: string_matcher.hpp:159
Definition: string_matcher.hpp:303
print_visitor(std::basic_ostream< TChar, TTraits > &out)
Definition: string_matcher.hpp:309
std::basic_ostream< TChar, TTraits > * m_out
Definition: string_matcher.hpp:305
void operator()(const TMatcher &t) const noexcept
Definition: string_matcher.hpp:314
Definition: string_matcher.hpp:177
std::string m_str
Definition: string_matcher.hpp:179
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:196
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:191
substring(std::string str)
Definition: string_matcher.hpp:183
substring(const char *str)
Definition: string_matcher.hpp:187
Definition: string_matcher.hpp:74
StringMatcher()
Definition: string_matcher.hpp:325
StringMatcher(const std::vector< std::string > &strings)
Definition: string_matcher.hpp:384
StringMatcher(const char *str)
Definition: string_matcher.hpp:351
bool operator()(const char *str) const noexcept
Definition: string_matcher.hpp:405
boost::variant< always_false, always_true, equal, prefix, substring, list > matcher_type
Definition: string_matcher.hpp:281
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:417
bool operator()(const std::string &str) const noexcept
Definition: string_matcher.hpp:412
matcher_type m_matcher
Definition: string_matcher.hpp:283
StringMatcher(TMatcher &&matcher)
Definition: string_matcher.hpp:398
StringMatcher(bool result)
Definition: string_matcher.hpp:338
StringMatcher(const std::string &str)
Definition: string_matcher.hpp:361
type
Definition: entity_bits.hpp:63
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
std::basic_ostream< TChar, TTraits > & operator<<(std::basic_ostream< TChar, TTraits > &out, const item_type item_type)
Definition: item_type.hpp:187
Definition: location.hpp:551