Consolodate ArrayData position-based iterator methods

Implement these all in ArrayData, using iter_begin, advance,
rewind, and iter_end virtual methods.  Only SharedMap didn't
override the iter_* methods, so moved ArrayData's implementation
to SharedMap and tailored it a bit.  Fetch SharedMap's size at
construction time to avoid calls to SharedMap::vsize().
Removed HphpArray and NameValueTableWrapper implementations of
these methods.
Esse commit está contido em:
Edwin Smith
2013-07-02 17:23:46 -07:00
commit de Sara Golemon
commit 047ef325bb
10 arquivos alterados com 26 adições e 331 exclusões
-102
Ver Arquivo
@@ -307,102 +307,6 @@ bool HphpArray::isVectorData() const {
return true;
}
Variant HphpArray::reset() {
Elm* elms = m_data;
m_pos = ssize_t(nextElm(elms, ElmIndEmpty));
if (m_pos != ArrayData::invalid_index) {
Elm* e = &elms[(ElmInd)m_pos];
return tvAsCVarRef(&e->data);
}
m_pos = ArrayData::invalid_index;
return false;
}
Variant HphpArray::prev() {
if (m_pos != ArrayData::invalid_index) {
Elm* elms = m_data;
m_pos = prevElm(elms, m_pos);
if (m_pos != ArrayData::invalid_index) {
Elm* e = &elms[m_pos];
return tvAsCVarRef(&e->data);
}
}
return false;
}
Variant HphpArray::next() {
if (m_pos != ArrayData::invalid_index) {
Elm* elms = m_data;
m_pos = nextElm(elms, m_pos);
if (m_pos != ArrayData::invalid_index) {
Elm* e = &elms[m_pos];
assert(!isTombstone(e->data.m_type));
return tvAsCVarRef(&e->data);
}
}
return false;
}
Variant HphpArray::end() {
Elm* elms = m_data;
m_pos = prevElm(elms, m_used);
if (m_pos != ArrayData::invalid_index) {
Elm* e = &elms[m_pos];
assert(!isTombstone(e->data.m_type));
return tvAsCVarRef(&e->data);
}
return false;
}
Variant HphpArray::key() const {
if (m_pos != ArrayData::invalid_index) {
assert(size_t(m_pos) < m_used);
Elm* e = &m_data[m_pos];
assert(!isTombstone(e->data.m_type));
if (e->hasStrKey()) {
return e->key;
}
return e->ikey;
}
return uninit_null();
}
Variant HphpArray::value(int32_t& pos) const {
if (pos != ArrayData::invalid_index) {
Elm* e = &m_data[pos];
assert(!isTombstone(e->data.m_type));
return tvAsCVarRef(&e->data);
}
return false;
}
Variant HphpArray::current() const {
if (m_pos != ArrayData::invalid_index) {
Elm* e = &m_data[m_pos];
assert(!isTombstone(e->data.m_type));
return tvAsCVarRef(&e->data);
}
return false;
}
static StaticString s_value("value");
static StaticString s_key("key");
Variant HphpArray::each() {
if (m_pos != ArrayData::invalid_index) {
ArrayInit init(4);
Variant key = HphpArray::getKey(m_pos);
Variant value = HphpArray::getValue(m_pos);
init.set(int64_t(1), value);
init.set(s_value, value, true);
init.set(int64_t(0), key);
init.set(s_key, key, true);
m_pos = nextElm(m_data, m_pos);
return Array(init.create());
}
return false;
}
//=============================================================================
// Lookup.
@@ -1544,12 +1448,6 @@ bool HphpArray::advanceFullPos(FullPos& fp) {
return true;
}
CVarRef HphpArray::endRef() {
assert(m_used > 0);
Elm* e = &m_data[m_used - 1];
return tvAsCVarRef(&e->data);
}
//=============================================================================
ALWAYS_INLINE HphpArray* HphpArray::clone(AllocationMode am) const {