| 82 | } // anonymous namespace |
| 83 | |
| 84 | void OprRegistry::add(const OprRegistry& record) { |
| 85 | auto&& sd = static_data(); |
| 86 | auto persist_id = record.persist_type_id; |
| 87 | auto registry_ins = sd.id2reg.emplace(persist_id, record); |
| 88 | mgb_assert( |
| 89 | registry_ins.second || persist_id == dynamic_registry()->persist_type_id, |
| 90 | "duplicated operator name : %s", record.name.c_str()); |
| 91 | |
| 92 | OprRegistry* persis_record_ptr; |
| 93 | if (registry_ins.second) { |
| 94 | persis_record_ptr = ®istry_ins.first->second; |
| 95 | } else { |
| 96 | static std::vector<std::unique_ptr<OprRegistry>> dynamic_opr_reg; |
| 97 | mgb_assert(!record.loader); |
| 98 | dynamic_opr_reg.emplace_back(new OprRegistry{record}); |
| 99 | persis_record_ptr = dynamic_opr_reg.back().get(); |
| 100 | } |
| 101 | |
| 102 | if (!record.type) { |
| 103 | // loader only for compatibility |
| 104 | mgb_assert(!record.dumper); |
| 105 | mgb_assert(!record.shallow_copy); |
| 106 | } else { |
| 107 | auto&& res = sd.type2reg.insert({record.type, persis_record_ptr}); |
| 108 | mgb_assert(res.second, "duplicated OprRegistry type: %s", record.type->name); |
| 109 | if (!record.shallow_copy) { |
| 110 | res.first->second->shallow_copy = intl::copy_opr_shallow_default_impl; |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | if (!record.name.empty()) { |
| 115 | auto&& n2r = sd.name2reg[record.name]; |
| 116 | mgb_assert(!n2r, "duplicated OprRegistry name: %s", record.name.c_str()); |
| 117 | n2r = persis_record_ptr; |
| 118 | } |
| 119 | |
| 120 | if (record.unversioned_type_id) { |
| 121 | auto&& res = sd.unversioned_id2reg.emplace( |
| 122 | record.unversioned_type_id, persis_record_ptr); |
| 123 | mgb_assert( |
| 124 | res.second || record.unversioned_type_id == |
| 125 | dynamic_registry()->unversioned_type_id, |
| 126 | "duplicated OprRegistry unversioned id: %s", |
| 127 | std::to_string(record.unversioned_type_id).c_str()); |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | const OprRegistry* OprRegistry::find_by_name(const std::string& name) { |
| 132 | auto&& name2reg = static_data().name2reg; |
no test coverage detected