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 sources/features.hpp 9 * \author Andrey Semashev 10 * \date 17.07.2009 11 * 12 * The header contains definition of a features list class template. 13 */ 14 15 #ifndef BOOST_LOG_SOURCES_FEATURES_HPP_INCLUDED_ 16 #define BOOST_LOG_SOURCES_FEATURES_HPP_INCLUDED_ 17 18 #include <boost/mpl/lambda.hpp> 19 #include <boost/log/detail/config.hpp> 20 21 #ifdef BOOST_HAS_PRAGMA_ONCE 22 #pragma once 23 #endif 24 25 #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) 26 27 #include <boost/preprocessor/repetition/enum_params.hpp> 28 #include <boost/preprocessor/repetition/enum_binary_params.hpp> 29 #include <boost/preprocessor/repetition/enum_shifted_params.hpp> 30 #include <boost/preprocessor/facilities/intercept.hpp> 31 32 //! The macro defines the maximum number of features that can be specified for a logger 33 #ifndef BOOST_LOG_FEATURES_LIMIT 34 #define BOOST_LOG_FEATURES_LIMIT 10 35 #endif // BOOST_LOG_FEATURES_LIMIT 36 37 #endif 38 39 #include <boost/log/detail/header.hpp> 40 41 namespace boost { 42 43 BOOST_LOG_OPEN_NAMESPACE 44 45 namespace sources { 46 47 #if defined(BOOST_LOG_DOXYGEN_PASS) || !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) 48 49 /*! 50 * \brief A type sequence of logger features 51 * 52 * This class template can be used to specify logger features in a \c basic_composite_logger instantiation. 53 */ 54 template< typename... FeaturesT > 55 struct features 56 { 57 }; 58 59 namespace aux { 60 61 //! The metafunction produces the inherited features hierarchy with \c RootT as the ultimate base type 62 template< typename RootT, typename FeaturesT > 63 struct inherit_features; 64 65 template< typename RootT, typename FeatureT0, typename... FeaturesT > 66 struct inherit_features< RootT, features< FeatureT0, FeaturesT... > > 67 { 68 typedef typename mpl::lambda< 69 FeatureT0 70 >::type::BOOST_NESTED_TEMPLATE apply< 71 typename inherit_features< 72 RootT, 73 features< FeaturesT... > 74 >::type 75 >::type type; 76 }; 77 78 template< typename RootT, typename FeatureT0 > 79 struct inherit_features< RootT, features< FeatureT0 > > 80 { 81 typedef typename mpl::lambda< 82 FeatureT0 83 >::type::BOOST_NESTED_TEMPLATE apply< 84 RootT 85 >::type type; 86 }; 87 88 template< typename RootT > 89 struct inherit_features< RootT, features< > > 90 { 91 typedef RootT type; 92 }; 93 94 } // namespace aux 95 96 #else 97 98 //! A type sequence of logger features 99 template< BOOST_PP_ENUM_BINARY_PARAMS(BOOST_LOG_FEATURES_LIMIT, typename FeatureT, = void BOOST_PP_INTERCEPT) > 100 struct features 101 { 102 }; 103 104 namespace aux { 105 106 template< typename RootT, typename FeaturesT > 107 struct inherit_features; 108 109 template< typename RootT, BOOST_PP_ENUM_PARAMS(BOOST_LOG_FEATURES_LIMIT, typename FeatureT) > 110 struct inherit_features< RootT, features< BOOST_PP_ENUM_PARAMS(BOOST_LOG_FEATURES_LIMIT, FeatureT) > > 111 { 112 typedef typename mpl::lambda< 113 FeatureT0 114 >::type::BOOST_NESTED_TEMPLATE apply< 115 typename inherit_features< 116 RootT, 117 features< BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_LOG_FEATURES_LIMIT, FeatureT) > 118 >::type 119 >::type type; 120 }; 121 122 template< typename RootT, typename FeatureT0 > 123 struct inherit_features< RootT, features< FeatureT0, BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_LOG_FEATURES_LIMIT, void BOOST_PP_INTERCEPT) > > 124 { 125 typedef typename mpl::lambda< 126 FeatureT0 127 >::type::BOOST_NESTED_TEMPLATE apply< 128 RootT 129 >::type type; 130 }; 131 132 template< typename RootT > 133 struct inherit_features< RootT, features< BOOST_PP_ENUM_PARAMS(BOOST_LOG_FEATURES_LIMIT, void BOOST_PP_INTERCEPT) > > 134 { 135 typedef RootT type; 136 }; 137 138 } // namespace aux 139 140 #endif 141 142 } // namespace sources 143 144 BOOST_LOG_CLOSE_NAMESPACE // namespace log 145 146 } // namespace boost 147 148 #include <boost/log/detail/footer.hpp> 149 150 #endif // BOOST_LOG_SOURCES_FEATURES_HPP_INCLUDED_ 151