Skip to content

Commit

Permalink
Reduce code duplication between PycSet/PycTuple/PycList
Browse files Browse the repository at this point in the history
  • Loading branch information
zrax committed Feb 17, 2023
1 parent 1fcbf4c commit 00d436f
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 90 deletions.
80 changes: 18 additions & 62 deletions pyc_sequence.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,25 @@
#include "data.h"
#include <stdexcept>

/* PycTuple */
void PycTuple::load(PycData* stream, PycModule* mod)
/* PycSimpleSequence */
void PycSimpleSequence::load(PycData* stream, PycModule* mod)
{
if (type() == TYPE_SMALL_TUPLE)
m_size = stream->getByte();
else
m_size = stream->get32();

m_values.resize(m_size);
m_size = stream->get32();
m_values.reserve(m_size);
for (int i=0; i<m_size; i++)
m_values[i] = LoadObject(stream, mod);
m_values.push_back(LoadObject(stream, mod));
}

bool PycTuple::isEqual(PycRef<PycObject> obj) const
bool PycSimpleSequence::isEqual(PycRef<PycObject> obj) const
{
if (type() != obj.type())
return false;

PycRef<PycTuple> tupleObj = obj.cast<PycTuple>();
if (m_size != tupleObj->m_size)
PycRef<PycSimpleSequence> seqObj = obj.cast<PycSimpleSequence>();
if (m_size != seqObj->m_size)
return false;
auto it1 = m_values.cbegin();
auto it2 = tupleObj->m_values.cbegin();
auto it2 = seqObj->m_values.cbegin();
while (it1 != m_values.cend()) {
if (!(*it1)->isEqual(*it2))
return false;
Expand All @@ -35,30 +31,17 @@ bool PycTuple::isEqual(PycRef<PycObject> obj) const
}


/* PycList */
void PycList::load(PycData* stream, PycModule* mod)
{
m_size = stream->get32();
for (int i=0; i<m_size; i++)
m_values.push_back(LoadObject(stream, mod));
}

bool PycList::isEqual(PycRef<PycObject> obj) const
/* PycTuple */
void PycTuple::load(PycData* stream, PycModule* mod)
{
if (type() != obj.type())
return false;
if (type() == TYPE_SMALL_TUPLE)
m_size = stream->getByte();
else
m_size = stream->get32();

PycRef<PycList> listObj = obj.cast<PycList>();
if (m_size != listObj->m_size)
return false;
auto it1 = m_values.cbegin();
auto it2 = listObj->m_values.cbegin();
while (it1 != m_values.cend()) {
if (!(*it1)->isEqual(*it2))
return false;
++it1, ++it2;
}
return true;
m_values.resize(m_size);
for (int i=0; i<m_size; i++)
m_values[i] = LoadObject(stream, mod);
}


Expand Down Expand Up @@ -127,30 +110,3 @@ PycRef<PycObject> PycDict::get(int idx) const
throw std::out_of_range("Dict index out of range");
return *it;
}


/* PycSet */
void PycSet::load(PycData* stream, PycModule* mod)
{
m_size = stream->get32();
for (int i=0; i<m_size; i++)
m_values.push_back(LoadObject(stream, mod));
}

bool PycSet::isEqual(PycRef<PycObject> obj) const
{
if (type() != obj.type())
return false;

PycRef<PycSet> setObj = obj.cast<PycSet>();
if (m_size != setObj->m_size)
return false;
auto it1 = m_values.cbegin();
auto it2 = setObj->m_values.cbegin();
while (it1 != m_values.cend()) {
if (!(*it1)->isEqual(*it2))
return false;
++it1, ++it2;
}
return true;
}
42 changes: 14 additions & 28 deletions pyc_sequence.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ class PycSequence : public PycObject {
int m_size;
};

class PycTuple : public PycSequence {
class PycSimpleSequence : public PycSequence {
public:
typedef std::vector<PycRef<PycObject>> value_t;

PycTuple(int type = TYPE_TUPLE) : PycSequence(type) { }
PycSimpleSequence(int type) : PycSequence(type) { }

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

Expand All @@ -28,25 +28,22 @@ class PycTuple : public PycSequence {
const value_t& values() const { return m_values; }
PycRef<PycObject> get(int idx) const override { return m_values.at(idx); }

private:
protected:
value_t m_values;
};

class PycList : public PycSequence {
class PycTuple : public PycSimpleSequence {
public:
typedef std::vector<PycRef<PycObject>> value_t;

PycList(int type = TYPE_LIST) : PycSequence(type) { }

bool isEqual(PycRef<PycObject> obj) const override;
typedef PycSimpleSequence::value_t value_t;
PycTuple(int type = TYPE_TUPLE) : PycSimpleSequence(type) { }

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

const value_t& values() const { return m_values; }
PycRef<PycObject> get(int idx) const override { return m_values.at(idx); }

private:
value_t m_values;
class PycList : public PycSimpleSequence {
public:
typedef PycSimpleSequence::value_t value_t;
PycList(int type = TYPE_LIST) : PycSimpleSequence(type) { }
};

class PycDict : public PycSequence {
Expand All @@ -71,21 +68,10 @@ class PycDict : public PycSequence {
value_t m_values;
};

class PycSet : public PycSequence {
class PycSet : public PycSimpleSequence {
public:
typedef std::vector<PycRef<PycObject>> value_t;

PycSet(int type = TYPE_SET) : PycSequence(type) { }

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

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

const value_t& values() const { return m_values; }
PycRef<PycObject> get(int idx) const override { return m_values.at(idx); }

private:
value_t m_values;
typedef PycSimpleSequence::value_t value_t;
PycSet(int type = TYPE_SET) : PycSimpleSequence(type) { }
};

#endif

0 comments on commit 00d436f

Please sign in to comment.