diff --git a/include/boost/histogram/accumulators/mean.hpp b/include/boost/histogram/accumulators/mean.hpp index 94e2bbfa..750f2d7a 100644 --- a/include/boost/histogram/accumulators/mean.hpp +++ b/include/boost/histogram/accumulators/mean.hpp @@ -152,6 +152,8 @@ public: } private: + friend struct unsafe_access; + internal_data_type data_{0, 0, 0}; }; diff --git a/include/boost/histogram/unsafe_access.hpp b/include/boost/histogram/unsafe_access.hpp index 1fff4c0f..2f3a7b11 100644 --- a/include/boost/histogram/unsafe_access.hpp +++ b/include/boost/histogram/unsafe_access.hpp @@ -110,6 +110,15 @@ struct unsafe_access { static constexpr auto& storage_adaptor_impl(storage_adaptor& storage) { return static_cast::impl_type&>(storage); } + + /** + Get internal data of accumulators::mean. + @param obj instance of accumulator. + */ + template + static constexpr auto& accumulators_mean_impl(T&& m) { + return m.data_; + } }; } // namespace histogram diff --git a/test/accumulators_mean_test.cpp b/test/accumulators_mean_test.cpp index f7fe938a..6e96287b 100644 --- a/test/accumulators_mean_test.cpp +++ b/test/accumulators_mean_test.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include "is_close.hpp" @@ -110,5 +111,16 @@ int main() { BOOST_TEST_IS_CLOSE(a.variance(), b.variance(), 1e-3); } + // unsafe_access + { + m_t a; + a(1); + a(2); + + BOOST_TEST_EQ(a.count(), 2); + unsafe_access::accumulators_mean(a).sum_ = 1; + BOOST_TEST_EQ(a.count(), 1); + } + return boost::report_errors(); }