Simplify PycDict key/value storage a bit

This commit is contained in:
Michael Hansen
2023-11-09 15:05:55 -08:00
parent e27faa1e88
commit 21c35b2f4c
4 changed files with 21 additions and 37 deletions

View File

@@ -219,20 +219,17 @@ void print_const(std::ostream& pyc_output, PycRef<PycObject> obj, PycModule* mod
case PycObject::TYPE_DICT: case PycObject::TYPE_DICT:
{ {
pyc_output << "{"; pyc_output << "{";
PycDict::key_t keys = obj.cast<PycDict>()->keys();
PycDict::value_t values = obj.cast<PycDict>()->values(); PycDict::value_t values = obj.cast<PycDict>()->values();
auto ki = keys.cbegin(); auto it = values.cbegin();
auto vi = values.cbegin(); if (it != values.cend()) {
if (ki != keys.cend()) { print_const(pyc_output, std::get<0>(*it), mod);
print_const(pyc_output, *ki, mod);
pyc_output << ": "; pyc_output << ": ";
print_const(pyc_output, *vi, mod); print_const(pyc_output, std::get<1>(*it), mod);
while (++ki != keys.cend()) { while (++it != values.cend()) {
++vi;
pyc_output << ", "; pyc_output << ", ";
print_const(pyc_output, *ki, mod); print_const(pyc_output, std::get<0>(*it), mod);
pyc_output << ": "; pyc_output << ": ";
print_const(pyc_output, *vi, mod); print_const(pyc_output, std::get<1>(*it), mod);
} }
} }
pyc_output << "}"; pyc_output << "}";

View File

@@ -54,8 +54,7 @@ void PycDict::load(PycData* stream, PycModule* mod)
if (key == NULL) if (key == NULL)
break; break;
val = LoadObject(stream, mod); val = LoadObject(stream, mod);
m_keys.push_back(key); m_values.emplace_back(std::make_tuple(key, val));
m_values.push_back(val);
} }
} }
@@ -65,23 +64,17 @@ bool PycDict::isEqual(PycRef<PycObject> obj) const
return false; return false;
PycRef<PycDict> dictObj = obj.cast<PycDict>(); PycRef<PycDict> dictObj = obj.cast<PycDict>();
if (m_keys.size() != dictObj->m_keys.size()) if (m_values.size() != dictObj->m_values.size())
return false; return false;
auto ki1 = m_keys.cbegin(); auto it1 = m_values.cbegin();
auto ki2 = dictObj->m_keys.cbegin(); auto it2 = dictObj->m_values.cbegin();
while (ki1 != m_keys.cend()) { while (it1 != m_values.cend()) {
if (!(*ki1)->isEqual(*ki2)) if (!std::get<0>(*it1)->isEqual(std::get<0>(*it2)))
return false; return false;
++ki1, ++ki2; if (!std::get<1>(*it1)->isEqual(std::get<1>(*it2)))
}
auto vi1 = m_values.cbegin();
auto vi2 = dictObj->m_values.cbegin();
while (vi1 != m_values.cend()) {
if (!(*vi1)->isEqual(*vi2))
return false; return false;
++vi1, ++vi2; ++it1, ++it2;
} }
return true; return true;
} }

View File

@@ -2,6 +2,7 @@
#define _PYC_SEQUENCE_H #define _PYC_SEQUENCE_H
#include "pyc_object.h" #include "pyc_object.h"
#include <tuple>
#include <vector> #include <vector>
class PycSequence : public PycObject { class PycSequence : public PycObject {
@@ -54,8 +55,8 @@ public:
class PycDict : public PycObject { class PycDict : public PycObject {
public: public:
typedef std::vector<PycRef<PycObject>> key_t; typedef std::tuple<PycRef<PycObject>, PycRef<PycObject>> item_t;
typedef std::vector<PycRef<PycObject>> value_t; typedef std::vector<item_t> value_t;
PycDict(int type = TYPE_DICT) : PycObject(type) { } PycDict(int type = TYPE_DICT) : PycObject(type) { }
@@ -63,11 +64,9 @@ public:
void load(class PycData* stream, class PycModule* mod) override; void load(class PycData* stream, class PycModule* mod) override;
const key_t& keys() const { return m_keys; }
const value_t& values() const { return m_values; } const value_t& values() const { return m_values; }
private: private:
key_t m_keys;
value_t m_values; value_t m_values;
}; };

View File

@@ -183,14 +183,9 @@ void output_object(PycRef<PycObject> obj, PycModule* mod, int indent,
case PycObject::TYPE_DICT: case PycObject::TYPE_DICT:
{ {
iputs(pyc_output, indent, "{\n"); iputs(pyc_output, indent, "{\n");
PycDict::key_t keys = obj.cast<PycDict>()->keys(); for (const auto& val : obj.cast<PycDict>()->values()) {
PycDict::value_t values = obj.cast<PycDict>()->values(); output_object(std::get<0>(val), mod, indent + 1, flags, pyc_output);
PycDict::key_t::const_iterator ki = keys.begin(); output_object(std::get<1>(val), mod, indent + 2, flags, pyc_output);
PycDict::value_t::const_iterator vi = values.begin();
while (ki != keys.end()) {
output_object(*ki, mod, indent + 1, flags, pyc_output);
output_object(*vi, mod, indent + 2, flags, pyc_output);
++ki, ++vi;
} }
iputs(pyc_output, indent, "}\n"); iputs(pyc_output, indent, "}\n");
} }