Skip to content

Commit 21c35b2

Browse files
committed
Simplify PycDict key/value storage a bit
1 parent e27faa1 commit 21c35b2

File tree

4 files changed

+21
-37
lines changed

4 files changed

+21
-37
lines changed

bytecode.cpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -219,20 +219,17 @@ void print_const(std::ostream& pyc_output, PycRef<PycObject> obj, PycModule* mod
219219
case PycObject::TYPE_DICT:
220220
{
221221
pyc_output << "{";
222-
PycDict::key_t keys = obj.cast<PycDict>()->keys();
223222
PycDict::value_t values = obj.cast<PycDict>()->values();
224-
auto ki = keys.cbegin();
225-
auto vi = values.cbegin();
226-
if (ki != keys.cend()) {
227-
print_const(pyc_output, *ki, mod);
223+
auto it = values.cbegin();
224+
if (it != values.cend()) {
225+
print_const(pyc_output, std::get<0>(*it), mod);
228226
pyc_output << ": ";
229-
print_const(pyc_output, *vi, mod);
230-
while (++ki != keys.cend()) {
231-
++vi;
227+
print_const(pyc_output, std::get<1>(*it), mod);
228+
while (++it != values.cend()) {
232229
pyc_output << ", ";
233-
print_const(pyc_output, *ki, mod);
230+
print_const(pyc_output, std::get<0>(*it), mod);
234231
pyc_output << ": ";
235-
print_const(pyc_output, *vi, mod);
232+
print_const(pyc_output, std::get<1>(*it), mod);
236233
}
237234
}
238235
pyc_output << "}";

pyc_sequence.cpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ void PycDict::load(PycData* stream, PycModule* mod)
5454
if (key == NULL)
5555
break;
5656
val = LoadObject(stream, mod);
57-
m_keys.push_back(key);
58-
m_values.push_back(val);
57+
m_values.emplace_back(std::make_tuple(key, val));
5958
}
6059
}
6160

@@ -65,23 +64,17 @@ bool PycDict::isEqual(PycRef<PycObject> obj) const
6564
return false;
6665

6766
PycRef<PycDict> dictObj = obj.cast<PycDict>();
68-
if (m_keys.size() != dictObj->m_keys.size())
67+
if (m_values.size() != dictObj->m_values.size())
6968
return false;
7069

71-
auto ki1 = m_keys.cbegin();
72-
auto ki2 = dictObj->m_keys.cbegin();
73-
while (ki1 != m_keys.cend()) {
74-
if (!(*ki1)->isEqual(*ki2))
70+
auto it1 = m_values.cbegin();
71+
auto it2 = dictObj->m_values.cbegin();
72+
while (it1 != m_values.cend()) {
73+
if (!std::get<0>(*it1)->isEqual(std::get<0>(*it2)))
7574
return false;
76-
++ki1, ++ki2;
77-
}
78-
79-
auto vi1 = m_values.cbegin();
80-
auto vi2 = dictObj->m_values.cbegin();
81-
while (vi1 != m_values.cend()) {
82-
if (!(*vi1)->isEqual(*vi2))
75+
if (!std::get<1>(*it1)->isEqual(std::get<1>(*it2)))
8376
return false;
84-
++vi1, ++vi2;
77+
++it1, ++it2;
8578
}
8679
return true;
8780
}

pyc_sequence.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define _PYC_SEQUENCE_H
33

44
#include "pyc_object.h"
5+
#include <tuple>
56
#include <vector>
67

78
class PycSequence : public PycObject {
@@ -54,20 +55,18 @@ class PycSet : public PycSimpleSequence {
5455

5556
class PycDict : public PycObject {
5657
public:
57-
typedef std::vector<PycRef<PycObject>> key_t;
58-
typedef std::vector<PycRef<PycObject>> value_t;
58+
typedef std::tuple<PycRef<PycObject>, PycRef<PycObject>> item_t;
59+
typedef std::vector<item_t> value_t;
5960

6061
PycDict(int type = TYPE_DICT) : PycObject(type) { }
6162

6263
bool isEqual(PycRef<PycObject> obj) const override;
6364

6465
void load(class PycData* stream, class PycModule* mod) override;
6566

66-
const key_t& keys() const { return m_keys; }
6767
const value_t& values() const { return m_values; }
6868

6969
private:
70-
key_t m_keys;
7170
value_t m_values;
7271
};
7372

pycdas.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,14 +183,9 @@ void output_object(PycRef<PycObject> obj, PycModule* mod, int indent,
183183
case PycObject::TYPE_DICT:
184184
{
185185
iputs(pyc_output, indent, "{\n");
186-
PycDict::key_t keys = obj.cast<PycDict>()->keys();
187-
PycDict::value_t values = obj.cast<PycDict>()->values();
188-
PycDict::key_t::const_iterator ki = keys.begin();
189-
PycDict::value_t::const_iterator vi = values.begin();
190-
while (ki != keys.end()) {
191-
output_object(*ki, mod, indent + 1, flags, pyc_output);
192-
output_object(*vi, mod, indent + 2, flags, pyc_output);
193-
++ki, ++vi;
186+
for (const auto& val : obj.cast<PycDict>()->values()) {
187+
output_object(std::get<0>(val), mod, indent + 1, flags, pyc_output);
188+
output_object(std::get<1>(val), mod, indent + 2, flags, pyc_output);
194189
}
195190
iputs(pyc_output, indent, "}\n");
196191
}

0 commit comments

Comments
 (0)