Reduce code duplication between PycSet/PycTuple/PycList
This commit is contained in:
100
pyc_sequence.cpp
100
pyc_sequence.cpp
@@ -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;
|
|
||||||
}
|
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user