1 ///////////////////////////////////////////////////////////////////////////////
2 // accumulators_fwd.hpp
4 // Copyright 2005 Eric Niebler. Distributed under the Boost
5 // Software License, Version 1.0. (See accompanying file
6 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 #ifndef BOOST_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005
9 #define BOOST_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005
11 #include <boost/config.hpp>
12 #include <boost/core/enable_if.hpp>
13 #include <boost/parameter/is_argument_pack.hpp>
14 #include <boost/mpl/apply_fwd.hpp> // for mpl::na
15 #include <boost/mpl/limits/vector.hpp>
16 #include <boost/preprocessor/cat.hpp>
17 #include <boost/preprocessor/arithmetic/inc.hpp>
18 #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
19 #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
20 #include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
21 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
22 #include <boost/accumulators/numeric/functional_fwd.hpp>
24 #ifndef BOOST_ACCUMULATORS_MAX_FEATURES
25 /// The maximum number of accumulators that may be put in an accumulator_set.
26 /// Defaults to BOOST_MPL_LIMIT_VECTOR_SIZE (which defaults to 20).
27 # define BOOST_ACCUMULATORS_MAX_FEATURES BOOST_MPL_LIMIT_VECTOR_SIZE
30 #if BOOST_ACCUMULATORS_MAX_FEATURES > BOOST_MPL_LIMIT_VECTOR_SIZE
31 # error BOOST_ACCUMULATORS_MAX_FEATURES cannot be larger than BOOST_MPL_LIMIT_VECTOR_SIZE
34 #ifndef BOOST_ACCUMULATORS_MAX_ARGS
35 /// The maximum number of arguments that may be specified to an accumulator_set's
36 /// accumulation function. Defaults to 15.
37 # define BOOST_ACCUMULATORS_MAX_ARGS 15
40 #if BOOST_WORKAROUND(__GNUC__, == 3) \
41 || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(306))
42 # define BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS
45 #ifdef BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS
46 # include <boost/type_traits/is_const.hpp>
47 # define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T)\
48 , typename boost::disable_if<boost::is_const<T> >::type * = 0
50 # define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T)
53 #define BOOST_ACCUMULATORS_GCC_VERSION \
54 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
56 namespace boost { namespace accumulators
59 ///////////////////////////////////////////////////////////////////////////////
60 // Named parameters tags
70 ///////////////////////////////////////////////////////////////////////////////
71 // User-level features
75 template<typename ValueType, typename Tag>
78 template<typename Tag>
81 template<typename Referent, typename Tag>
84 template<typename Tag>
87 template<typename Type, typename Tag = void, typename AccumulatorSet = void>
90 template<typename Feature>
94 template<typename Accumulator>
95 struct droppable_accumulator_base;
97 template<typename Accumulator>
98 struct droppable_accumulator;
100 template<typename Accumulator>
101 struct with_cached_result;
103 template<typename Sample, typename Features, typename Weight = void>
104 struct accumulator_set;
106 template<typename Feature>
109 template<typename Feature>
112 template<typename Feature>
115 template<typename Feature>
116 struct as_weighted_feature;
118 template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_ACCUMULATORS_MAX_FEATURES, typename Feature, mpl::na)>
121 template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_ACCUMULATORS_MAX_FEATURES, typename Feature, mpl::na)>
124 template<typename Feature, typename AccumulatorSet>
125 typename mpl::apply<AccumulatorSet, Feature>::type const &
126 find_accumulator(AccumulatorSet const &acc);
128 template<typename Feature, typename AccumulatorSet>
129 typename mpl::apply<AccumulatorSet, Feature>::type::result_type
130 extract_result(AccumulatorSet const &acc);
139 // ... other overloads generated by Boost.Preprocessor:
143 #define BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD(z, n, _) \
146 , typename AccumulatorSet \
147 BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, typename A) \
149 typename mpl::apply<AccumulatorSet, Feature>::type::result_type \
151 AccumulatorSet const &acc \
152 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, n, A, const &a) \
153 , typename boost::enable_if< \
154 parameter::is_argument_pack<A0> \
156 >::type = detail::_enabler() \
160 , typename AccumulatorSet \
161 BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, typename A) \
163 typename mpl::apply<AccumulatorSet, Feature>::type::result_type \
165 AccumulatorSet const &acc \
166 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, n, A, const &a) \
167 , typename boost::disable_if< \
168 parameter::is_argument_pack<A0> \
170 >::type = detail::_enabler() \
175 BOOST_PP_REPEAT_FROM_TO(
177 , BOOST_PP_INC(BOOST_ACCUMULATORS_MAX_ARGS)
178 , BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD
182 #undef BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD
184 #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED
185 template<typename Feature, typename AccumulatorSet, typename A1, typename A2 ...>
186 typename mpl::apply<AccumulatorSet, Feature>::type::result_type
187 extract_result(AccumulatorSet const &acc, A1 const &a1, A2 const &a2 ...);
192 using namespace numeric::operators;
194 template<typename Accumulator, typename Tag>
195 struct external_impl;
200 template<typename Accumulator>
203 template<typename Feature, typename Sample, typename Weight>
204 struct to_accumulator;
206 struct accumulator_set_base;
209 struct is_accumulator_set;
211 inline void ignore_variable(void const *) {}
214 }} // namespace boost::accumulators
216 #define BOOST_ACCUMULATORS_IGNORE_GLOBAL(X) \
219 struct BOOST_PP_CAT(ignore_, X) \
223 boost::accumulators::detail::ignore_variable(&X); \
229 #include <boost/parameter/nested_keyword.hpp>
231 #endif // include guard