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#include <type_traits>
15#include <utility>
16
17namespace beast {
18namespace detail {
19
20template <class T>
23 bool,
24 std::is_empty<T>::value && !boost::is_final<T>::value>
25{
26};
27
28template <
29 class T,
30 int UniqueID = 0,
32class empty_base_optimization : private T
33{
34public:
42
43 template <class Arg1, class... ArgN>
44 explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn)
45 : T(std::forward<Arg1>(arg1), std::forward<ArgN>(argn)...)
46 {
47 }
48
49 T&
50 member() noexcept
51 {
52 return *this;
53 }
54
55 T const&
56 member() const noexcept
57 {
58 return *this;
59 }
60};
61
62//------------------------------------------------------------------------------
63
64template <class T, int UniqueID>
65class empty_base_optimization<T, UniqueID, false>
66{
67 T t_;
68
69public:
77
78 template <class Arg1, class... ArgN>
79 explicit empty_base_optimization(Arg1&& arg1, ArgN&&... argn)
80 : t_(std::forward<Arg1>(arg1), std::forward<ArgN>(argn)...)
81 {
82 }
83
84 T&
85 member() noexcept
86 {
87 return t_;
88 }
89
90 T const&
91 member() const noexcept
92 {
93 return t_;
94 }
95};
96
97} // namespace detail
98} // namespace beast
99
100#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.