// Copyright 2018 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_DETAIL_COMPRESSED_PAIR_HPP #define BOOST_HISTOGRAM_DETAIL_COMPRESSED_PAIR_HPP #include #include namespace boost { namespace histogram { namespace detail { template class compressed_pair_impl; template class compressed_pair_impl : protected T2 { public: template compressed_pair_impl(U1&& u1, U2&& u2) : T2(std::forward(u2)), first_(std::forward(u1)) {} template compressed_pair_impl(U1&& u1) : first_(std::forward(u1)) {} compressed_pair_impl() = default; T1& first() { return first_; } T2& second() { return static_cast(*this); } const T1& first() const { return first_; } const T2& second() const { return static_cast(*this); } private: T1 first_; }; template class compressed_pair_impl { public: template compressed_pair_impl(U1&& u1, U2&& u2) : first_(std::forward(u1)), second_(std::forward(u2)) {} template compressed_pair_impl(U1&& u1) : first_(std::forward(u1)) {} compressed_pair_impl() = default; T1& first() { return first_; } T2& second() { return second_; } const T1& first() const { return first_; } const T2& second() const { return second_; } private: T1 first_; T2 second_; }; template void swap(compressed_pair_impl& a, compressed_pair_impl& b) { using std::swap; swap(a.first(), b.first()); swap(a.second(), b.second()); } template using compressed_pair = compressed_pair_impl::value && std::is_empty::value)>; } // namespace detail } // namespace histogram } // namespace boost #endif