Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / log / attributes / function.hpp
1 /*
2  *          Copyright Andrey Semashev 2007 - 2014.
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   function.hpp
9  * \author Andrey Semashev
10  * \date   24.06.2007
11  *
12  * The header contains implementation of an attribute that calls a third-party function on value acquisition.
13  */
14
15 #ifndef BOOST_LOG_ATTRIBUTES_FUNCTION_HPP_INCLUDED_
16 #define BOOST_LOG_ATTRIBUTES_FUNCTION_HPP_INCLUDED_
17
18 #include <boost/static_assert.hpp>
19 #include <boost/utility/result_of.hpp>
20 #include <boost/type_traits/is_void.hpp>
21 #include <boost/type_traits/remove_cv.hpp>
22 #include <boost/type_traits/remove_reference.hpp>
23 #include <boost/log/detail/config.hpp>
24 #include <boost/log/attributes/attribute.hpp>
25 #include <boost/log/attributes/attribute_cast.hpp>
26 #include <boost/log/attributes/attribute_value_impl.hpp>
27 #include <boost/log/detail/header.hpp>
28
29 #ifdef BOOST_HAS_PRAGMA_ONCE
30 #pragma once
31 #endif
32
33 namespace boost {
34
35 BOOST_LOG_OPEN_NAMESPACE
36
37 namespace attributes {
38
39 /*!
40  * \brief A class of an attribute that acquires its value from a third-party function object
41  *
42  * The attribute calls a stored nullary function object to acquire each value.
43  * The result type of the function object is the attribute value type.
44  *
45  * It is not recommended to use this class directly. Use \c make_function convenience functions
46  * to construct the attribute instead.
47  */
48 template< typename R >
49 class function :
50     public attribute
51 {
52     BOOST_STATIC_ASSERT_MSG(!is_void< R >::value, "Boost.Log: Function object return type must not be void");
53
54 public:
55     //! The attribute value type
56     typedef R value_type;
57
58 protected:
59     //! Base class for factory implementation
60     class BOOST_LOG_NO_VTABLE BOOST_SYMBOL_VISIBLE impl :
61         public attribute::impl
62     {
63     };
64
65     //! Factory implementation
66     template< typename T >
67     class impl_template :
68         public impl
69     {
70     private:
71         //! Functor that returns attribute values
72         /*!
73          * \note The constness signifies that the function object should avoid
74          *       modifying its state since it's not protected against concurrent calls.
75          */
76         const T m_Functor;
77
78     public:
79         /*!
80          * Constructor with the stored delegate initialization
81          */
82         explicit impl_template(T const& fun) : m_Functor(fun) {}
83
84         attribute_value get_value()
85         {
86             return attributes::make_attribute_value(m_Functor());
87         }
88     };
89
90 public:
91     /*!
92      * Initializing constructor
93      */
94     template< typename T >
95     explicit function(T const& fun) : attribute(new impl_template< T >(fun))
96     {
97     }
98     /*!
99      * Constructor for casting support
100      */
101     explicit function(cast_source const& source) :
102         attribute(source.as< impl >())
103     {
104     }
105 };
106
107 #ifndef BOOST_NO_RESULT_OF
108
109 /*!
110  * The function constructs \c function attribute instance with the provided function object.
111  *
112  * \param fun Nullary functional object that returns an actual stored value for an attribute value.
113  * \return Pointer to the attribute instance
114  */
115 template< typename T >
116 inline function<
117     typename remove_cv<
118         typename remove_reference<
119             typename boost::result_of< T() >::type
120         >::type
121     >::type
122 > make_function(T const& fun)
123 {
124     typedef typename remove_cv<
125         typename remove_reference<
126             typename boost::result_of< T() >::type
127         >::type
128     >::type result_type;
129
130     typedef function< result_type > function_type;
131     return function_type(fun);
132 }
133
134 #endif // BOOST_NO_RESULT_OF
135
136 #ifndef BOOST_LOG_DOXYGEN_PASS
137
138 /*!
139  * The function constructs \c function attribute instance with the provided function object.
140  * Use this version if your compiler fails to determine the result type of the function object.
141  *
142  * \param fun Nullary functional object that returns an actual stored value for an attribute value.
143  * \return Pointer to the attribute instance
144  */
145 template< typename R, typename T >
146 inline function<
147     typename remove_cv<
148         typename remove_reference< R >::type
149     >::type
150 > make_function(T const& fun)
151 {
152     typedef typename remove_cv<
153         typename remove_reference< R >::type
154     >::type result_type;
155
156     typedef function< result_type > function_type;
157     return function_type(fun);
158 }
159
160 #endif // BOOST_LOG_DOXYGEN_PASS
161
162 } // namespace attributes
163
164 BOOST_LOG_CLOSE_NAMESPACE // namespace log
165
166 } // namespace boost
167
168 #include <boost/log/detail/footer.hpp>
169
170 #endif // BOOST_LOG_ATTRIBUTES_FUNCTOR_HPP_INCLUDED_