17struct Base :
public RC<thread_unsafe_refcount>
22 virtual std::string
to_string()
const = 0;
24 std::type_index type()
const
30 Base(std::type_index &&type)
31 : type_(std::move(type))
36 const std::type_index type_;
44 :
Base(static_type()),
45 obj(std::move(obj_arg))
50 static const Wrapper *self(
const Base *maybe_my_type)
52 if (maybe_my_type->type() == static_type())
53 return static_cast<const Wrapper *
>(maybe_my_type);
58 virtual std::string
to_string()
const override
63 static std::type_index static_type()
65 return std::type_index(
typeid(
Wrapper));
71struct Vec :
public std::vector<Base::Ptr>
76 for (
const auto &e : *this)
78 ret += e->to_string();
91static Vec create_vec()
94 vec.emplace_back(create(1));
95 vec.emplace_back(create(2));
96 vec.emplace_back(create(3.14159));
97 vec.emplace_back(create(std::string(
"Hello")));
98 vec.emplace_back(create(std::string(
"World!")));
99 vec.emplace_back(create(
true));
100 vec.emplace_back(create(
false));
110 const Vec vec = create_vec();
116 for (
const auto &e : vec)
118 const StringWrap *s = StringWrap::self(e.get());
124#ifndef INSTRUMENTATION_SLOWDOWN
131 const size_t N = 100000000;
133 const Vec vec = create_vec();
134 const size_t size = vec.size();
135 size_t n_strings = 0;
137 for (
size_t count = 0; count < N; ++count)
139 const StringWrap *s = StringWrap::self(vec[i].get());
146 ASSERT_EQ(n_strings, 28571428u);
150TEST(typeindex, perf_test_dynamic)
154 const size_t N = 100000000;
156 const Vec vec = create_vec();
157 const size_t size = vec.size();
158 size_t n_strings = 0;
160 for (
size_t count = 0; count < N; ++count)
162 const StringWrap *s =
dynamic_cast<const StringWrap *
>(vec[i].get());
169 ASSERT_EQ(n_strings, 28571428u);
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
#define OPENVPN_LOG(args)
#define OPENVPN_LOG_STRING(str)
std::string to_string(std::nullptr_t)
HTTPBase< HTTPCore, Config, Status, HTTP::ReplyType, ContentInfo, olong, RC< thread_unsafe_refcount > > Base
void to_string(const Json::Value &root, std::string &dest, const NAME &name, const TITLE &title)