171 lines
4.7 KiB
C++
171 lines
4.7 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 function.hpp
|
||
|
* \author Andrey Semashev
|
||
|
* \date 24.06.2007
|
||
|
*
|
||
|
* The header contains implementation of an attribute that calls a third-party function on value acquisition.
|
||
|
*/
|
||
|
|
||
|
#ifndef BOOST_LOG_ATTRIBUTES_FUNCTION_HPP_INCLUDED_
|
||
|
#define BOOST_LOG_ATTRIBUTES_FUNCTION_HPP_INCLUDED_
|
||
|
|
||
|
#include <boost/static_assert.hpp>
|
||
|
#include <boost/utility/result_of.hpp>
|
||
|
#include <boost/type_traits/is_void.hpp>
|
||
|
#include <boost/type_traits/remove_cv.hpp>
|
||
|
#include <boost/type_traits/remove_reference.hpp>
|
||
|
#include <boost/log/detail/config.hpp>
|
||
|
#include <boost/log/attributes/attribute.hpp>
|
||
|
#include <boost/log/attributes/attribute_cast.hpp>
|
||
|
#include <boost/log/attributes/attribute_value_impl.hpp>
|
||
|
#include <boost/log/detail/header.hpp>
|
||
|
|
||
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
namespace boost {
|
||
|
|
||
|
BOOST_LOG_OPEN_NAMESPACE
|
||
|
|
||
|
namespace attributes {
|
||
|
|
||
|
/*!
|
||
|
* \brief A class of an attribute that acquires its value from a third-party function object
|
||
|
*
|
||
|
* The attribute calls a stored nullary function object to acquire each value.
|
||
|
* The result type of the function object is the attribute value type.
|
||
|
*
|
||
|
* It is not recommended to use this class directly. Use \c make_function convenience functions
|
||
|
* to construct the attribute instead.
|
||
|
*/
|
||
|
template< typename R >
|
||
|
class function :
|
||
|
public attribute
|
||
|
{
|
||
|
BOOST_STATIC_ASSERT_MSG(!is_void< R >::value, "Boost.Log: Function object return type must not be void");
|
||
|
|
||
|
public:
|
||
|
//! The attribute value type
|
||
|
typedef R value_type;
|
||
|
|
||
|
protected:
|
||
|
//! Base class for factory implementation
|
||
|
class BOOST_LOG_NO_VTABLE BOOST_SYMBOL_VISIBLE impl :
|
||
|
public attribute::impl
|
||
|
{
|
||
|
};
|
||
|
|
||
|
//! Factory implementation
|
||
|
template< typename T >
|
||
|
class impl_template :
|
||
|
public impl
|
||
|
{
|
||
|
private:
|
||
|
//! Functor that returns attribute values
|
||
|
/*!
|
||
|
* \note The constness signifies that the function object should avoid
|
||
|
* modifying its state since it's not protected against concurrent calls.
|
||
|
*/
|
||
|
const T m_Functor;
|
||
|
|
||
|
public:
|
||
|
/*!
|
||
|
* Constructor with the stored delegate initialization
|
||
|
*/
|
||
|
explicit impl_template(T const& fun) : m_Functor(fun) {}
|
||
|
|
||
|
attribute_value get_value()
|
||
|
{
|
||
|
return attributes::make_attribute_value(m_Functor());
|
||
|
}
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
/*!
|
||
|
* Initializing constructor
|
||
|
*/
|
||
|
template< typename T >
|
||
|
explicit function(T const& fun) : attribute(new impl_template< T >(fun))
|
||
|
{
|
||
|
}
|
||
|
/*!
|
||
|
* Constructor for casting support
|
||
|
*/
|
||
|
explicit function(cast_source const& source) :
|
||
|
attribute(source.as< impl >())
|
||
|
{
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#ifndef BOOST_NO_RESULT_OF
|
||
|
|
||
|
/*!
|
||
|
* The function constructs \c function attribute instance with the provided function object.
|
||
|
*
|
||
|
* \param fun Nullary functional object that returns an actual stored value for an attribute value.
|
||
|
* \return Pointer to the attribute instance
|
||
|
*/
|
||
|
template< typename T >
|
||
|
inline function<
|
||
|
typename remove_cv<
|
||
|
typename remove_reference<
|
||
|
typename boost::result_of< T() >::type
|
||
|
>::type
|
||
|
>::type
|
||
|
> make_function(T const& fun)
|
||
|
{
|
||
|
typedef typename remove_cv<
|
||
|
typename remove_reference<
|
||
|
typename boost::result_of< T() >::type
|
||
|
>::type
|
||
|
>::type result_type;
|
||
|
|
||
|
typedef function< result_type > function_type;
|
||
|
return function_type(fun);
|
||
|
}
|
||
|
|
||
|
#endif // BOOST_NO_RESULT_OF
|
||
|
|
||
|
#ifndef BOOST_LOG_DOXYGEN_PASS
|
||
|
|
||
|
/*!
|
||
|
* The function constructs \c function attribute instance with the provided function object.
|
||
|
* Use this version if your compiler fails to determine the result type of the function object.
|
||
|
*
|
||
|
* \param fun Nullary functional object that returns an actual stored value for an attribute value.
|
||
|
* \return Pointer to the attribute instance
|
||
|
*/
|
||
|
template< typename R, typename T >
|
||
|
inline function<
|
||
|
typename remove_cv<
|
||
|
typename remove_reference< R >::type
|
||
|
>::type
|
||
|
> make_function(T const& fun)
|
||
|
{
|
||
|
typedef typename remove_cv<
|
||
|
typename remove_reference< R >::type
|
||
|
>::type result_type;
|
||
|
|
||
|
typedef function< result_type > function_type;
|
||
|
return function_type(fun);
|
||
|
}
|
||
|
|
||
|
#endif // BOOST_LOG_DOXYGEN_PASS
|
||
|
|
||
|
} // namespace attributes
|
||
|
|
||
|
BOOST_LOG_CLOSE_NAMESPACE // namespace log
|
||
|
|
||
|
} // namespace boost
|
||
|
|
||
|
#include <boost/log/detail/footer.hpp>
|
||
|
|
||
|
#endif // BOOST_LOG_ATTRIBUTES_FUNCTOR_HPP_INCLUDED_
|