| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | // Copyright 2015-2017 Hans Dembinski//// 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_HISTOGRAM_ACCUMULATORS_OSTREAM_HPP#define BOOST_HISTOGRAM_ACCUMULATORS_OSTREAM_HPP#include <boost/histogram/detail/counting_streambuf.hpp>#include <boost/histogram/fwd.hpp>#include <ios>/**  \file boost/histogram/accumulators/ostream.hpp  Simple streaming operators for the builtin accumulator types.  The text representation is not guaranteed to be stable between versions of  Boost.Histogram. This header is only included by  [boost/histogram/ostream.hpp](histogram/reference.html#header.boost.histogram.ostream_hpp).  To you use your own, include your own implementation instead of this header and do not  include  [boost/histogram/ostream.hpp](histogram/reference.html#header.boost.histogram.ostream_hpp). */#ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKEDnamespace boost {namespace histogram {namespace detail {template <class CharT, class Traits, class T>std::basic_ostream<CharT, Traits>& handle_nonzero_width(    std::basic_ostream<CharT, Traits>& os, const T& x) {  const auto w = os.width();  os.width(0);  counting_streambuf<CharT, Traits> cb;  const auto saved = os.rdbuf(&cb);  os << x;  os.rdbuf(saved);  if (os.flags() & std::ios::left) {    os << x;    for (auto i = cb.count; i < w; ++i) os << os.fill();  } else {    for (auto i = cb.count; i < w; ++i) os << os.fill();    os << x;  }  return os;}} // namespace detailnamespace accumulators {template <class CharT, class Traits, class U>std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,                                              const count<U>& x) {  return os << x.value();}template <class CharT, class Traits, class U>std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,                                              const sum<U>& x) {  if (os.width() == 0) return os << "sum(" << x.large() << " + " << x.small() << ")";  return detail::handle_nonzero_width(os, x);}template <class CharT, class Traits, class U>std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,                                              const weighted_sum<U>& x) {  if (os.width() == 0)    return os << "weighted_sum(" << x.value() << ", " << x.variance() << ")";  return detail::handle_nonzero_width(os, x);}template <class CharT, class Traits, class U>std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,                                              const mean<U>& x) {  if (os.width() == 0)    return os << "mean(" << x.count() << ", " << x.value() << ", " << x.variance() << ")";  return detail::handle_nonzero_width(os, x);}template <class CharT, class Traits, class U>std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,                                              const weighted_mean<U>& x) {  if (os.width() == 0)    return os << "weighted_mean(" << x.sum_of_weights() << ", " << x.value() << ", "              << x.variance() << ")";  return detail::handle_nonzero_width(os, x);}template <class CharT, class Traits, class T>std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os,                                              const thread_safe<T>& x) {  os << x.load();  return os;}} // namespace accumulators} // namespace histogram} // namespace boost#endif // BOOST_HISTOGRAM_DOXYGEN_INVOKED#endif
 |