Simplify PycDict key/value storage a bit
This commit is contained in:
17
bytecode.cpp
17
bytecode.cpp
@@ -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 << "}";
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
11
pycdas.cpp
11
pycdas.cpp
@@ -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");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user