2011-10-23 17:48:10 -07:00
|
|
|
#include "pyc_sequence.h"
|
|
|
|
#include "pyc_module.h"
|
2009-07-24 08:35:21 +00:00
|
|
|
#include "data.h"
|
2018-01-28 14:33:26 -08:00
|
|
|
#include <stdexcept>
|
2009-07-24 08:35:21 +00:00
|
|
|
|
2023-02-16 22:10:44 -08:00
|
|
|
/* PycSimpleSequence */
|
|
|
|
void PycSimpleSequence::load(PycData* stream, PycModule* mod)
|
2009-07-24 08:35:21 +00:00
|
|
|
{
|
2023-02-16 22:10:44 -08:00
|
|
|
m_size = stream->get32();
|
|
|
|
m_values.reserve(m_size);
|
2009-07-24 08:35:21 +00:00
|
|
|
for (int i=0; i<m_size; i++)
|
2023-02-16 22:10:44 -08:00
|
|
|
m_values.push_back(LoadObject(stream, mod));
|
2009-07-24 08:35:21 +00:00
|
|
|
}
|
|
|
|
|
2023-02-16 22:10:44 -08:00
|
|
|
bool PycSimpleSequence::isEqual(PycRef<PycObject> obj) const
|
2009-07-24 21:15:51 +00:00
|
|
|
{
|
2017-07-05 16:36:04 -07:00
|
|
|
if (type() != obj.type())
|
2009-07-25 02:41:15 +00:00
|
|
|
return false;
|
|
|
|
|
2023-02-16 22:10:44 -08:00
|
|
|
PycRef<PycSimpleSequence> seqObj = obj.cast<PycSimpleSequence>();
|
|
|
|
if (m_size != seqObj->m_size)
|
2009-07-24 21:15:51 +00:00
|
|
|
return false;
|
2022-12-01 11:35:14 -08:00
|
|
|
auto it1 = m_values.cbegin();
|
2023-02-16 22:10:44 -08:00
|
|
|
auto it2 = seqObj->m_values.cbegin();
|
2022-12-01 11:35:14 -08:00
|
|
|
while (it1 != m_values.cend()) {
|
2009-07-24 21:15:51 +00:00
|
|
|
if (!(*it1)->isEqual(*it2))
|
|
|
|
return false;
|
|
|
|
++it1, ++it2;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2009-07-24 08:35:21 +00:00
|
|
|
|
2023-02-16 22:10:44 -08:00
|
|
|
/* PycTuple */
|
|
|
|
void PycTuple::load(PycData* stream, PycModule* mod)
|
2009-07-24 21:15:51 +00:00
|
|
|
{
|
2023-02-16 22:10:44 -08:00
|
|
|
if (type() == TYPE_SMALL_TUPLE)
|
|
|
|
m_size = stream->getByte();
|
|
|
|
else
|
|
|
|
m_size = stream->get32();
|
2009-07-25 02:41:15 +00:00
|
|
|
|
2023-02-16 22:10:44 -08:00
|
|
|
m_values.resize(m_size);
|
|
|
|
for (int i=0; i<m_size; i++)
|
|
|
|
m_values[i] = LoadObject(stream, mod);
|
2009-07-24 21:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* PycDict */
|
|
|
|
void PycDict::load(PycData* stream, PycModule* mod)
|
|
|
|
{
|
2009-07-24 21:39:51 +00:00
|
|
|
PycRef<PycObject> key, val;
|
|
|
|
for (;;) {
|
|
|
|
key = LoadObject(stream, mod);
|
2017-07-05 16:36:04 -07:00
|
|
|
if (key == NULL)
|
2009-07-24 21:39:51 +00:00
|
|
|
break;
|
|
|
|
val = LoadObject(stream, mod);
|
|
|
|
m_keys.push_back(key);
|
|
|
|
m_values.push_back(val);
|
|
|
|
}
|
2009-07-24 21:15:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool PycDict::isEqual(PycRef<PycObject> obj) const
|
|
|
|
{
|
2017-07-05 16:36:04 -07:00
|
|
|
if (type() != obj.type())
|
2009-07-25 02:41:15 +00:00
|
|
|
return false;
|
|
|
|
|
2009-07-24 21:15:51 +00:00
|
|
|
PycRef<PycDict> dictObj = obj.cast<PycDict>();
|
2023-11-09 14:20:15 -08:00
|
|
|
if (m_keys.size() != dictObj->m_keys.size())
|
2009-07-24 21:15:51 +00:00
|
|
|
return false;
|
|
|
|
|
2022-12-01 11:35:14 -08:00
|
|
|
auto ki1 = m_keys.cbegin();
|
|
|
|
auto ki2 = dictObj->m_keys.cbegin();
|
|
|
|
while (ki1 != m_keys.cend()) {
|
2009-07-24 21:15:51 +00:00
|
|
|
if (!(*ki1)->isEqual(*ki2))
|
|
|
|
return false;
|
|
|
|
++ki1, ++ki2;
|
|
|
|
}
|
|
|
|
|
2022-12-01 11:35:14 -08:00
|
|
|
auto vi1 = m_values.cbegin();
|
|
|
|
auto vi2 = dictObj->m_values.cbegin();
|
|
|
|
while (vi1 != m_values.cend()) {
|
2009-07-24 21:15:51 +00:00
|
|
|
if (!(*vi1)->isEqual(*vi2))
|
|
|
|
return false;
|
|
|
|
++vi1, ++vi2;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|