diff --git a/include/pocketpy/namedict.h b/include/pocketpy/namedict.h index 0dff0104..b97cb506 100644 --- a/include/pocketpy/namedict.h +++ b/include/pocketpy/namedict.h @@ -91,11 +91,17 @@ struct SmallNameDict{ uint16_t capacity() const { return PK_SMALL_NAME_DICT_CAPACITY; } }; +template +struct NameDictItem{ + StrName first; + T second; +}; + template struct LargeNameDict { PK_ALWAYS_PASS_BY_POINTER(LargeNameDict) - using Item = std::pair; + using Item = NameDictItem; static constexpr uint16_t kInitialCapacity = 32; static_assert(is_pod::value); @@ -223,8 +229,8 @@ while(!_items[i].first.empty()) { \ } } - std::vector keys() const { - std::vector v; + pod_vector keys() const { + pod_vector v; for(uint16_t i=0; i<_capacity; i++){ if(_items[i].first.empty()) continue; v.push_back(_items[i].first); @@ -307,18 +313,18 @@ struct NameDictImpl{ else _large.apply(func); } - std::vector keys() const{ - std::vector v; + pod_vector keys() const{ + pod_vector v; apply([&](StrName key, V val){ v.push_back(key); }); return v; } - std::vector> items() const{ - std::vector> v; + pod_vector> items() const{ + pod_vector> v; apply([&](StrName key, V val){ - v.push_back({key, val}); + v.push_back(NameDictItem{key, val}); }); return v; } diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 69aa03a6..5dcc0865 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -1132,15 +1132,15 @@ void init_builtins(VM* _vm) { _vm->bind_method<0>(VM::tp_mappingproxy, "values", [](VM* vm, ArgsView args) { MappingProxy& self = _CAST(MappingProxy&, args[0]); List values; - for(auto& item : self.attr().items()) values.push_back(item.second); + for(auto [k, v] : self.attr().items()) values.push_back(v); return VAR(std::move(values)); }); _vm->bind_method<0>(VM::tp_mappingproxy, "items", [](VM* vm, ArgsView args) { MappingProxy& self = _CAST(MappingProxy&, args[0]); List items; - for(auto& item : self.attr().items()){ - PyObject* t = VAR(Tuple(VAR(item.first.sv()), item.second)); + for(auto [k, v] : self.attr().items()){ + PyObject* t = VAR(Tuple(VAR(k.sv()), v)); items.push_back(std::move(t)); } return VAR(std::move(items)); @@ -1180,11 +1180,11 @@ void init_builtins(VM* _vm) { ss << "mappingproxy({"; bool first = true; vm->_repr_recursion_set.insert(_0); - for(auto& item : self.attr().items()){ + for(auto [k, v] : self.attr().items()){ if(!first) ss << ", "; first = false; - ss << item.first.escape() << ": "; - ss << CAST(Str, vm->py_repr(item.second)); + ss << k.escape() << ": "; + ss << CAST(Str, vm->py_repr(v)); } vm->_repr_recursion_set.erase(_0); ss << "})";