Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // accumulators_fwd.hpp Chris@16: // Chris@16: // Copyright 2005 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005 Chris@16: #define BOOST_ACCUMULATORS_ACCUMULATORS_FWD_HPP_EAN_28_10_2005 Chris@16: Chris@16: #include Chris@16: #include // for mpl::na Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #ifndef BOOST_ACCUMULATORS_MAX_FEATURES Chris@16: /// The maximum number of accumulators that may be put in an accumulator_set. Chris@16: /// Defaults to BOOST_MPL_LIMIT_VECTOR_SIZE (which defaults to 20). Chris@16: # define BOOST_ACCUMULATORS_MAX_FEATURES BOOST_MPL_LIMIT_VECTOR_SIZE Chris@16: #endif Chris@16: Chris@16: #if BOOST_ACCUMULATORS_MAX_FEATURES > BOOST_MPL_LIMIT_VECTOR_SIZE Chris@16: # error BOOST_ACCUMULATORS_MAX_FEATURES cannot be larger than BOOST_MPL_LIMIT_VECTOR_SIZE Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ACCUMULATORS_MAX_ARGS Chris@16: /// The maximum number of arguments that may be specified to an accumulator_set's Chris@16: /// accumulation function. Defaults to 15. Chris@16: # define BOOST_ACCUMULATORS_MAX_ARGS 15 Chris@16: #endif Chris@16: Chris@16: #if BOOST_WORKAROUND(__GNUC__, == 3) \ Chris@16: || BOOST_WORKAROUND(__EDG_VERSION__, BOOST_TESTED_AT(306)) Chris@16: # define BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_ACCUMULATORS_BROKEN_CONST_OVERLOADS Chris@16: # include Chris@16: # include Chris@16: # define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T)\ Chris@16: , typename boost::disable_if >::type * = 0 Chris@16: #else Chris@16: # define BOOST_ACCUMULATORS_PROTO_DISABLE_IF_IS_CONST(T) Chris@16: #endif Chris@16: Chris@16: #define BOOST_ACCUMULATORS_GCC_VERSION \ Chris@16: (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) Chris@16: Chris@16: namespace boost { namespace accumulators Chris@16: { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Named parameters tags Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: struct sample; Chris@16: struct weight; Chris@16: struct accumulator; Chris@16: struct weights; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // User-level features Chris@16: // Chris@16: namespace tag Chris@16: { Chris@16: template Chris@16: struct value; Chris@16: Chris@16: template Chris@16: struct value_tag; Chris@16: Chris@16: template Chris@16: struct reference; Chris@16: Chris@16: template Chris@16: struct reference_tag; Chris@16: Chris@16: template Chris@16: struct external; Chris@16: Chris@16: template Chris@16: struct droppable; Chris@16: } Chris@16: Chris@16: template Chris@16: struct droppable_accumulator_base; Chris@16: Chris@16: template Chris@16: struct droppable_accumulator; Chris@16: Chris@16: template Chris@16: struct with_cached_result; Chris@16: Chris@16: template Chris@16: struct accumulator_set; Chris@16: Chris@16: template Chris@16: struct extractor; Chris@16: Chris@16: template Chris@16: struct feature_of; Chris@16: Chris@16: template Chris@16: struct as_feature; Chris@16: Chris@16: template Chris@16: struct as_weighted_feature; Chris@16: Chris@16: template Chris@16: struct depends_on; Chris@16: Chris@16: template Chris@16: struct features; Chris@16: Chris@16: template Chris@16: typename mpl::apply::type const & Chris@16: find_accumulator(AccumulatorSet const &acc); Chris@16: Chris@16: template Chris@16: typename mpl::apply::type::result_type Chris@16: extract_result(AccumulatorSet const &acc); Chris@16: Chris@16: template Chris@16: typename mpl::apply::type::result_type Chris@16: extract_result(AccumulatorSet const &acc, A1 const &a1); Chris@16: Chris@16: // ... other overloads generated by Boost.Preprocessor: Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: #define BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD(z, n, _) \ Chris@16: template< \ Chris@16: typename Feature \ Chris@16: , typename AccumulatorSet \ Chris@16: BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, typename A) \ Chris@16: > \ Chris@16: typename mpl::apply::type::result_type \ Chris@16: extract_result( \ Chris@16: AccumulatorSet const &acc \ Chris@16: BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, n, A, const &a) \ Chris@16: ); Chris@16: Chris@16: /// INTERNAL ONLY Chris@16: /// Chris@16: BOOST_PP_REPEAT_FROM_TO( Chris@16: 2 Chris@16: , BOOST_PP_INC(BOOST_ACCUMULATORS_MAX_ARGS) Chris@16: , BOOST_ACCUMULATORS_EXTRACT_RESULT_FWD Chris@16: , _ Chris@16: ) Chris@16: Chris@16: #ifdef BOOST_ACCUMULATORS_DOXYGEN_INVOKED Chris@16: template Chris@16: typename mpl::apply::type::result_type Chris@16: extract_result(AccumulatorSet const &acc, A1 const &a1, A2 const &a2 ...); Chris@16: #endif Chris@16: Chris@16: namespace impl Chris@16: { Chris@16: using namespace numeric::operators; Chris@16: Chris@16: template Chris@16: struct external_impl; Chris@16: } Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct feature_tag; Chris@16: Chris@16: template Chris@16: struct to_accumulator; Chris@16: Chris@16: struct accumulator_set_base; Chris@16: Chris@16: template Chris@16: struct is_accumulator_set; Chris@16: Chris@16: inline void ignore_variable(void const *) {} Chris@16: Chris@16: #define BOOST_ACCUMULATORS_IGNORE_GLOBAL(X) \ Chris@16: namespace detail \ Chris@16: { \ Chris@16: struct BOOST_PP_CAT(ignore_, X) \ Chris@16: { \ Chris@16: void ignore() \ Chris@16: { \ Chris@16: boost::accumulators::detail::ignore_variable(&X); \ Chris@16: } \ Chris@16: }; \ Chris@16: } \ Chris@16: /**/ Chris@16: } Chris@16: Chris@16: }} // namespace boost::accumulators Chris@16: Chris@16: // For defining boost::parameter keywords that can be inherited from to Chris@16: // get a nested, class-scoped keyword with the requested alias Chris@16: #define BOOST_PARAMETER_NESTED_KEYWORD(tag_namespace, name, alias) \ Chris@16: namespace tag_namespace \ Chris@16: { \ Chris@16: template \ Chris@16: struct name ## _ \ Chris@16: { \ Chris@16: static char const* keyword_name() \ Chris@16: { \ Chris@16: return #name; \ Chris@16: } \ Chris@16: static ::boost::parameter::keyword > &alias; \ Chris@16: }; \ Chris@16: template \ Chris@16: ::boost::parameter::keyword > &name ## _::alias = \ Chris@16: ::boost::parameter::keyword >::get(); \ Chris@16: typedef name ## _ <> name; \ Chris@16: } \ Chris@16: namespace \ Chris@16: { \ Chris@16: ::boost::parameter::keyword &name = \ Chris@16: ::boost::parameter::keyword::get(); \ Chris@16: } Chris@16: Chris@16: #endif