| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | // Copyright 2019 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_AXIS_METADATA_BASE_HPP#define BOOST_HISTOGRAM_AXIS_METADATA_BASE_HPP#include <boost/core/empty_value.hpp>#include <boost/histogram/detail/relaxed_equal.hpp>#include <boost/histogram/detail/replace_type.hpp>#include <string>#include <type_traits>namespace boost {namespace histogram {namespace axis {/// Meta data holder with space optimization for empty meta data types.template <class Metadata,          class DetailMetadata = detail::replace_default<Metadata, std::string>>class metadata_base : empty_value<DetailMetadata> {  using base_t = empty_value<DetailMetadata>;protected:  using metadata_type = DetailMetadata;  // std::string explicitly guarantees nothrow only in C++17  static_assert(std::is_same<metadata_type, std::string>::value ||                    std::is_nothrow_move_constructible<metadata_type>::value,                "metadata must be nothrow move constructible");  metadata_base() = default;  metadata_base(const metadata_base&) = default;  metadata_base& operator=(const metadata_base&) = default;  // make noexcept because std::string is nothrow move constructible only in C++17  metadata_base(metadata_base&& o) noexcept : base_t(std::move(o)) {}  metadata_base(metadata_type&& o) noexcept : base_t(empty_init_t{}, std::move(o)) {}  // make noexcept because std::string is nothrow move constructible only in C++17  metadata_base& operator=(metadata_base&& o) noexcept {    base_t::operator=(o);    return *this;  }public:  /// Returns reference to metadata.  metadata_type& metadata() noexcept { return base_t::get(); }  /// Returns reference to const metadata.  const metadata_type& metadata() const noexcept { return base_t::get(); }  bool operator==(const metadata_base& o) const noexcept {    return detail::relaxed_equal(metadata(), o.metadata());  }  bool operator!=(const metadata_base& o) const noexcept {    return operator==(o.metadata());  }};} // namespace axis} // namespace histogram} // namespace boost#endif
 |