From 371cbc9385f67342c73c92323f5115699ca7aec7 Mon Sep 17 00:00:00 2001 From: Hans Dembinski Date: Sun, 5 Nov 2017 22:18:58 +0100 Subject: [PATCH] support multiply and test it --- .../histogram/histogram_impl_dynamic.hpp | 8 +++---- .../boost/histogram/histogram_impl_static.hpp | 10 ++++++--- .../histogram/storage/adaptive_storage.hpp | 8 ------- test/adaptive_storage_test.cpp | 21 +++++++++++++++++++ test/array_storage_test.cpp | 21 +++++++++++++++++++ 5 files changed, 53 insertions(+), 15 deletions(-) diff --git a/include/boost/histogram/histogram_impl_dynamic.hpp b/include/boost/histogram/histogram_impl_dynamic.hpp index 596fa6bd..f7d69c7a 100644 --- a/include/boost/histogram/histogram_impl_dynamic.hpp +++ b/include/boost/histogram/histogram_impl_dynamic.hpp @@ -124,7 +124,7 @@ public: return *this; } - template void fill(Args &&... args) noexcept { + template void fill(Args &&... args) { using n_count = typename mpl::count, count>; using n_weight = typename mpl::count, weight>; static_assert( @@ -138,7 +138,7 @@ public: } template > - void fill(Iterator begin, Iterator end) noexcept { + void fill(Iterator begin, Iterator end) { BOOST_ASSERT_MSG(std::distance(begin, end) == dim(), "number of arguments does not match histogram dimension"); std::size_t idx = 0, stride = 1; @@ -149,7 +149,7 @@ public: } template > - void fill(Iterator begin, Iterator end, const count n) noexcept { + void fill(Iterator begin, Iterator end, const count n) { BOOST_ASSERT_MSG(std::distance(begin, end) == dim(), "number of arguments does not match histogram dimension"); std::size_t idx = 0, stride = 1; @@ -160,7 +160,7 @@ public: } template > - void fill(Iterator begin, Iterator end, const weight w) noexcept { + void fill(Iterator begin, Iterator end, const weight w) { BOOST_ASSERT_MSG(std::distance(begin, end) == dim(), "number of arguments does not match histogram dimension"); std::size_t idx = 0, stride = 1; diff --git a/include/boost/histogram/histogram_impl_static.hpp b/include/boost/histogram/histogram_impl_static.hpp index ddd4cd7b..e2072a59 100644 --- a/include/boost/histogram/histogram_impl_static.hpp +++ b/include/boost/histogram/histogram_impl_static.hpp @@ -93,13 +93,17 @@ public: template histogram &operator+=(const histogram &rhs) { - if (!detail::axes_equal(axes_, rhs.axes_)) { + if (!detail::axes_equal(axes_, rhs.axes_)) throw std::logic_error("axes of histograms differ"); - } storage_ += rhs.storage_; return *this; } + histogram &operator*=(const value_type rhs) { + storage_ *= rhs; + return *this; + } + template void fill(Args &&... args) { using n_count = typename mpl::count, count>; using n_weight = typename mpl::count, weight>; @@ -152,7 +156,7 @@ public: } /// Reset bin counters to zero - void reset() { storage_ = std::move(Storage(storage_.size())); } + void reset() { storage_ = Storage(storage_.size()); } /// Get N-th axis template diff --git a/include/boost/histogram/storage/adaptive_storage.hpp b/include/boost/histogram/storage/adaptive_storage.hpp index 5b3e6295..4f78ae1c 100644 --- a/include/boost/histogram/storage/adaptive_storage.hpp +++ b/include/boost/histogram/storage/adaptive_storage.hpp @@ -165,14 +165,6 @@ inline bool safe_radd(T& t, const double u) { return true; } -template -inline bool safe_rmul(T& t, const uint64_t x) { - if ((x * t) > std::numeric_limits::max()) - return false; - t *= x; - return true; -} - struct size_visitor : public static_visitor { template std::size_t operator()(const Array &b) const { return b.size; diff --git a/test/adaptive_storage_test.cpp b/test/adaptive_storage_test.cpp index 868bdda4..4dc8a862 100644 --- a/test/adaptive_storage_test.cpp +++ b/test/adaptive_storage_test.cpp @@ -374,6 +374,27 @@ int main() { } } + // multiply + { + adaptive_storage a(2); + a.increase(0); + a *= 3; + BOOST_TEST_EQ(a.value(0), 3.0); + BOOST_TEST_EQ(a.variance(0), 3.0); + BOOST_TEST_EQ(a.value(1), 0.0); + BOOST_TEST_EQ(a.variance(1), 0.0); + a.add(1, 2.0, 5.0); + BOOST_TEST_EQ(a.value(0), 3.0); + BOOST_TEST_EQ(a.variance(0), 3.0); + BOOST_TEST_EQ(a.value(1), 2.0); + BOOST_TEST_EQ(a.variance(1), 5.0); + a *= 3; + BOOST_TEST_EQ(a.value(0), 9.0); + BOOST_TEST_EQ(a.variance(0), 9.0); + BOOST_TEST_EQ(a.value(1), 6.0); + BOOST_TEST_EQ(a.variance(1), 15.0); + } + // convert_array_storage { convert_array_storage_impl(); diff --git a/test/array_storage_test.cpp b/test/array_storage_test.cpp index 4a86b30a..51db0928 100644 --- a/test/array_storage_test.cpp +++ b/test/array_storage_test.cpp @@ -47,6 +47,27 @@ int main() { BOOST_TEST(!(a == d)); } + // multiply + { + array_storage a(2); + a.increase(0); + a *= 3; + BOOST_TEST_EQ(a.value(0), 3.0); + BOOST_TEST_EQ(a.variance(0), 3.0); + BOOST_TEST_EQ(a.value(1), 0.0); + BOOST_TEST_EQ(a.variance(1), 0.0); + a.add(1, 2.0, 5.0); // 5.0 is intentionally ignored + BOOST_TEST_EQ(a.value(0), 3.0); + BOOST_TEST_EQ(a.variance(0), 3.0); + BOOST_TEST_EQ(a.value(1), 2.0); + BOOST_TEST_EQ(a.variance(1), 2.0); + a *= 3; + BOOST_TEST_EQ(a.value(0), 9.0); + BOOST_TEST_EQ(a.variance(0), 9.0); + BOOST_TEST_EQ(a.value(1), 6.0); + BOOST_TEST_EQ(a.variance(1), 6.0); + } + // copy { array_storage a(1);