YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/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