rippled
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 
17 namespace beast {
18 namespace detail {
19 
20 template <class T>
23  bool,
24  std::is_empty<T>::value && !boost::is_final<T>::value>
25 {
26 };
27 
28 template <
29  class T,
30  int UniqueID = 0,
32 class empty_base_optimization : private T
33 {
34 public:
35  empty_base_optimization() = default;
41  operator=(empty_base_optimization const&) = default;
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 
64 template <class T, int UniqueID>
65 class empty_base_optimization<T, UniqueID, false>
66 {
67  T t_;
68 
69 public:
70  empty_base_optimization() = default;
76  operator=(empty_base_optimization const&) = default;
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
std::integral_constant
utility
beast::detail::empty_base_optimization::operator=
empty_base_optimization & operator=(empty_base_optimization &&)=default
beast::detail::empty_base_optimization
Definition: empty_base_optimization.h:32
beast::detail::empty_base_optimization< T, UniqueID, false >::member
T & member() noexcept
Definition: empty_base_optimization.h:85
beast::detail::empty_base_optimization::member
T & member() noexcept
Definition: empty_base_optimization.h:50
beast::detail::empty_base_optimization< T, UniqueID, false >::empty_base_optimization
empty_base_optimization(Arg1 &&arg1, ArgN &&... argn)
Definition: empty_base_optimization.h:79
beast::detail::empty_base_optimization::member
T const & member() const noexcept
Definition: empty_base_optimization.h:56
beast::detail::empty_base_optimization< T, UniqueID, false >::member
T const & member() const noexcept
Definition: empty_base_optimization.h:91
beast::detail::empty_base_optimization::empty_base_optimization
empty_base_optimization(Arg1 &&arg1, ArgN &&... argn)
Definition: empty_base_optimization.h:44
beast::detail::empty_base_optimization< T, UniqueID, false >::t_
T t_
Definition: empty_base_optimization.h:67
std
STL namespace.
beast::detail::empty_base_optimization::empty_base_optimization
empty_base_optimization()=default
beast::detail::is_empty_base_optimization_derived
Definition: empty_base_optimization.h:21
type_traits
beast
Definition: base_uint.h:641