/* * 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 sources/features.hpp * \author Andrey Semashev * \date 17.07.2009 * * The header contains definition of a features list class template. */ #ifndef BOOST_LOG_SOURCES_FEATURES_HPP_INCLUDED_ #define BOOST_LOG_SOURCES_FEATURES_HPP_INCLUDED_ #include #include #ifdef BOOST_HAS_PRAGMA_ONCE #pragma once #endif #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) #include #include #include #include //! The macro defines the maximum number of features that can be specified for a logger #ifndef BOOST_LOG_FEATURES_LIMIT #define BOOST_LOG_FEATURES_LIMIT 10 #endif // BOOST_LOG_FEATURES_LIMIT #endif #include namespace boost { BOOST_LOG_OPEN_NAMESPACE namespace sources { #if defined(BOOST_LOG_DOXYGEN_PASS) || !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) /*! * \brief A type sequence of logger features * * This class template can be used to specify logger features in a \c basic_composite_logger instantiation. */ template< typename... FeaturesT > struct features { }; namespace aux { //! The metafunction produces the inherited features hierarchy with \c RootT as the ultimate base type template< typename RootT, typename FeaturesT > struct inherit_features; template< typename RootT, typename FeatureT0, typename... FeaturesT > struct inherit_features< RootT, features< FeatureT0, FeaturesT... > > { typedef typename mpl::lambda< FeatureT0 >::type::BOOST_NESTED_TEMPLATE apply< typename inherit_features< RootT, features< FeaturesT... > >::type >::type type; }; template< typename RootT, typename FeatureT0 > struct inherit_features< RootT, features< FeatureT0 > > { typedef typename mpl::lambda< FeatureT0 >::type::BOOST_NESTED_TEMPLATE apply< RootT >::type type; }; template< typename RootT > struct inherit_features< RootT, features< > > { typedef RootT type; }; } // namespace aux #else //! A type sequence of logger features template< BOOST_PP_ENUM_BINARY_PARAMS(BOOST_LOG_FEATURES_LIMIT, typename FeatureT, = void BOOST_PP_INTERCEPT) > struct features { }; namespace aux { template< typename RootT, typename FeaturesT > struct inherit_features; template< typename RootT, BOOST_PP_ENUM_PARAMS(BOOST_LOG_FEATURES_LIMIT, typename FeatureT) > struct inherit_features< RootT, features< BOOST_PP_ENUM_PARAMS(BOOST_LOG_FEATURES_LIMIT, FeatureT) > > { typedef typename mpl::lambda< FeatureT0 >::type::BOOST_NESTED_TEMPLATE apply< typename inherit_features< RootT, features< BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_LOG_FEATURES_LIMIT, FeatureT) > >::type >::type type; }; template< typename RootT, typename FeatureT0 > struct inherit_features< RootT, features< FeatureT0, BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_LOG_FEATURES_LIMIT, void BOOST_PP_INTERCEPT) > > { typedef typename mpl::lambda< FeatureT0 >::type::BOOST_NESTED_TEMPLATE apply< RootT >::type type; }; template< typename RootT > struct inherit_features< RootT, features< BOOST_PP_ENUM_PARAMS(BOOST_LOG_FEATURES_LIMIT, void BOOST_PP_INTERCEPT) > > { typedef RootT type; }; } // namespace aux #endif } // namespace sources BOOST_LOG_CLOSE_NAMESPACE // namespace log } // namespace boost #include #endif // BOOST_LOG_SOURCES_FEATURES_HPP_INCLUDED_