19 m_keys = (Value*)malloc(m_capacity *
sizeof(Value));
20 m_values = (Value*)malloc(m_capacity *
sizeof(Value));
21 memset(m_keys, 0, m_capacity);
22 memset(m_values, 0, m_capacity);
58void ESTable::set(
const Value &key,
const Value &value)
60 for (uint i = 0; i < m_size; ++i) {
61 if (m_keys[i].sameValueZero(key)) {
67 if (m_capacity == m_size) {
68 uint oldCap = m_capacity;
70 m_keys = (Value*)realloc(m_keys, m_capacity *
sizeof(Value));
71 m_values = (Value*)realloc(m_values, m_capacity *
sizeof(Value));
72 memset(m_keys + oldCap, 0, m_capacity - oldCap);
73 memset(m_values + oldCap, 0, m_capacity - oldCap);
78 if (nk.doubleValue() == 0 && std::signbit(nk.doubleValue()))
79 nk = Value::fromDouble(+0);
83 m_values[m_size] = value;
117bool ESTable::remove(
const Value &key)
119 for (uint index = 0; index < m_size; ++index) {
120 if (m_keys[index].sameValueZero(key)) {
123 size_t count = (m_size - (index + 1)) *
sizeof(Value);
124 memmove(m_keys + index, m_keys + index + 1, count);
125 memmove(m_values + index, m_values + index + 1, count);
128 std::for_each(m_observers.begin(), m_observers.end(), [index](ShiftObserver* ob) {
130 if (index <= ob->pivot && ob->pivot != ShiftObserver::OUT_OF_TABLE)
131 ob->pivot = ob->pivot == 0 ? ShiftObserver::OUT_OF_TABLE : ob->pivot - 1;
157void ESTable::removeUnmarkedKeys()
161 for (; idx < m_size; ++idx) {
162 Q_ASSERT(m_keys[idx].isObject());
163 Object &o =
static_cast<Object &>(m_keys[idx]);
164 if (o.d()->isMarked()) {
165 m_keys[toIdx] = m_keys[idx];
166 m_values[toIdx] = m_values[idx];