// 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) // // Official repository: https://github.com/boostorg/beast // #ifndef BEAST_CONTAINER_DETAIL_EMPTY_BASE_OPTIMIZATION_H_INCLUDED #define BEAST_CONTAINER_DETAIL_EMPTY_BASE_OPTIMIZATION_H_INCLUDED #include #include #include namespace beast { namespace detail { template struct is_empty_base_optimization_derived : std::integral_constant< bool, std::is_empty::value && !boost::is_final::value> { }; template < class T, int UniqueID = 0, bool isDerived = is_empty_base_optimization_derived::value> class empty_base_optimization : private T { public: empty_base_optimization() = default; empty_base_optimization(empty_base_optimization&&) = default; empty_base_optimization(empty_base_optimization const&) = default; empty_base_optimization& operator=(empty_base_optimization&&) = default; empty_base_optimization& operator=(empty_base_optimization const&) = default; template explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn) : T(std::forward(arg1), std::forward(argn)...) { } T& member() noexcept { return *this; } T const& member() const noexcept { return *this; } }; //------------------------------------------------------------------------------ template class empty_base_optimization { T t_; public: empty_base_optimization() = default; empty_base_optimization(empty_base_optimization&&) = default; empty_base_optimization(empty_base_optimization const&) = default; empty_base_optimization& operator=(empty_base_optimization&&) = default; empty_base_optimization& operator=(empty_base_optimization const&) = default; template explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn) : t_(std::forward(arg1), std::forward(argn)...) { } T& member() noexcept { return t_; } T const& member() const noexcept { return t_; } }; } // namespace detail } // namespace beast #endif