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#pragma once
8
9#include <boost/type_traits/is_final.hpp>
10
11#include <type_traits>
12#include <utility>
13
14namespace beast {
15namespace detail {
16
17template <class T>
19 : std::integral_constant<bool, std::is_empty<T>::value && !boost::is_final<T>::value>
20{
21};
22
23template <class T, int UniqueID = 0, bool isDerived = is_empty_base_optimization_derived<T>::value>
24class empty_base_optimization : private T
25{
26public:
34
35 template <class Arg1, class... ArgN>
36 explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn)
37 : T(std::forward<Arg1>(arg1), std::forward<ArgN>(argn)...)
38 {
39 }
40
41 T&
42 member() noexcept
43 {
44 return *this;
45 }
46
47 T const&
48 member() const noexcept
49 {
50 return *this;
51 }
52};
53
54//------------------------------------------------------------------------------
55
56template <class T, int UniqueID>
57class empty_base_optimization<T, UniqueID, false>
58{
59 T t_;
60
61public:
69
70 template <class Arg1, class... ArgN>
71 explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn)
72 : t_(std::forward<Arg1>(arg1), std::forward<ArgN>(argn)...)
73 {
74 }
75
76 T&
77 member() noexcept
78 {
79 return t_;
80 }
81
82 T const&
83 member() const noexcept
84 {
85 return t_;
86 }
87};
88
89} // namespace detail
90} // namespace beast
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.