mirror of
https://github.com/boostorg/log.git
synced 2026-02-10 23:42:22 +00:00
275 lines
8.2 KiB
C++
275 lines
8.2 KiB
C++
/*
|
|
* Copyright Andrey Semashev 2007 - 2015.
|
|
* Distributed under the Boost Software License, Version 1.0.
|
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
* http://www.boost.org/LICENSE_1_0.txt)
|
|
*/
|
|
/*!
|
|
* \file matches_relation_factory.hpp
|
|
* \author Andrey Semashev
|
|
* \date 03.08.2013
|
|
*
|
|
* \brief This header is the Boost.Log library implementation, see the library documentation
|
|
* at http://www.boost.org/doc/libs/release/libs/log/doc/html/index.html.
|
|
*/
|
|
|
|
#if !defined(BOOST_LOG_WITHOUT_SETTINGS_PARSERS) && !defined(BOOST_LOG_WITHOUT_DEFAULT_FACTORIES)
|
|
|
|
#include <boost/log/detail/setup_config.hpp>
|
|
|
|
#if defined(BOOST_LOG_USE_STD_REGEX) && defined(BOOST_NO_CXX11_HDR_REGEX)
|
|
#error "Boost.Log: Cannot use std::regex because it is not supported by the standard library."
|
|
#endif
|
|
|
|
#if !defined(BOOST_LOG_USE_BOOST_REGEX) && !defined(BOOST_LOG_USE_STD_REGEX) && !defined(BOOST_LOG_USE_BOOST_XPRESSIVE)
|
|
// Use Boost.Regex backend by default. It produces smaller executables and also has the best performance for small string matching.
|
|
// Note: This default has to be in sync with Boost.Log Jamfile.v2.
|
|
#define BOOST_LOG_USE_BOOST_REGEX
|
|
#endif
|
|
|
|
#include <string>
|
|
#if defined(BOOST_LOG_USE_STD_REGEX)
|
|
#include <regex>
|
|
#include <boost/log/support/std_regex.hpp>
|
|
#elif defined(BOOST_LOG_USE_BOOST_REGEX)
|
|
#include <boost/regex.hpp>
|
|
#include <boost/log/support/regex.hpp>
|
|
#else
|
|
#include <boost/xpressive/xpressive_dynamic.hpp>
|
|
#include <boost/log/support/xpressive.hpp>
|
|
#endif
|
|
#include <boost/log/utility/string_literal.hpp>
|
|
#include <boost/log/utility/functional/matches.hpp>
|
|
#include <boost/log/utility/type_dispatch/standard_types.hpp>
|
|
#include <boost/log/detail/code_conversion.hpp>
|
|
#if defined(BOOST_LOG_USE_CHAR) && defined(BOOST_LOG_USE_WCHAR_T)
|
|
#include <boost/fusion/container/set.hpp>
|
|
#include <boost/fusion/sequence/intrinsic/at_key.hpp>
|
|
#include <boost/fusion/algorithm/iteration/for_each.hpp>
|
|
#endif
|
|
#include "default_filter_factory.hpp"
|
|
#include <boost/log/detail/header.hpp>
|
|
|
|
namespace boost {
|
|
|
|
BOOST_LOG_OPEN_NAMESPACE
|
|
|
|
namespace aux {
|
|
|
|
BOOST_LOG_ANONYMOUS_NAMESPACE {
|
|
|
|
#if defined(BOOST_LOG_USE_STD_REGEX) || defined(BOOST_LOG_USE_BOOST_REGEX)
|
|
|
|
#if defined(BOOST_LOG_USE_STD_REGEX)
|
|
namespace regex_namespace = std;
|
|
#else
|
|
namespace regex_namespace = boost;
|
|
#endif
|
|
|
|
#if defined(BOOST_LOG_USE_CHAR) && defined(BOOST_LOG_USE_WCHAR_T)
|
|
|
|
//! A special filtering predicate that adopts the string operand to the attribute value character type
|
|
struct matches_predicate :
|
|
public matches_fun
|
|
{
|
|
template< typename CharT >
|
|
struct initializer
|
|
{
|
|
typedef void result_type;
|
|
typedef CharT char_type;
|
|
typedef std::basic_string< char_type > string_type;
|
|
|
|
explicit initializer(string_type const& val) : m_initializer(val)
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
result_type operator() (T& val) const
|
|
{
|
|
try
|
|
{
|
|
typedef typename T::value_type target_char_type;
|
|
std::basic_string< target_char_type > str;
|
|
log::aux::code_convert(m_initializer, str);
|
|
val.assign(str, T::ECMAScript | T::optimize);
|
|
}
|
|
catch (...)
|
|
{
|
|
}
|
|
}
|
|
|
|
private:
|
|
string_type const& m_initializer;
|
|
};
|
|
|
|
typedef matches_fun::result_type result_type;
|
|
|
|
template< typename CharT >
|
|
explicit matches_predicate(std::basic_string< CharT > const& operand)
|
|
{
|
|
fusion::for_each(m_operands, initializer< CharT >(operand));
|
|
}
|
|
|
|
template< typename T >
|
|
result_type operator() (T const& val) const
|
|
{
|
|
typedef typename T::value_type char_type;
|
|
typedef regex_namespace::basic_regex< char_type > regex_type;
|
|
return matches_fun::operator() (val, fusion::at_key< regex_type >(m_operands));
|
|
}
|
|
|
|
private:
|
|
fusion::set< regex_namespace::regex, regex_namespace::wregex > m_operands;
|
|
};
|
|
|
|
#else
|
|
|
|
//! A special filtering predicate that adopts the string operand to the attribute value character type
|
|
template< typename CharT >
|
|
struct matches_predicate :
|
|
public matches_fun
|
|
{
|
|
typedef typename matches_fun::result_type result_type;
|
|
typedef CharT char_type;
|
|
typedef std::basic_string< char_type > string_type;
|
|
typedef regex_namespace::basic_regex< char_type > regex_type;
|
|
|
|
explicit matches_predicate(string_type const& operand) :
|
|
m_operand(operand, regex_type::ECMAScript | regex_type::optimize)
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
result_type operator() (T const& val) const
|
|
{
|
|
return matches_fun::operator() (val, m_operand);
|
|
}
|
|
|
|
private:
|
|
regex_type m_operand;
|
|
};
|
|
|
|
#endif
|
|
|
|
#else // defined(BOOST_LOG_USE_STD_REGEX) || defined(BOOST_LOG_USE_BOOST_REGEX)
|
|
|
|
#if defined(BOOST_LOG_USE_CHAR) && defined(BOOST_LOG_USE_WCHAR_T)
|
|
|
|
//! A special filtering predicate that adopts the string operand to the attribute value character type
|
|
struct matches_predicate :
|
|
public matches_fun
|
|
{
|
|
template< typename CharT >
|
|
struct initializer
|
|
{
|
|
typedef void result_type;
|
|
typedef CharT char_type;
|
|
typedef std::basic_string< char_type > string_type;
|
|
|
|
explicit initializer(string_type const& val) : m_initializer(val)
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
result_type operator() (T& val) const
|
|
{
|
|
try
|
|
{
|
|
typedef typename T::char_type target_char_type;
|
|
std::basic_string< target_char_type > str;
|
|
log::aux::code_convert(m_initializer, str);
|
|
val = T::compile(str.c_str(), str.size(), T::ECMAScript | T::optimize);
|
|
}
|
|
catch (...)
|
|
{
|
|
}
|
|
}
|
|
|
|
private:
|
|
string_type const& m_initializer;
|
|
};
|
|
|
|
typedef matches_fun::result_type result_type;
|
|
|
|
template< typename CharT >
|
|
explicit matches_predicate(std::basic_string< CharT > const& operand)
|
|
{
|
|
fusion::for_each(m_operands, initializer< CharT >(operand));
|
|
}
|
|
|
|
template< typename T >
|
|
result_type operator() (T const& val) const
|
|
{
|
|
typedef typename T::value_type char_type;
|
|
typedef xpressive::basic_regex< const char_type* > regex_type;
|
|
return matches_fun::operator() (val, fusion::at_key< regex_type >(m_operands));
|
|
}
|
|
|
|
private:
|
|
fusion::set< xpressive::cregex, xpressive::wcregex > m_operands;
|
|
};
|
|
|
|
#else
|
|
|
|
//! A special filtering predicate that adopts the string operand to the attribute value character type
|
|
template< typename CharT >
|
|
struct matches_predicate :
|
|
public matches_fun
|
|
{
|
|
typedef typename matches_fun::result_type result_type;
|
|
typedef CharT char_type;
|
|
typedef std::basic_string< char_type > string_type;
|
|
typedef xpressive::basic_regex< const char_type* > regex_type;
|
|
|
|
explicit matches_predicate(string_type const& operand) :
|
|
m_operand(regex_type::compile(operand.c_str(), operand.size(), regex_type::ECMAScript | regex_type::optimize))
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
result_type operator() (T const& val) const
|
|
{
|
|
return matches_fun::operator() (val, m_operand);
|
|
}
|
|
|
|
private:
|
|
regex_type m_operand;
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif // defined(BOOST_LOG_USE_STD_REGEX) || defined(BOOST_LOG_USE_BOOST_REGEX)
|
|
|
|
} // namespace
|
|
|
|
//! The function parses the "matches" relation
|
|
template< typename CharT >
|
|
filter parse_matches_relation(attribute_name const& name, std::basic_string< CharT > const& operand)
|
|
{
|
|
#if defined(BOOST_LOG_USE_CHAR) && defined(BOOST_LOG_USE_WCHAR_T)
|
|
return predicate_wrapper< log::string_types::type, matches_predicate >(name, matches_predicate(operand));
|
|
#else
|
|
return predicate_wrapper< std::basic_string< CharT >, matches_predicate< CharT > >(name, matches_predicate< CharT >(operand));
|
|
#endif
|
|
}
|
|
|
|
// Explicitly instantiate factory implementation
|
|
#ifdef BOOST_LOG_USE_CHAR
|
|
template
|
|
filter parse_matches_relation< char >(attribute_name const& name, std::basic_string< char > const& operand);
|
|
#endif
|
|
#ifdef BOOST_LOG_USE_WCHAR_T
|
|
template
|
|
filter parse_matches_relation< wchar_t >(attribute_name const& name, std::basic_string< wchar_t > const& operand);
|
|
#endif
|
|
|
|
} // namespace aux
|
|
|
|
BOOST_LOG_CLOSE_NAMESPACE // namespace log
|
|
|
|
} // namespace boost
|
|
|
|
#include <boost/log/detail/footer.hpp>
|
|
|
|
#endif // !defined(BOOST_LOG_WITHOUT_SETTINGS_PARSERS) && !defined(BOOST_LOG_WITHOUT_DEFAULT_FACTORIES)
|