1///////////////////////////////////////////////////////////////////////////////
2// accumulators_fwd.hpp
3//
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)
7
8#ifndef BOOST_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005
9#define BOOST_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005
10
11#include <boost/config.hpp>
12#include <boost/mpl/apply_fwd.hpp> // for mpl::na
13#include <boost/mpl/limits/vector.hpp>
14#include <boost/preprocessor/cat.hpp>
15#include <boost/preprocessor/arithmetic/inc.hpp>
16#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
17#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
18#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
19#include <boost/preprocessor/repetition/repeat_from_to.hpp>
20#include <boost/accumulators/numeric/functional_fwd.hpp>
21
22#ifndef BOOST_ACCUMULATORS_MAX_FEATURES
23 /// The maximum number of accumulators that may be put in an accumulator_set.
24 /// Defaults to BOOST_MPL_LIMIT_VECTOR_SIZE (which defaults to 20).
25# define BOOST_ACCUMULATORS_MAX_FEATURES BOOST_MPL_LIMIT_VECTOR_SIZE
26#endif
27
28#if BOOST_ACCUMULATORS_MAX_FEATURES > BOOST_MPL_LIMIT_VECTOR_SIZE
29# error BOOST_ACCUMULATORS_MAX_FEATURES cannot be larger than BOOST_MPL_LIMIT_VECTOR_SIZE
30#endif
31
32#ifndef BOOST_ACCUMULATORS_MAX_ARGS
33 /// The maximum number of arguments that may be specified to an accumulator_set's
34 /// accumulation function. Defaults to 15.
35# define BOOST_ACCUMULATORS_MAX_ARGS 15
36#endif
37
38#if BOOST_WORKAROUND(__GNUC__, == 3) \
39 || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(306))
40# define BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS
41#endif
42
43#ifdef BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS
44# include <boost/utility/enable_if.hpp>
45# include <boost/type_traits/is_const.hpp>
46# define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T)\
47 , typename boost::disable_if<boost::is_const<T> >::type * = 0
48#else
49# define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T)
50#endif
51
52#define BOOST_ACCUMULATORS_GCC_VERSION \
53 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
54
55namespace boost { namespace accumulators
56{
57
58///////////////////////////////////////////////////////////////////////////////
59// Named parameters tags
60//
61namespace tag
62{
63 struct sample;
64 struct weight;
65 struct accumulator;
66 struct weights;
67}
68
69///////////////////////////////////////////////////////////////////////////////
70// User-level features
71//
72namespace tag
73{
74 template<typename ValueType, typename Tag>
75 struct value;
76
77 template<typename Tag>
78 struct value_tag;
79
80 template<typename Referent, typename Tag>
81 struct reference;
82
83 template<typename Tag>
84 struct reference_tag;
85
86 template<typename Type, typename Tag = void, typename AccumulatorSet = void>
87 struct external;
88
89 template<typename Feature>
90 struct droppable;
91}
92
93template<typename Accumulator>
94struct droppable_accumulator_base;
95
96template<typename Accumulator>
97struct droppable_accumulator;
98
99template<typename Accumulator>
100struct with_cached_result;
101
102template<typename Sample, typename Features, typename Weight = void>
103struct accumulator_set;
104
105template<typename Feature>
106struct extractor;
107
108template<typename Feature>
109struct feature_of;
110
111template<typename Feature>
112struct as_feature;
113
114template<typename Feature>
115struct as_weighted_feature;
116
117template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_ACCUMULATORS_MAX_FEATURES, typename Feature, mpl::na)>
118struct depends_on;
119
120template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_ACCUMULATORS_MAX_FEATURES, typename Feature, mpl::na)>
121struct features;
122
123template<typename Feature, typename AccumulatorSet>
124typename mpl::apply<AccumulatorSet, Feature>::type const &
125find_accumulator(AccumulatorSet const &acc);
126
127template<typename Feature, typename AccumulatorSet>
128typename mpl::apply<AccumulatorSet, Feature>::type::result_type
129extract_result(AccumulatorSet const &acc);
130
131template<typename Feature, typename AccumulatorSet, typename A1>
132typename mpl::apply<AccumulatorSet, Feature>::type::result_type
133extract_result(AccumulatorSet const &acc, A1 const &a1);
134
135// ... other overloads generated by Boost.Preprocessor:
136
137/// INTERNAL ONLY
138///
139#define BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD(z, n, _) \
140 template< \
141 typename Feature \
142 , typename AccumulatorSet \
143 BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, typename A) \
144 > \
145 typename mpl::apply<AccumulatorSet, Feature>::type::result_type \
146 extract_result( \
147 AccumulatorSet const &acc \
148 BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, n, A, const &a) \
149 );
150
151/// INTERNAL ONLY
152///
153BOOST_PP_REPEAT_FROM_TO(
154 2
155 , BOOST_PP_INC(BOOST_ACCUMULATORS_MAX_ARGS)
156 , BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD
157 , _
158)
159
160#ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED
161template<typename Feature, typename AccumulatorSet, typename A1, typename A2 ...>
162typename mpl::apply<AccumulatorSet, Feature>::type::result_type
163extract_result(AccumulatorSet const &acc, A1 const &a1, A2 const &a2 ...);
164#endif
165
166namespace impl
167{
168 using namespace numeric::operators;
169
170 template<typename Accumulator, typename Tag>
171 struct external_impl;
172}
173
174namespace detail
175{
176 template<typename Accumulator>
177 struct feature_tag;
178
179 template<typename Feature, typename Sample, typename Weight>
180 struct to_accumulator;
181
182 struct accumulator_set_base;
183
184 template<typename T>
185 struct is_accumulator_set;
186
187 inline void ignore_variable(void const *) {}
188
189#define BOOST_ACCUMULATORS_IGNORE_GLOBAL(X) \
190 namespace detail \
191 { \
192 struct BOOST_PP_CAT(ignore_, X) \
193 { \
194 void ignore() \
195 { \
196 boost::accumulators::detail::ignore_variable(&X); \
197 } \
198 }; \
199 } \
200 /**/
201}
202
203}} // namespace boost::accumulators
204
205// For defining boost::parameter keywords that can be inherited from to
206// get a nested, class-scoped keyword with the requested alias
207#define BOOST_PARAMETER_NESTED_KEYWORD(tag_namespace, name, alias) \
208 namespace tag_namespace \
209 { \
210 template<int Dummy = 0> \
211 struct name ## _ \
212 { \
213 static char const* keyword_name() \
214 { \
215 return #name; \
216 } \
217 static ::boost::parameter::keyword<name ## _<Dummy> > &alias; \
218 }; \
219 template<int Dummy> \
220 ::boost::parameter::keyword<name ## _<Dummy> > &name ## _<Dummy>::alias = \
221 ::boost::parameter::keyword<name ## _<Dummy> >::get(); \
222 typedef name ## _ <> name; \
223 } \
224 namespace \
225 { \
226 ::boost::parameter::keyword<tag_namespace::name> &name = \
227 ::boost::parameter::keyword<tag_namespace::name>::get(); \
228 }
229
230#endif
231

source code of boost/boost/accumulators/accumulators_fwd.hpp