]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | * Copyright Andrey Semashev 2007 - 2015. | |
3 | * Distributed under the Boost Software License, Version 1.0. | |
4 | * (See accompanying file LICENSE_1_0.txt or copy at | |
5 | * http://www.boost.org/LICENSE_1_0.txt) | |
6 | */ | |
7 | /*! | |
8 | * \file attribute_predicate.hpp | |
9 | * \author Andrey Semashev | |
10 | * \date 02.09.2012 | |
11 | * | |
12 | * The header contains implementation of a generic predicate in template expressions. | |
13 | */ | |
14 | ||
15 | #ifndef BOOST_LOG_DETAIL_ATTRIBUTE_PREDICATE_HPP_INCLUDED_ | |
16 | #define BOOST_LOG_DETAIL_ATTRIBUTE_PREDICATE_HPP_INCLUDED_ | |
17 | ||
18 | #include <boost/phoenix/core/actor.hpp> | |
19 | #include <boost/utility/result_of.hpp> | |
20 | #include <boost/log/detail/config.hpp> | |
21 | #include <boost/log/attributes/attribute_name.hpp> | |
22 | #include <boost/log/attributes/value_visitation.hpp> | |
23 | #include <boost/log/attributes/fallback_policy.hpp> | |
24 | #include <boost/log/utility/functional/bind.hpp> | |
25 | #include <boost/log/utility/functional/save_result.hpp> | |
26 | #include <boost/log/detail/header.hpp> | |
27 | ||
28 | #ifdef BOOST_HAS_PRAGMA_ONCE | |
29 | #pragma once | |
30 | #endif | |
31 | ||
32 | namespace boost { | |
33 | ||
34 | BOOST_LOG_OPEN_NAMESPACE | |
35 | ||
36 | namespace expressions { | |
37 | ||
38 | namespace aux { | |
39 | ||
40 | /*! | |
41 | * The predicate checks if the attribute value satisfies a predicate. | |
42 | */ | |
43 | template< typename T, typename ArgT, typename PredicateT, typename FallbackPolicyT = fallback_to_none > | |
44 | class attribute_predicate | |
45 | { | |
46 | public: | |
47 | //! Function result_type | |
48 | typedef bool result_type; | |
49 | //! Expected attribute value type | |
50 | typedef T value_type; | |
51 | //! Predicate type | |
52 | typedef PredicateT predicate_type; | |
53 | //! Argument type for the predicate | |
54 | typedef ArgT argument_type; | |
55 | //! Fallback policy | |
56 | typedef FallbackPolicyT fallback_policy; | |
57 | ||
58 | private: | |
59 | //! Argument for the predicate | |
60 | const argument_type m_arg; | |
61 | //! Attribute value name | |
62 | const attribute_name m_name; | |
63 | //! Visitor invoker | |
64 | value_visitor_invoker< value_type, fallback_policy > m_visitor_invoker; | |
65 | ||
66 | public: | |
67 | /*! | |
68 | * Initializing constructor | |
69 | * | |
70 | * \param name Attribute name | |
71 | * \param pred_arg The predicate argument | |
72 | */ | |
73 | attribute_predicate(attribute_name const& name, argument_type const& pred_arg) : m_arg(pred_arg), m_name(name) | |
74 | { | |
75 | } | |
76 | ||
77 | /*! | |
78 | * Initializing constructor | |
79 | * | |
80 | * \param name Attribute name | |
81 | * \param pred_arg The predicate argument | |
82 | * \param arg Additional parameter for the fallback policy | |
83 | */ | |
84 | template< typename U > | |
85 | attribute_predicate(attribute_name const& name, argument_type const& pred_arg, U const& arg) : m_arg(pred_arg), m_name(name), m_visitor_invoker(arg) | |
86 | { | |
87 | } | |
88 | ||
89 | /*! | |
90 | * Checking operator | |
91 | * | |
92 | * \param arg A set of attribute values or a log record | |
93 | * \return \c true if the log record contains the sought attribute value, \c false otherwise | |
94 | */ | |
95 | template< typename ArgumentT > | |
96 | result_type operator() (ArgumentT const& arg) const | |
97 | { | |
98 | typedef binder2nd< predicate_type, argument_type const& > visitor_type; | |
99 | ||
100 | bool res = false; | |
101 | m_visitor_invoker(m_name, arg, boost::log::save_result(visitor_type(predicate_type(), m_arg), res)); | |
102 | return res; | |
103 | } | |
104 | }; | |
105 | ||
106 | } // namespace aux | |
107 | ||
108 | } // namespace expressions | |
109 | ||
110 | BOOST_LOG_CLOSE_NAMESPACE // namespace log | |
111 | ||
112 | } // namespace boost | |
113 | ||
114 | #include <boost/log/detail/footer.hpp> | |
115 | ||
116 | #endif // BOOST_LOG_DETAIL_ATTRIBUTE_PREDICATE_HPP_INCLUDED_ |