File indexing completed on 2026-08-17 08:52:04
0001
0002
0003
0004
0005
0006 #ifndef BOOST_OPENMETHOD_POLICY_VPTR_MAP_HPP
0007 #define BOOST_OPENMETHOD_POLICY_VPTR_MAP_HPP
0008
0009 #include <boost/openmethod/preamble.hpp>
0010
0011 #include <unordered_map>
0012
0013 namespace boost::openmethod {
0014
0015 namespace policies {
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 template<class MapFn = mp11::mp_quote<std::unordered_map>>
0027 class vptr_map : public vptr {
0028 public:
0029
0030
0031
0032 template<class Registry>
0033 class fn {
0034 using Value = std::conditional_t<
0035 Registry::has_indirect_vptr, const vptr_type*, vptr_type>;
0036 static inline typename MapFn::template fn<type_id, Value> vptrs;
0037
0038 public:
0039
0040
0041
0042
0043
0044
0045 template<class Context, class... Options>
0046 static void
0047 initialize(const Context& ctx, const std::tuple<Options...>&) {
0048 decltype(vptrs) new_vptrs;
0049
0050 for (auto iter = ctx.classes_begin(); iter != ctx.classes_end();
0051 ++iter) {
0052 for (auto type_iter = iter->type_id_begin();
0053 type_iter != iter->type_id_end(); ++type_iter) {
0054
0055 if constexpr (Registry::has_indirect_vptr) {
0056 new_vptrs.emplace(*type_iter, &iter->vptr());
0057 } else {
0058 new_vptrs.emplace(*type_iter, iter->vptr());
0059 }
0060 }
0061 }
0062
0063 vptrs.swap(new_vptrs);
0064 }
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080 template<class Class>
0081 static auto dynamic_vptr(const Class& arg) -> const vptr_type& {
0082 auto type = Registry::rtti::dynamic_type(arg);
0083 auto iter = vptrs.find(type);
0084
0085 if constexpr (Registry::has_runtime_checks) {
0086 if (iter == vptrs.end()) {
0087 if constexpr (Registry::has_error_handler) {
0088 missing_class error;
0089 error.type = type;
0090 Registry::error_handler::error(error);
0091 }
0092
0093 abort();
0094 }
0095 }
0096
0097 if constexpr (Registry::has_indirect_vptr) {
0098
0099
0100 return *iter->second;
0101 } else {
0102
0103 return iter->second;
0104 }
0105 }
0106
0107
0108
0109
0110
0111
0112 template<class... Options>
0113 static auto finalize(const std::tuple<Options...>&) -> void {
0114 vptrs.clear();
0115 }
0116 };
0117 };
0118
0119 }
0120 }
0121
0122 #endif