| 182 | } |
| 183 | |
| 184 | void OprRegistryV2::versioned_add( |
| 185 | const OprRegistryV2& record, uint8_t min_version, uint8_t max_version, |
| 186 | bool dynamic) { |
| 187 | mgb_assert(max_version >= min_version); |
| 188 | |
| 189 | auto&& sd = static_data(); |
| 190 | auto id = record.type_id; |
| 191 | uint64_t type_id = id; |
| 192 | //! record.type->name is nullptr when MGB_VERBOSE_TYPEINFO_NAME==0 |
| 193 | #if MGB_VERBOSE_TYPEINFO_NAME |
| 194 | if (dynamic && record.type && record.type->name) { |
| 195 | type_id = MGB_HASH_RUNTIME(std::string(record.type->name)); |
| 196 | } |
| 197 | #endif |
| 198 | for (uint8_t version = min_version; version <= max_version; version++) { |
| 199 | auto&& registry_map = sd.version_id_reg_map[version]; |
| 200 | auto versioned_record = record; |
| 201 | versioned_record.version = version; |
| 202 | mgb_assert( |
| 203 | registry_map.find(id) == registry_map.end() || |
| 204 | id == dynamic_registry_v2()->type_id, |
| 205 | "dduplicated OprRegistryV2 of %s\n", record.name.c_str()); |
| 206 | auto registry_ins = registry_map.emplace(id, versioned_record); |
| 207 | if (!registry_ins.second) { |
| 208 | //! the registry is dynamic |
| 209 | mgb_assert(!record.converter); |
| 210 | registry_map[id] = versioned_record; |
| 211 | } |
| 212 | //! sometimes the register id and the hash typeinfo is not same, just as |
| 213 | //! dynamic Operator |
| 214 | if (id != type_id) { |
| 215 | mgb_assert( |
| 216 | registry_map.find(type_id) == registry_map.end(), |
| 217 | "duplicated OprRegistryV2 of %s\n", record.name.c_str()); |
| 218 | registry_map.emplace(type_id, versioned_record); |
| 219 | } |
| 220 | auto&& registry_type_map = sd.version_type_reg_map[version]; |
| 221 | registry_type_map.emplace(record.type, ®istry_map[id]); |
| 222 | } |
| 223 | } |
| 224 | |
| 225 | void OprRegistry::add_using_dynamic_loader( |
| 226 | Typeinfo* type, const std::string& name, const OprDumper& dumper) { |
nothing calls this directly
no test coverage detected