/Users/deen/code/yugabyte-db/src/yb/util/shared_ptr_tuple.h
Line | Count | Source (jump to first uncovered line) |
1 | | // |
2 | | // Copyright (c) YugaByte, Inc. |
3 | | // |
4 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
5 | | // in compliance with the License. You may obtain a copy of the License at |
6 | | // |
7 | | // http://www.apache.org/licenses/LICENSE-2.0 |
8 | | // |
9 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
10 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
11 | | // or implied. See the License for the specific language governing permissions and limitations |
12 | | // under the License. |
13 | | // |
14 | | // |
15 | | |
16 | | #ifndef YB_UTIL_SHARED_PTR_TUPLE_H |
17 | | #define YB_UTIL_SHARED_PTR_TUPLE_H |
18 | | |
19 | | #include <memory> |
20 | | |
21 | | namespace yb { |
22 | | namespace util { |
23 | | |
24 | | // This utility uses C++11 features: variadic template & static assert. |
25 | | template <typename ... Types> |
26 | | struct TypeIndexer; |
27 | | |
28 | | template <> |
29 | | struct TypeIndexer<> { |
30 | | protected: |
31 | 0 | static constexpr int num_types() { return 0; } |
32 | | |
33 | | template <typename Type> |
34 | 0 | static constexpr int index_of_type(int) { return -1; } Unexecuted instantiation: int yb::util::TypeIndexer<>::index_of_type<yb::tserver::TabletServerServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<>::index_of_type<yb::tserver::TabletServerAdminServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<>::index_of_type<yb::consensus::ConsensusServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<>::index_of_type<yb::tserver::TabletServerBackupServiceProxy>(int) |
35 | | |
36 | | template <class Tuple, const int = 0> |
37 | 8.39k | static void reset_tail(Tuple*) {} |
38 | | }; |
39 | | |
40 | | template <typename T, typename ... Types> |
41 | | struct TypeIndexer<T, Types ...> : private TypeIndexer<Types ...> { |
42 | 0 | static constexpr int num_types() { return super::num_types() + 1; } Unexecuted instantiation: yb::util::TypeIndexer<yb::consensus::ConsensusServiceProxy>::num_types() Unexecuted instantiation: yb::util::TypeIndexer<yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::num_types() Unexecuted instantiation: yb::util::TypeIndexer<yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::num_types() Unexecuted instantiation: yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::num_types() |
43 | | |
44 | | template <typename Type> |
45 | 0 | static constexpr int index_of() { return index_of_type<Type>(0); } Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of<yb::tserver::TabletServerServiceProxy>() Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of<yb::tserver::TabletServerAdminServiceProxy>() Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of<yb::consensus::ConsensusServiceProxy>() Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of<yb::tserver::TabletServerBackupServiceProxy>() |
46 | | |
47 | | protected: |
48 | | typedef TypeIndexer<Types ...> super; |
49 | | |
50 | | template <typename Type> |
51 | 0 | static constexpr int index_of_type(int i) { |
52 | 0 | return std::is_same<T, Type>::value ? i : super::template index_of_type<Type>(i + 1); |
53 | 0 | } Unexecuted instantiation: int yb::util::TypeIndexer<yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerAdminServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerAdminServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerAdminServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerAdminServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::consensus::ConsensusServiceProxy>::index_of_type<yb::consensus::ConsensusServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::consensus::ConsensusServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::consensus::ConsensusServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::consensus::ConsensusServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerBackupServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerBackupServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerBackupServiceProxy>(int) Unexecuted instantiation: int yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::index_of_type<yb::tserver::TabletServerBackupServiceProxy>(int) |
54 | | |
55 | | template <class Tuple, const int i = 0> |
56 | 33.5k | static void reset_tail(Tuple* tuple) { |
57 | 33.5k | std::get<i>(*tuple).reset(); |
58 | 33.5k | super::template reset_tail<Tuple, i + 1>(tuple); |
59 | 33.5k | } void yb::util::TypeIndexer<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::reset_tail<std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >, 0>(std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >*) Line | Count | Source | 56 | 8.39k | static void reset_tail(Tuple* tuple) { | 57 | 8.39k | std::get<i>(*tuple).reset(); | 58 | 8.39k | super::template reset_tail<Tuple, i + 1>(tuple); | 59 | 8.39k | } |
void yb::util::TypeIndexer<yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::reset_tail<std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >, 1>(std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >*) Line | Count | Source | 56 | 8.39k | static void reset_tail(Tuple* tuple) { | 57 | 8.39k | std::get<i>(*tuple).reset(); | 58 | 8.39k | super::template reset_tail<Tuple, i + 1>(tuple); | 59 | 8.39k | } |
void yb::util::TypeIndexer<yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::reset_tail<std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >, 2>(std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >*) Line | Count | Source | 56 | 8.39k | static void reset_tail(Tuple* tuple) { | 57 | 8.39k | std::get<i>(*tuple).reset(); | 58 | 8.39k | super::template reset_tail<Tuple, i + 1>(tuple); | 59 | 8.39k | } |
void yb::util::TypeIndexer<yb::consensus::ConsensusServiceProxy>::reset_tail<std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >, 3>(std::__1::tuple<std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>, std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>, std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy> >*) Line | Count | Source | 56 | 8.39k | static void reset_tail(Tuple* tuple) { | 57 | 8.39k | std::get<i>(*tuple).reset(); | 58 | 8.39k | super::template reset_tail<Tuple, i + 1>(tuple); | 59 | 8.39k | } |
|
60 | | }; |
61 | | |
62 | | // The class extends std::tuple<> functionality by ability |
63 | | // to get the tuple element by type (instead of index). |
64 | | // |
65 | | // class A {}; class B {}; class C {}; |
66 | | // |
67 | | // std::tuple<A, B, C> t; // Usual std::tuple. |
68 | | // B& b = std::get<1>(t); // Constructed by default, returned by index. |
69 | | // |
70 | | // SharedPtrTuple<A, B, C> t; |
71 | | // std::shared_ptr<B>& b = t.get<B>(); // The shared_ptr is empty. Returned by the type. |
72 | | // b.reset(new B); |
73 | | // |
74 | | // t.reset(); // Reset all internal shared_ptr-s. |
75 | | // |
76 | | template<class ... Types> |
77 | | struct SharedPtrTuple : public TypeIndexer<Types ...> { |
78 | | template <class Type> |
79 | 1.85M | std::shared_ptr<Type>& get() { |
80 | 1.85M | return std::get<checked_index_of<Type>()>(storage_); |
81 | 1.85M | } std::__1::shared_ptr<yb::tserver::TabletServerServiceProxy>& yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::get<yb::tserver::TabletServerServiceProxy>() Line | Count | Source | 79 | 463k | std::shared_ptr<Type>& get() { | 80 | 463k | return std::get<checked_index_of<Type>()>(storage_); | 81 | 463k | } |
std::__1::shared_ptr<yb::tserver::TabletServerAdminServiceProxy>& yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::get<yb::tserver::TabletServerAdminServiceProxy>() Line | Count | Source | 79 | 463k | std::shared_ptr<Type>& get() { | 80 | 463k | return std::get<checked_index_of<Type>()>(storage_); | 81 | 463k | } |
std::__1::shared_ptr<yb::consensus::ConsensusServiceProxy>& yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::get<yb::consensus::ConsensusServiceProxy>() Line | Count | Source | 79 | 463k | std::shared_ptr<Type>& get() { | 80 | 463k | return std::get<checked_index_of<Type>()>(storage_); | 81 | 463k | } |
std::__1::shared_ptr<yb::tserver::TabletServerBackupServiceProxy>& yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::get<yb::tserver::TabletServerBackupServiceProxy>() Line | Count | Source | 79 | 463k | std::shared_ptr<Type>& get() { | 80 | 463k | return std::get<checked_index_of<Type>()>(storage_); | 81 | 463k | } |
|
82 | | |
83 | | template <class Type> |
84 | | const std::shared_ptr<Type>& get() const { |
85 | | return std::get<checked_index_of<Type>()>(storage_); |
86 | | } |
87 | | |
88 | | template <class Type> |
89 | | bool has_type() const { return super::template index_of<Type>() >= 0; } |
90 | | |
91 | 8.39k | void reset() { super::template reset_tail(&storage_); } |
92 | | |
93 | | protected: |
94 | | typedef TypeIndexer<Types ...> super; |
95 | | |
96 | | template <class Type> |
97 | 0 | static constexpr int checked_index_of() { |
98 | 0 | constexpr int index = super::template index_of<Type>(); |
99 | 0 | static_assert(index >= 0, "Unknown type 'Type'"); |
100 | 0 | static_assert(index < super::num_types(), "Internal error: invalid index"); |
101 | 0 | return index; |
102 | 0 | } Unexecuted instantiation: int yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::checked_index_of<yb::tserver::TabletServerServiceProxy>() Unexecuted instantiation: int yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::checked_index_of<yb::tserver::TabletServerAdminServiceProxy>() Unexecuted instantiation: int yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::checked_index_of<yb::consensus::ConsensusServiceProxy>() Unexecuted instantiation: int yb::util::SharedPtrTuple<yb::tserver::TabletServerAdminServiceProxy, yb::tserver::TabletServerServiceProxy, yb::tserver::TabletServerBackupServiceProxy, yb::consensus::ConsensusServiceProxy>::checked_index_of<yb::tserver::TabletServerBackupServiceProxy>() |
103 | | |
104 | | std::tuple<std::shared_ptr<Types> ...> storage_; |
105 | | }; |
106 | | |
107 | | } // namespace util |
108 | | } // namespace yb |
109 | | |
110 | | #endif // YB_UTIL_SHARED_PTR_TUPLE_H |