diff options
Diffstat (limited to 'boost/log/support/spirit_qi.hpp')
-rw-r--r-- | boost/log/support/spirit_qi.hpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/boost/log/support/spirit_qi.hpp b/boost/log/support/spirit_qi.hpp new file mode 100644 index 0000000000..48c0059a44 --- /dev/null +++ b/boost/log/support/spirit_qi.hpp @@ -0,0 +1,92 @@ +/* + * Copyright Andrey Semashev 2007 - 2014. + * 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 support/spirit_qi.hpp + * \author Andrey Semashev + * \date 19.07.2009 + * + * This header enables Boost.Spirit.Qi support for Boost.Log. + */ + +#ifndef BOOST_LOG_SUPPORT_SPIRIT_QI_HPP_INCLUDED_ +#define BOOST_LOG_SUPPORT_SPIRIT_QI_HPP_INCLUDED_ + +#include <boost/utility/enable_if.hpp> +#include <boost/spirit/include/qi_parse.hpp> +#include <boost/spirit/include/qi_domain.hpp> +#include <boost/spirit/include/support_unused.hpp> +#include <boost/spirit/home/support/meta_compiler.hpp> // spirit::compile() +#include <boost/spirit/home/qi/nonterminal/nonterminal_fwd.hpp> // rule forward declaration +#include <boost/log/detail/config.hpp> +#include <boost/log/utility/functional/matches.hpp> +#include <boost/log/detail/header.hpp> + +#ifdef BOOST_HAS_PRAGMA_ONCE +#pragma once +#endif + +namespace boost { + +BOOST_LOG_OPEN_NAMESPACE + +namespace aux { + +//! This tag type is used if an expression is recognized as a Boost.Spirit.Qi expression +struct boost_spirit_qi_expression_tag; + +//! The metafunction detects the matching expression kind and returns a tag that is used to specialize \c match_traits +template< typename ExpressionT > +struct matching_expression_kind< ExpressionT, typename boost::enable_if< spirit::traits::matches< spirit::qi::domain, ExpressionT > >::type > +{ + typedef boost_spirit_qi_expression_tag type; +}; + +//! The matching function implementation +template< typename ExpressionT > +struct match_traits< ExpressionT, boost_spirit_qi_expression_tag > +{ + typedef typename spirit::result_of::compile< spirit::qi::domain, ExpressionT, spirit::unused_type >::type compiled_type; + + static compiled_type compile(ExpressionT const& expr) + { + return spirit::compile< spirit::qi::domain >(expr); + } + + template< typename StringT > + static bool matches(StringT const& str, ExpressionT const& expr) + { + typedef typename StringT::const_iterator const_iterator; + const_iterator it = str.begin(), end = str.end(); + return (spirit::qi::parse(it, end, expr) && it == end); + } +}; + +//! The matching function implementation +template< typename IteratorT, typename T1, typename T2, typename T3, typename T4 > +struct match_traits< spirit::qi::rule< IteratorT, T1, T2, T3, T4 >, boost_spirit_qi_expression_tag > +{ + typedef spirit::qi::rule< IteratorT, T1, T2, T3, T4 > compiled_type; + static compiled_type compile(compiled_type const& expr) { return expr; } + + template< typename StringT > + static bool matches(StringT const& str, compiled_type const& expr) + { + typedef typename StringT::const_iterator const_iterator; + const_iterator it = str.begin(), end = str.end(); + return (spirit::qi::parse(it, end, expr) && it == end); + } +}; + +} // namespace aux + +BOOST_LOG_CLOSE_NAMESPACE // namespace log + +} // namespace boost + +#include <boost/log/detail/footer.hpp> + +#endif // BOOST_LOG_SUPPORT_SPIRIT_QI_HPP_INCLUDED_ |