| /////////////////////////////////////////////////////////////////////////////// |
| // reference_accumulator.hpp |
| // |
| // Copyright 2005 Eric Niebler. 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) |
| |
| #ifndef BOOST_ACCUMULATORS_FRAMEWORK_ACCUMULATORS_REFERENCE_ACCUMULATOR_HPP_EAN_03_23_2006 |
| #define BOOST_ACCUMULATORS_FRAMEWORK_ACCUMULATORS_REFERENCE_ACCUMULATOR_HPP_EAN_03_23_2006 |
| |
| #include <boost/ref.hpp> |
| #include <boost/mpl/always.hpp> |
| #include <boost/parameter/keyword.hpp> |
| #include <boost/accumulators/framework/depends_on.hpp> // for feature_tag |
| #include <boost/accumulators/framework/accumulator_base.hpp> |
| #include <boost/accumulators/framework/extractor.hpp> |
| |
| namespace boost { namespace accumulators |
| { |
| |
| namespace impl |
| { |
| ////////////////////////////////////////////////////////////////////////// |
| // reference_accumulator_impl |
| // |
| template<typename Referent, typename Tag> |
| struct reference_accumulator_impl |
| : accumulator_base |
| { |
| typedef Referent &result_type; |
| |
| template<typename Args> |
| reference_accumulator_impl(Args const &args) |
| : ref(args[parameter::keyword<Tag>::get()]) |
| { |
| } |
| |
| result_type result(dont_care) const |
| { |
| return this->ref; |
| } |
| |
| private: |
| reference_wrapper<Referent> ref; |
| }; |
| } // namespace impl |
| |
| namespace tag |
| { |
| ////////////////////////////////////////////////////////////////////////// |
| // reference_tag |
| template<typename Tag> |
| struct reference_tag |
| { |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////// |
| // reference |
| template<typename Referent, typename Tag> |
| struct reference |
| : depends_on<> |
| { |
| /// INTERNAL ONLY |
| /// |
| typedef mpl::always<accumulators::impl::reference_accumulator_impl<Referent, Tag> > impl; |
| }; |
| } |
| |
| namespace extract |
| { |
| BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, reference, (typename)(typename)) |
| BOOST_ACCUMULATORS_DEFINE_EXTRACTOR(tag, reference_tag, (typename)) |
| } |
| |
| using extract::reference; |
| using extract::reference_tag; |
| |
| // Map all reference<V,T> features to reference_tag<T> so |
| // that references can be extracted using reference_tag<T> |
| // without specifying the referent type. |
| template<typename ValueType, typename Tag> |
| struct feature_of<tag::reference<ValueType, Tag> > |
| : feature_of<tag::reference_tag<Tag> > |
| { |
| }; |
| |
| }} // namespace boost::accumulators |
| |
| #endif |