mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-05 15:21:43 +00:00
45 lines
1.2 KiB
C++
45 lines
1.2 KiB
C++
|
#pragma once
|
||
|
#include <DB/Common/OptimizedRegularExpression.h>
|
||
|
#include <DB/Functions/ObjectPool.h>
|
||
|
#include <DB/Functions/likePatternToRegexp.h>
|
||
|
|
||
|
namespace ProfileEvents
|
||
|
{
|
||
|
extern const Event RegexpCreated;
|
||
|
}
|
||
|
|
||
|
|
||
|
namespace DB {
|
||
|
|
||
|
|
||
|
namespace Regexps
|
||
|
{
|
||
|
using Regexp = OptimizedRegularExpressionImpl<false>;
|
||
|
using Pool = ObjectPoolMap<Regexp, String>;
|
||
|
|
||
|
template <bool like>
|
||
|
inline Regexp createRegexp(const std::string & pattern, int flags) { return {pattern, flags}; }
|
||
|
|
||
|
template <>
|
||
|
inline Regexp createRegexp<true>(const std::string & pattern, int flags) { return {likePatternToRegexp(pattern), flags}; }
|
||
|
|
||
|
template <bool like, bool no_capture>
|
||
|
inline Pool::Pointer get(const std::string & pattern)
|
||
|
{
|
||
|
/// C++11 has thread-safe function-local statics on most modern compilers.
|
||
|
static Pool known_regexps; /// Разные переменные для разных параметров шаблона.
|
||
|
|
||
|
return known_regexps.get(pattern, [&pattern]
|
||
|
{
|
||
|
int flags = OptimizedRegularExpression::RE_DOT_NL;
|
||
|
if (no_capture)
|
||
|
flags |= OptimizedRegularExpression::RE_NO_CAPTURE;
|
||
|
|
||
|
ProfileEvents::increment(ProfileEvents::RegexpCreated);
|
||
|
return new Regexp{createRegexp<like>(pattern, flags)};
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|