123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #ifndef BOOST_HISTOGRAM_AXIS_METADATA_BASE_HPP
- #define BOOST_HISTOGRAM_AXIS_METADATA_BASE_HPP
- #include <boost/histogram/axis/traits.hpp>
- #include <boost/histogram/detail/replace_type.hpp>
- #include <string>
- #include <type_traits>
- namespace boost {
- namespace histogram {
- namespace axis {
- template <class Metadata, bool Detail>
- class metadata_base {
- protected:
- using metadata_type = Metadata;
-
- 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;
-
- metadata_base(metadata_base&& o) noexcept : data_(std::move(o.data_)) {}
- metadata_base(metadata_type&& o) noexcept : data_(std::move(o)) {}
-
- metadata_base& operator=(metadata_base&& o) noexcept {
- data_ = std::move(o.data_);
- return *this;
- }
- private:
- mutable metadata_type data_;
- public:
-
- metadata_type& metadata() noexcept { return data_; }
-
- metadata_type& metadata() const noexcept { return data_; }
- };
- #ifndef BOOST_HISTOGRAM_DOXYGEN_INVOKED
- template <class Metadata>
- class metadata_base<Metadata, true> {
- protected:
- using metadata_type = Metadata;
- metadata_base() = default;
- metadata_base(metadata_type&&) {}
- metadata_base& operator=(metadata_type&&) { return *this; }
- public:
- metadata_type& metadata() noexcept {
- return static_cast<const metadata_base&>(*this).metadata();
- }
- metadata_type& metadata() const noexcept {
- static metadata_type data;
- return data;
- }
- };
- template <class Metadata, class Detail = detail::replace_default<Metadata, std::string>>
- using metadata_base_t =
- metadata_base<Detail, (std::is_empty<Detail>::value && std::is_final<Detail>::value)>;
- #endif
- }
- }
- }
- #endif
|