Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/log/expressions/attr.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/log/expressions/attr.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,285 @@ +/* + * Copyright Andrey Semashev 2007 - 2013. + * 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 attr.hpp + * \author Andrey Semashev + * \date 21.07.2012 + * + * The header contains implementation of a generic attribute placeholder in template expressions. + */ + +#ifndef BOOST_LOG_EXPRESSIONS_ATTR_HPP_INCLUDED_ +#define BOOST_LOG_EXPRESSIONS_ATTR_HPP_INCLUDED_ + +#include <boost/mpl/bool.hpp> +#include <boost/utility/result_of.hpp> +#include <boost/phoenix/core/actor.hpp> +#include <boost/phoenix/core/terminal_fwd.hpp> +#include <boost/phoenix/core/is_nullary.hpp> +#include <boost/phoenix/core/environment.hpp> +#include <boost/fusion/sequence/intrinsic/at_c.hpp> +#include <boost/type_traits/remove_cv.hpp> +#include <boost/type_traits/remove_reference.hpp> +#include <boost/log/detail/config.hpp> +#include <boost/log/detail/custom_terminal_spec.hpp> +#include <boost/log/attributes/attribute_name.hpp> +#include <boost/log/attributes/value_extraction.hpp> +#include <boost/log/attributes/fallback_policy.hpp> +#include <boost/log/expressions/attr_fwd.hpp> +#include <boost/log/detail/header.hpp> + +#ifdef BOOST_HAS_PRAGMA_ONCE +#pragma once +#endif + +namespace boost { + +BOOST_LOG_OPEN_NAMESPACE + +namespace expressions { + +/*! + * An attribute value extraction terminal + */ +template< typename T, typename FallbackPolicyT, typename TagT > +class attribute_terminal +{ +private: + //! Value extractor type + typedef value_extractor< T, FallbackPolicyT, TagT > value_extractor_type; + //! Self type + typedef attribute_terminal< T, FallbackPolicyT, TagT > this_type; + +public: + //! Internal typedef for type categorization + typedef void _is_boost_log_terminal; + + //! Attribute tag type + typedef TagT tag_type; + //! Attribute value type + typedef typename value_extractor_type::value_type value_type; + //! Fallback policy type + typedef typename value_extractor_type::fallback_policy fallback_policy; + + //! Function result type + template< typename > + struct result; + + template< typename ContextT > + struct result< this_type(ContextT) > + { + typedef typename remove_cv< + typename remove_reference< typename phoenix::result_of::env< ContextT >::type >::type + >::type env_type; + typedef typename env_type::args_type args_type; + + typedef typename boost::result_of< value_extractor_type(attribute_name const&, typename fusion::result_of::at_c< args_type, 0 >::type) >::type type; + }; + + template< typename ContextT > + struct result< const this_type(ContextT) > + { + typedef typename remove_cv< + typename remove_reference< typename phoenix::result_of::env< ContextT >::type >::type + >::type env_type; + typedef typename env_type::args_type args_type; + + typedef typename boost::result_of< const value_extractor_type(attribute_name const&, typename fusion::result_of::at_c< args_type, 0 >::type) >::type type; + }; + +private: + //! Attribute value name + const attribute_name m_name; + //! Attribute value extractor + value_extractor_type m_value_extractor; + +public: + /*! + * Initializing constructor + */ + explicit attribute_terminal(attribute_name const& name) : m_name(name) + { + } + + /*! + * Initializing constructor + */ + template< typename U > + attribute_terminal(attribute_name const& name, U const& arg) : m_name(name), m_value_extractor(arg) + { + } + + /*! + * \returns Attribute value name + */ + attribute_name get_name() const + { + return m_name; + } + + /*! + * \returns Fallback policy + */ + fallback_policy const& get_fallback_policy() const + { + return m_value_extractor.get_fallback_policy(); + } + + /*! + * The operator extracts attribute value + */ + template< typename ContextT > + typename result< this_type(ContextT const&) >::type + operator() (ContextT const& ctx) + { + return m_value_extractor(m_name, fusion::at_c< 0 >(phoenix::env(ctx).args())); + } + + /*! + * The operator extracts attribute value + */ + template< typename ContextT > + typename result< const this_type(ContextT const&) >::type + operator() (ContextT const& ctx) const + { + return m_value_extractor(m_name, fusion::at_c< 0 >(phoenix::env(ctx).args())); + } + + BOOST_DELETED_FUNCTION(attribute_terminal()) +}; + +/*! + * An attribute value extraction terminal actor + */ +template< typename T, typename FallbackPolicyT, typename TagT, template< typename > class ActorT > +class attribute_actor : + public ActorT< attribute_terminal< T, FallbackPolicyT, TagT > > +{ +public: + //! Attribute tag type + typedef TagT tag_type; + //! Fallback policy + typedef FallbackPolicyT fallback_policy; + //! Base terminal type + typedef attribute_terminal< T, fallback_policy, tag_type > terminal_type; + //! Attribute value type + typedef typename terminal_type::value_type value_type; + + //! Base actor type + typedef ActorT< terminal_type > base_type; + +public: + //! Initializing constructor + explicit attribute_actor(base_type const& act) : base_type(act) + { + } + + /*! + * \returns The attribute name + */ + attribute_name get_name() const + { + return this->proto_expr_.child0.get_name(); + } + + /*! + * \returns Fallback policy + */ + fallback_policy const& get_fallback_policy() const + { + return this->proto_expr_.child0.get_fallback_policy(); + } + + //! Expression with cached attribute name + typedef attribute_actor< value_type, fallback_to_none, tag_type, ActorT > or_none_result_type; + + //! Generates an expression that extracts the attribute value or a default value + or_none_result_type or_none() const + { + typedef typename or_none_result_type::terminal_type result_terminal; + typename or_none_result_type::base_type act = {{ result_terminal(get_name()) }}; + return or_none_result_type(act); + } + + //! Expression with cached attribute name + typedef attribute_actor< value_type, fallback_to_throw, tag_type, ActorT > or_throw_result_type; + + //! Generates an expression that extracts the attribute value or throws an exception + or_throw_result_type or_throw() const + { + typedef typename or_throw_result_type::terminal_type result_terminal; + typename or_throw_result_type::base_type act = {{ result_terminal(get_name()) }}; + return or_throw_result_type(act); + } + + //! Generates an expression that extracts the attribute value or a default value + template< typename DefaultT > + attribute_actor< value_type, fallback_to_default< DefaultT >, tag_type, ActorT > or_default(DefaultT const& def_val) const + { + typedef attribute_actor< value_type, fallback_to_default< DefaultT >, tag_type, ActorT > or_default_result_type; + typedef typename or_default_result_type::terminal_type result_terminal; + typename or_default_result_type::base_type act = {{ result_terminal(get_name(), def_val) }}; + return or_default_result_type(act); + } +}; + +/*! + * The function generates a terminal node in a template expression. The node will extract the value of the attribute + * with the specified name and type. + */ +template< typename AttributeValueT > +BOOST_FORCEINLINE attribute_actor< AttributeValueT > attr(attribute_name const& name) +{ + typedef attribute_actor< AttributeValueT > result_type; + typedef typename result_type::terminal_type result_terminal; + typename result_type::base_type act = {{ result_terminal(name) }}; + return result_type(act); +} + +/*! + * The function generates a terminal node in a template expression. The node will extract the value of the attribute + * with the specified name and type. + */ +template< typename AttributeValueT, typename TagT > +BOOST_FORCEINLINE attribute_actor< AttributeValueT, fallback_to_none, TagT > attr(attribute_name const& name) +{ + typedef attribute_actor< AttributeValueT, fallback_to_none, TagT > result_type; + typedef typename result_type::terminal_type result_terminal; + typename result_type::base_type act = {{ result_terminal(name) }}; + return result_type(act); +} + +} // namespace expressions + +BOOST_LOG_CLOSE_NAMESPACE // namespace log + +#ifndef BOOST_LOG_DOXYGEN_PASS + +namespace phoenix { + +namespace result_of { + +template< typename T, typename FallbackPolicyT, typename TagT > +struct is_nullary< custom_terminal< boost::log::expressions::attribute_terminal< T, FallbackPolicyT, TagT > > > : + public mpl::false_ +{ +}; + +} // namespace result_of + +} // namespace phoenix + +#endif + +} // namespace boost + +#include <boost/log/detail/footer.hpp> +#if defined(BOOST_LOG_EXPRESSIONS_FORMATTERS_STREAM_HPP_INCLUDED_) +#include <boost/log/detail/attr_output_impl.hpp> +#endif + +#endif // BOOST_LOG_EXPRESSIONS_ATTR_HPP_INCLUDED_