This commit is contained in:
blueloveTH 2024-02-18 18:59:58 +08:00
parent acf0e16cbb
commit 4ac915e25c
2 changed files with 20 additions and 14 deletions

View File

@ -91,11 +91,17 @@ struct SmallNameDict{
uint16_t capacity() const { return PK_SMALL_NAME_DICT_CAPACITY; } uint16_t capacity() const { return PK_SMALL_NAME_DICT_CAPACITY; }
}; };
template<typename T>
struct NameDictItem{
StrName first;
T second;
};
template<typename T> template<typename T>
struct LargeNameDict { struct LargeNameDict {
PK_ALWAYS_PASS_BY_POINTER(LargeNameDict) PK_ALWAYS_PASS_BY_POINTER(LargeNameDict)
using Item = std::pair<StrName, T>; using Item = NameDictItem<T>;
static constexpr uint16_t kInitialCapacity = 32; static constexpr uint16_t kInitialCapacity = 32;
static_assert(is_pod<T>::value); static_assert(is_pod<T>::value);
@ -223,8 +229,8 @@ while(!_items[i].first.empty()) { \
} }
} }
std::vector<StrName> keys() const { pod_vector<StrName> keys() const {
std::vector<StrName> v; pod_vector<StrName> v;
for(uint16_t i=0; i<_capacity; i++){ for(uint16_t i=0; i<_capacity; i++){
if(_items[i].first.empty()) continue; if(_items[i].first.empty()) continue;
v.push_back(_items[i].first); v.push_back(_items[i].first);
@ -307,18 +313,18 @@ struct NameDictImpl{
else _large.apply(func); else _large.apply(func);
} }
std::vector<StrName> keys() const{ pod_vector<StrName> keys() const{
std::vector<StrName> v; pod_vector<StrName> v;
apply([&](StrName key, V val){ apply([&](StrName key, V val){
v.push_back(key); v.push_back(key);
}); });
return v; return v;
} }
std::vector<std::pair<StrName, V>> items() const{ pod_vector<NameDictItem<V>> items() const{
std::vector<std::pair<StrName, V>> v; pod_vector<NameDictItem<V>> v;
apply([&](StrName key, V val){ apply([&](StrName key, V val){
v.push_back({key, val}); v.push_back(NameDictItem<V>{key, val});
}); });
return v; return v;
} }

View File

@ -1132,15 +1132,15 @@ void init_builtins(VM* _vm) {
_vm->bind_method<0>(VM::tp_mappingproxy, "values", [](VM* vm, ArgsView args) { _vm->bind_method<0>(VM::tp_mappingproxy, "values", [](VM* vm, ArgsView args) {
MappingProxy& self = _CAST(MappingProxy&, args[0]); MappingProxy& self = _CAST(MappingProxy&, args[0]);
List values; 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)); return VAR(std::move(values));
}); });
_vm->bind_method<0>(VM::tp_mappingproxy, "items", [](VM* vm, ArgsView args) { _vm->bind_method<0>(VM::tp_mappingproxy, "items", [](VM* vm, ArgsView args) {
MappingProxy& self = _CAST(MappingProxy&, args[0]); MappingProxy& self = _CAST(MappingProxy&, args[0]);
List items; List items;
for(auto& item : self.attr().items()){ for(auto [k, v] : self.attr().items()){
PyObject* t = VAR(Tuple(VAR(item.first.sv()), item.second)); PyObject* t = VAR(Tuple(VAR(k.sv()), v));
items.push_back(std::move(t)); items.push_back(std::move(t));
} }
return VAR(std::move(items)); return VAR(std::move(items));
@ -1180,11 +1180,11 @@ void init_builtins(VM* _vm) {
ss << "mappingproxy({"; ss << "mappingproxy({";
bool first = true; bool first = true;
vm->_repr_recursion_set.insert(_0); vm->_repr_recursion_set.insert(_0);
for(auto& item : self.attr().items()){ for(auto [k, v] : self.attr().items()){
if(!first) ss << ", "; if(!first) ss << ", ";
first = false; first = false;
ss << item.first.escape() << ": "; ss << k.escape() << ": ";
ss << CAST(Str, vm->py_repr(item.second)); ss << CAST(Str, vm->py_repr(v));
} }
vm->_repr_recursion_set.erase(_0); vm->_repr_recursion_set.erase(_0);
ss << "})"; ss << "})";