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