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; }
};
template<typename T>
struct NameDictItem{
StrName first;
T second;
};
template<typename T>
struct LargeNameDict {
PK_ALWAYS_PASS_BY_POINTER(LargeNameDict)
using Item = std::pair<StrName, T>;
using Item = NameDictItem<T>;
static constexpr uint16_t kInitialCapacity = 32;
static_assert(is_pod<T>::value);
@ -223,8 +229,8 @@ while(!_items[i].first.empty()) { \
}
}
std::vector<StrName> keys() const {
std::vector<StrName> v;
pod_vector<StrName> keys() const {
pod_vector<StrName> 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<StrName> keys() const{
std::vector<StrName> v;
pod_vector<StrName> keys() const{
pod_vector<StrName> v;
apply([&](StrName key, V val){
v.push_back(key);
});
return v;
}
std::vector<std::pair<StrName, V>> items() const{
std::vector<std::pair<StrName, V>> v;
pod_vector<NameDictItem<V>> items() const{
pod_vector<NameDictItem<V>> v;
apply([&](StrName key, V val){
v.push_back({key, val});
v.push_back(NameDictItem<V>{key, val});
});
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) {
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 << "})";