| 235 | Py_RETURN_NOTIMPLEMENTED; |
| 236 | } |
| 237 | static bool load(py::handle src, T& value) { |
| 238 | PyObject* obj = src.ptr(); |
| 239 | if (PyObject_TypeCheck(obj, type)) { |
| 240 | value = reinterpret_cast<EnumWrapper*>(obj)->value; |
| 241 | return true; |
| 242 | } |
| 243 | if (py::isinstance<py::str>(src)) { |
| 244 | auto&& iter = mem2value.find(normalize_enum(py::cast<std::string>(src))); |
| 245 | if (iter != mem2value.end()) { |
| 246 | value = iter->second; |
| 247 | return true; |
| 248 | } else { |
| 249 | return false; |
| 250 | } |
| 251 | } |
| 252 | return false; |
| 253 | } |
| 254 | static PyObject* cast(const T& value) { |
| 255 | auto v = static_cast<std::underlying_type_t<T>>(value); |
| 256 | mgb_assert(v <= EnumTrait<T>::max); |