rippled
Loading...
Searching...
No Matches
empty_base_optimization.h
1// Distributed under the Boost Software License, Version 1.0. (See accompanying
2// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3//
4// Official repository: https://github.com/boostorg/beast
5//
6
7#ifndef BEAST_CONTAINER_DETAIL_EMPTY_BASE_OPTIMIZATION_H_INCLUDED
8#define BEAST_CONTAINER_DETAIL_EMPTY_BASE_OPTIMIZATION_H_INCLUDED
9
10#include <boost/type_traits/is_final.hpp>
11
12#include <type_traits>
13#include <utility>
14
15namespace beast {
16namespace detail {
17
18template <class T>
21 bool,
22 std::is_empty<T>::value && !boost::is_final<T>::value>
23{
24};
25
26template <
27 class T,
28 int UniqueID = 0,
30class empty_base_optimization : private T
31{
32public:
40
41 template <class Arg1, class... ArgN>
42 explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn)
43 : T(std::forward<Arg1>(arg1), std::forward<ArgN>(argn)...)
44 {
45 }
46
47 T&
48 member() noexcept
49 {
50 return *this;
51 }
52
53 T const&
54 member() const noexcept
55 {
56 return *this;
57 }
58};
59
60//------------------------------------------------------------------------------
61
62template <class T, int UniqueID>
63class empty_base_optimization<T, UniqueID, false>
64{
65 T t_;
66
67public:
75
76 template <class Arg1, class... ArgN>
77 explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn)
78 : t_(std::forward<Arg1>(arg1), std::forward<ArgN>(argn)...)
79 {
80 }
81
82 T&
83 member() noexcept
84 {
85 return t_;
86 }
87
88 T const&
89 member() const noexcept
90 {
91 return t_;
92 }
93};
94
95} // namespace detail
96} // namespace beast
97
98#endif
empty_base_optimization & operator=(empty_base_optimization const &)=default
empty_base_optimization(empty_base_optimization const &)=default
empty_base_optimization & operator=(empty_base_optimization &&)=default
empty_base_optimization(empty_base_optimization &&)=default
empty_base_optimization & operator=(empty_base_optimization &&)=default
empty_base_optimization(empty_base_optimization &&)=default
empty_base_optimization(Arg1 &&arg1, ArgN &&... argn)
empty_base_optimization(empty_base_optimization const &)=default
empty_base_optimization & operator=(empty_base_optimization const &)=default
STL namespace.