Experiment with a version of runtime_cast that has only a single registration macro.

This commit is contained in:
Chris Glover
2016-08-09 23:13:54 -04:00
parent 12751e0f83
commit 2fb667a6a0
2 changed files with 20 additions and 30 deletions

View File

@@ -37,22 +37,12 @@ inline type_index runtime_class_construct_type_id(T const*) {
#define BOOST_TYPE_INDEX_CHECK_BASE_(r, data, Base) \
if(void const* ret_val = this->Base::boost_type_index_find_instance_(idx)) return ret_val;
#define BOOST_TYPE_INDEX_CHECK_BASES(base_list) \
BOOST_PP_SEQ_FOR_EACH(BOOST_TYPE_INDEX_CHECK_BASE_, _, base_list)
#define BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS \
virtual void const* boost_type_index_find_instance_(boost::typeindex::type_index const& idx) const BOOST_NOEXCEPT { \
if(idx == boost::typeindex::detail::runtime_class_construct_type_id(this)) \
return this; \
return NULL; \
}
#define BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES(base_list) \
virtual void const* boost_type_index_find_instance_(boost::typeindex::type_index const& idx) const BOOST_NOEXCEPT { \
if(idx == boost::typeindex::detail::runtime_class_construct_type_id(this)) \
return this; \
BOOST_TYPE_INDEX_CHECK_BASES(base_list) \
return NULL; \
#define BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(base_list) \
virtual void const* boost_type_index_find_instance_(boost::typeindex::type_index const& idx) const BOOST_NOEXCEPT { \
if(idx == boost::typeindex::detail::runtime_class_construct_type_id(this)) \
return this; \
BOOST_PP_SEQ_FOR_EACH(BOOST_TYPE_INDEX_CHECK_BASE_, _, base_list) \
return NULL; \
}
}} // namespace boost::typeindex

View File

@@ -26,72 +26,72 @@
std::string name;
struct base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_PP_SEQ_NIL)
IMPLEMENT_CLASS(base)
};
struct single_derived : base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base))
IMPLEMENT_CLASS(single_derived)
};
struct base1 {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_PP_SEQ_NIL)
IMPLEMENT_CLASS(base1)
};
struct base2 {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_PP_SEQ_NIL)
IMPLEMENT_CLASS(base2)
};
struct multiple_derived : base1, base2 {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base1)(base2))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base1)(base2))
IMPLEMENT_CLASS(multiple_derived)
};
struct baseV1 : virtual base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base))
IMPLEMENT_CLASS(baseV1)
};
struct baseV2 : virtual base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base))
IMPLEMENT_CLASS(baseV2)
};
struct multiple_virtual_derived : baseV1, baseV2 {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((baseV1)(baseV2))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((baseV1)(baseV2))
IMPLEMENT_CLASS(multiple_virtual_derived)
};
struct unrelated {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS(BOOST_PP_SEQ_NIL)
IMPLEMENT_CLASS(unrelated)
};
struct unrelated_with_base : base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base))
IMPLEMENT_CLASS(unrelated_with_base)
};
struct unrelatedV1 : virtual base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base))
IMPLEMENT_CLASS(unrelatedV1)
};
struct level1_a : base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base))
IMPLEMENT_CLASS(level1_a)
};
struct level1_b : base {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((base))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((base))
IMPLEMENT_CLASS(level1_b)
};
struct level2 : level1_a, level1_b {
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS_BASES((level1_a)(level1_b))
BOOST_TYPE_INDEX_REGISTER_RUNTIME_CLASS((level1_a)(level1_b))
IMPLEMENT_CLASS(level2)
};