Reduce code duplication between PycSet/PycTuple/PycList

This commit is contained in:
Michael Hansen
2023-02-16 22:10:44 -08:00
parent 1fcbf4cd4b
commit 00d436f87d
2 changed files with 42 additions and 100 deletions

View File

@@ -3,6 +3,34 @@
#include "data.h" #include "data.h"
#include <stdexcept> #include <stdexcept>
/* PycSimpleSequence */
void PycSimpleSequence::load(PycData* stream, PycModule* mod)
{
m_size = stream->get32();
m_values.reserve(m_size);
for (int i=0; i<m_size; i++)
m_values.push_back(LoadObject(stream, mod));
}
bool PycSimpleSequence::isEqual(PycRef<PycObject> obj) const
{
if (type() != obj.type())
return false;
PycRef<PycSimpleSequence> seqObj = obj.cast<PycSimpleSequence>();
if (m_size != seqObj->m_size)
return false;
auto it1 = m_values.cbegin();
auto it2 = seqObj->m_values.cbegin();
while (it1 != m_values.cend()) {
if (!(*it1)->isEqual(*it2))
return false;
++it1, ++it2;
}
return true;
}
/* PycTuple */ /* PycTuple */
void PycTuple::load(PycData* stream, PycModule* mod) void PycTuple::load(PycData* stream, PycModule* mod)
{ {
@@ -16,51 +44,6 @@ void PycTuple::load(PycData* stream, PycModule* mod)
m_values[i] = LoadObject(stream, mod); m_values[i] = LoadObject(stream, mod);
} }
bool PycTuple::isEqual(PycRef<PycObject> obj) const
{
if (type() != obj.type())
return false;
PycRef<PycTuple> tupleObj = obj.cast<PycTuple>();
if (m_size != tupleObj->m_size)
return false;
auto it1 = m_values.cbegin();
auto it2 = tupleObj->m_values.cbegin();
while (it1 != m_values.cend()) {
if (!(*it1)->isEqual(*it2))
return false;
++it1, ++it2;
}
return true;
}
/* 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
{
if (type() != obj.type())
return false;
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;
}
/* PycDict */ /* PycDict */
void PycDict::load(PycData* stream, PycModule* mod) void PycDict::load(PycData* stream, PycModule* mod)
@@ -127,30 +110,3 @@ PycRef<PycObject> PycDict::get(int idx) const
throw std::out_of_range("Dict index out of range"); throw std::out_of_range("Dict index out of range");
return *it; 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;
}

View File

@@ -15,11 +15,11 @@ protected:
int m_size; int m_size;
}; };
class PycTuple : public PycSequence { class PycSimpleSequence : public PycSequence {
public: public:
typedef std::vector<PycRef<PycObject>> value_t; 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; bool isEqual(PycRef<PycObject> obj) const override;
@@ -28,25 +28,22 @@ public:
const value_t& values() const { return m_values; } const value_t& values() const { return m_values; }
PycRef<PycObject> get(int idx) const override { return m_values.at(idx); } PycRef<PycObject> get(int idx) const override { return m_values.at(idx); }
private: protected:
value_t m_values; value_t m_values;
}; };
class PycList : public PycSequence { class PycTuple : public PycSimpleSequence {
public: public:
typedef std::vector<PycRef<PycObject>> value_t; typedef PycSimpleSequence::value_t value_t;
PycTuple(int type = TYPE_TUPLE) : PycSimpleSequence(type) { }
PycList(int type = TYPE_LIST) : PycSequence(type) { }
bool isEqual(PycRef<PycObject> obj) const override;
void load(class PycData* stream, class PycModule* mod) override; void load(class PycData* stream, class PycModule* mod) override;
};
const value_t& values() const { return m_values; } class PycList : public PycSimpleSequence {
PycRef<PycObject> get(int idx) const override { return m_values.at(idx); } public:
typedef PycSimpleSequence::value_t value_t;
private: PycList(int type = TYPE_LIST) : PycSimpleSequence(type) { }
value_t m_values;
}; };
class PycDict : public PycSequence { class PycDict : public PycSequence {
@@ -71,21 +68,10 @@ private:
value_t m_values; value_t m_values;
}; };
class PycSet : public PycSequence { class PycSet : public PycSimpleSequence {
public: public:
typedef std::vector<PycRef<PycObject>> value_t; typedef PycSimpleSequence::value_t value_t;
PycSet(int type = TYPE_SET) : PycSimpleSequence(type) { }
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;
}; };
#endif #endif