| 183 | } |
| 184 | |
| 185 | inline void native_enum_data::finalize() { |
| 186 | disarm_finalize_check("DOUBLE finalize"); |
| 187 | if (hasattr(parent_scope, enum_name)) { |
| 188 | pybind11_fail("pybind11::native_enum<...>(\"" + enum_name_encoded |
| 189 | + "\"): an object with that name is already defined"); |
| 190 | } |
| 191 | auto py_enum_type = import_or_getattr(native_type_name, " (native_type_name)"); |
| 192 | auto py_enum = py_enum_type(enum_name, members); |
| 193 | object module_name = get_module_name_if_available(parent_scope); |
| 194 | if (module_name) { |
| 195 | py_enum.attr("__module__") = module_name; |
| 196 | } |
| 197 | if (hasattr(parent_scope, "__qualname__")) { |
| 198 | const auto parent_qualname = parent_scope.attr("__qualname__").cast<std::string>(); |
| 199 | py_enum.attr("__qualname__") = str(parent_qualname + "." + enum_name.cast<std::string>()); |
| 200 | } |
| 201 | parent_scope.attr(enum_name) = py_enum; |
| 202 | if (export_values_flag) { |
| 203 | for (auto member : members) { |
| 204 | auto member_name = member[int_(0)]; |
| 205 | if (hasattr(parent_scope, member_name)) { |
| 206 | pybind11_fail("pybind11::native_enum<...>(\"" + enum_name_encoded + "\").value(\"" |
| 207 | + member_name.cast<std::string>() |
| 208 | + "\"): an object with that name is already defined"); |
| 209 | } |
| 210 | parent_scope.attr(member_name) = py_enum[member_name]; |
| 211 | } |
| 212 | } |
| 213 | if (!class_doc.empty()) { |
| 214 | py_enum.attr("__doc__") = class_doc.c_str(); |
| 215 | } |
| 216 | for (auto doc : member_docs) { |
| 217 | py_enum[doc[int_(0)]].attr("__doc__") = doc[int_(1)]; |
| 218 | } |
| 219 | |
| 220 | py_enum.attr(native_enum_record::attribute_name()) = enum_record; |
| 221 | with_internals([&](internals &internals) { |
| 222 | internals.native_enum_type_map[enum_type_index] = py_enum.ptr(); |
| 223 | }); |
| 224 | } |
| 225 | |
| 226 | PYBIND11_NAMESPACE_END(detail) |
| 227 | PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE) |