1 #ifndef OSMIUM_UTIL_STRING_MATCHER_HPP 2 #define OSMIUM_UTIL_STRING_MATCHER_HPP 36 #include <boost/variant.hpp> 51 #if defined(__GLIBCXX__) 52 # if ((__cplusplus >= 201402L) || \ 53 defined(_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT) || \ 54 defined(_GLIBCXX_REGEX_STATE_LIMIT)) 55 # define OSMIUM_WITH_REGEX 57 # pragma message("Disabling regex functionality. See source code for info.") 59 #elif defined(__clang__) 60 # if ((__clang_major__ > 3) || \ 61 (__clang_minor__ == 3 && __clang_minor__ > 5)) 62 # define OSMIUM_WITH_REGEX 64 # pragma message("Disabling regex functionality") 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";
127 m_str(
std::move(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 <<
']';
155 m_str(
std::move(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 <<
']';
183 m_str(
std::move(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(std::regex regex) :
212 m_regex(std::move(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 {
236 explicit list() =
default;
238 explicit list(std::vector<std::string> strings) :
239 m_strings(
std::move(strings)) {
243 m_strings.emplace_back(str);
248 m_strings.push_back(str);
252 bool match(
const char* test_string)
const noexcept {
253 for (
const auto& s : m_strings) {
254 if (!std::strcmp(s.c_str(), test_string)) {
262 template <
typename TChar,
typename TTraits>
263 void print(std::basic_ostream<TChar, TTraits>& out)
const {
265 for (
const auto& s : m_strings) {
266 out <<
'[' << s <<
']';
280 #ifdef OSMIUM_WITH_REGEX 297 template <
typename TMatcher>
299 return t.match(m_str);
304 template <
typename TChar,
typename TTraits>
307 std::basic_ostream<TChar, TTraits>*
m_out;
315 template <
typename TMatcher>
328 m_matcher(always_false{}) {
340 m_matcher(always_false{}) {
342 m_matcher = always_true{};
352 m_matcher(equal{str}) {
361 m_matcher(equal{str}) {
364 #ifdef OSMIUM_WITH_REGEX 382 m_matcher(
list{strings}) {
392 template <
typename TMatcher,
typename X =
typename std::enable_if<
393 std::is_base_of<matcher, TMatcher>::value,
void>
::type>
412 template <
typename TChar,
typename TTraits>
413 void print(std::basic_ostream<TChar, TTraits>& out)
const {
419 template <
typename TChar,
typename TTraits>
420 inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out,
const StringMatcher& matcher) {
427 #endif // OSMIUM_UTIL_STRING_MATCHER_HPP equal(const char *str)
Definition: string_matcher.hpp:130
Definition: string_matcher.hpp:230
StringMatcher(TMatcher &&matcher)
Definition: string_matcher.hpp:394
bool operator()(const char *str) const noexcept
Definition: string_matcher.hpp:401
type
Definition: entity_bits.hpp:63
Definition: string_matcher.hpp:102
StringMatcher(const std::string &str)
Definition: string_matcher.hpp:360
boost::variant< always_false, always_true, equal, prefix, substring, list > matcher_type
Definition: string_matcher.hpp:283
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:111
list & add_string(const char *str)
Definition: string_matcher.hpp:242
Definition: string_matcher.hpp:305
print_visitor(std::basic_ostream< TChar, TTraits > &out)
Definition: string_matcher.hpp:311
Definition: location.hpp:551
StringMatcher(const std::vector< std::string > &strings)
Definition: string_matcher.hpp:381
equal(std::string str)
Definition: string_matcher.hpp:126
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:252
Definition: string_matcher.hpp:120
bool match(const char *) const noexcept
Definition: string_matcher.hpp:88
StringMatcher()
Definition: string_matcher.hpp:327
Definition: string_matcher.hpp:78
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:413
Definition: string_matcher.hpp:176
match_visitor(const char *str) noexcept
Definition: string_matcher.hpp:293
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:263
Definition: string_matcher.hpp:73
void print(std::basic_ostream< TChar, TTraits > &out) const
Definition: string_matcher.hpp:93
bool operator()(const TMatcher &t) const noexcept
Definition: string_matcher.hpp:298
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:351
substring(std::string str)
Definition: string_matcher.hpp:182
StringMatcher(bool result)
Definition: string_matcher.hpp:339
list & add_string(const std::string &str)
Definition: string_matcher.hpp:247
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:285
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:307
const char * m_str
Definition: string_matcher.hpp:289
Definition: string_matcher.hpp:287
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
prefix(std::string str)
Definition: string_matcher.hpp:154
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:408
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:162
list(std::vector< std::string > strings)
Definition: string_matcher.hpp:238
std::string m_str
Definition: string_matcher.hpp:122
void operator()(const TMatcher &t) const noexcept
Definition: string_matcher.hpp:316
bool match(const char *test_string) const noexcept
Definition: string_matcher.hpp:134