From 00d436f87d6400e27db93b1ff483b765ecb72278 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Thu, 16 Feb 2023 22:10:44 -0800 Subject: [PATCH] Reduce code duplication between PycSet/PycTuple/PycList --- pyc_sequence.cpp | 100 +++++++++++++---------------------------------- pyc_sequence.h | 42 +++++++------------- 2 files changed, 42 insertions(+), 100 deletions(-) diff --git a/pyc_sequence.cpp b/pyc_sequence.cpp index 9b36858..7aceac2 100644 --- a/pyc_sequence.cpp +++ b/pyc_sequence.cpp @@ -3,6 +3,34 @@ #include "data.h" #include +/* PycSimpleSequence */ +void PycSimpleSequence::load(PycData* stream, PycModule* mod) +{ + m_size = stream->get32(); + m_values.reserve(m_size); + for (int i=0; i obj) const +{ + if (type() != obj.type()) + return false; + + PycRef seqObj = obj.cast(); + 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 */ void PycTuple::load(PycData* stream, PycModule* mod) { @@ -16,51 +44,6 @@ void PycTuple::load(PycData* stream, PycModule* mod) m_values[i] = LoadObject(stream, mod); } -bool PycTuple::isEqual(PycRef obj) const -{ - if (type() != obj.type()) - return false; - - PycRef tupleObj = obj.cast(); - 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 obj) const -{ - if (type() != obj.type()) - return false; - - PycRef listObj = obj.cast(); - 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 */ void PycDict::load(PycData* stream, PycModule* mod) @@ -127,30 +110,3 @@ PycRef 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 obj) const -{ - if (type() != obj.type()) - return false; - - PycRef setObj = obj.cast(); - 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; -} diff --git a/pyc_sequence.h b/pyc_sequence.h index e69f64e..521782a 100644 --- a/pyc_sequence.h +++ b/pyc_sequence.h @@ -15,11 +15,11 @@ protected: int m_size; }; -class PycTuple : public PycSequence { +class PycSimpleSequence : public PycSequence { public: typedef std::vector> value_t; - PycTuple(int type = TYPE_TUPLE) : PycSequence(type) { } + PycSimpleSequence(int type) : PycSequence(type) { } bool isEqual(PycRef obj) const override; @@ -28,25 +28,22 @@ public: const value_t& values() const { return m_values; } PycRef 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> value_t; - - PycList(int type = TYPE_LIST) : PycSequence(type) { } - - bool isEqual(PycRef 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 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 { @@ -71,21 +68,10 @@ private: value_t m_values; }; -class PycSet : public PycSequence { +class PycSet : public PycSimpleSequence { public: - typedef std::vector> value_t; - - PycSet(int type = TYPE_SET) : PycSequence(type) { } - - bool isEqual(PycRef obj) const override; - - void load(class PycData* stream, class PycModule* mod) override; - - const value_t& values() const { return m_values; } - PycRef 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