blueloveTH 2 tahun lalu
induk
melakukan
4ac915e25c
2 mengubah file dengan 20 tambahan dan 14 penghapusan
  1. 14 8
      include/pocketpy/namedict.h
  2. 6 6
      src/pocketpy.cpp

+ 14 - 8
include/pocketpy/namedict.h

@@ -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;
     }

+ 6 - 6
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 << "})";