mirror of
https://github.com/boostorg/type_index.git
synced 2025-08-02 13:54:28 +02:00
Experiment with a version of runtime_cast that has only a single registration macro.
This commit is contained in:
@@ -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
|
||||
|
||||
|
@@ -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)
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user