diff --git a/cpp/perspective/src/cpp/context_zero.cpp b/cpp/perspective/src/cpp/context_zero.cpp index 9ab7046c36..fa41f56e2e 100644 --- a/cpp/perspective/src/cpp/context_zero.cpp +++ b/cpp/perspective/src/cpp/context_zero.cpp @@ -55,7 +55,7 @@ t_ctx0::step_end() { } m_traversal->step_end(); - +#ifndef PSP_ENABLE_WASM t_uindex ncols = m_config.get_num_columns(); std::vector rval(ncols); @@ -84,6 +84,7 @@ t_ctx0::step_end() { #endif m_minmax = rval; +#endif } // ASGGrid data interface diff --git a/cpp/perspective/src/cpp/flat_traversal.cpp b/cpp/perspective/src/cpp/flat_traversal.cpp index 06df11d395..06a8f601d6 100644 --- a/cpp/perspective/src/cpp/flat_traversal.cpp +++ b/cpp/perspective/src/cpp/flat_traversal.cpp @@ -248,38 +248,49 @@ t_ftrav::step_end() { auto new_index = std::make_shared>(); new_index->reserve(new_size); - t_pkeyidx_map added; - - for (t_uindex idx = 0, loop_end = m_index->size(); idx < loop_end; ++idx) { - t_mselem& elem = (*m_index)[idx]; - if (!elem.m_deleted) { - new_index->push_back(elem); - added[elem.m_pkey] = idx; - } - } + t_uindex i = 0; + t_multisorter sorter(get_sort_orders(m_sortby)); + std::vector new_rows; for (t_pkmselem_map::const_iterator pkelem_iter = m_new_elems.begin(); pkelem_iter != m_new_elems.end(); ++pkelem_iter) { - - const t_mselem& elem = pkelem_iter->second; - t_pkeyidx_map::const_iterator iter = added.find(pkelem_iter->first); - if (iter == added.end()) { - new_index->push_back(elem); - } else { - (*new_index)[iter->second] = elem; + new_rows.push_back(pkelem_iter->second); + } + std::sort(new_rows.begin(), new_rows.end(), sorter); + for (auto it = new_rows.begin(); it != new_rows.end(); ++it) { + const t_mselem& new_elem = *it; + while (i < m_index->size()) { + const t_mselem& old_elem = (*m_index)[i]; + if (old_elem.m_deleted) { + i++; + m_pkeyidx.erase(old_elem.m_pkey); + } else if (old_elem.m_updated) { + i++; + } else if (sorter(old_elem, new_elem)) { + m_pkeyidx[old_elem.m_pkey] = new_index->size(); + new_index->push_back(old_elem); + i++; + } else { + break; + } } + + m_pkeyidx[new_elem.m_pkey] = new_index->size(); + new_index->push_back(new_elem); } - std::swap(new_index, m_index); - t_multisorter sorter(get_sort_orders(m_sortby)); - std::sort(m_index->begin(), m_index->end(), sorter); - m_pkeyidx.clear(); + while (i < m_index->size()) { + const t_mselem& old_elem = (*m_index)[i++]; + if (old_elem.m_deleted) { + m_pkeyidx.erase(old_elem.m_pkey); + } else if (!old_elem.m_updated) { + m_pkeyidx[old_elem.m_pkey] = new_index->size(); + new_index->push_back(old_elem); + } + } + std::swap(new_index, m_index); m_new_elems.clear(); - - for (t_index idx = 0, loop_end = m_index->size(); idx < loop_end; ++idx) { - m_pkeyidx[(*m_index)[idx].m_pkey] = idx; - } } void @@ -303,7 +314,8 @@ t_ftrav::update_row( } t_mselem mselem; fill_sort_elem(state, config, pkey, mselem); - (*m_index)[pkiter->second] = mselem; + (*m_index)[pkiter->second].m_updated = true; + m_new_elems[pkey] = mselem; } void diff --git a/cpp/perspective/src/cpp/multi_sort.cpp b/cpp/perspective/src/cpp/multi_sort.cpp index da26112e31..550078a028 100644 --- a/cpp/perspective/src/cpp/multi_sort.cpp +++ b/cpp/perspective/src/cpp/multi_sort.cpp @@ -19,30 +19,35 @@ namespace perspective { t_mselem::t_mselem() : m_pkey(mknone()) , m_order(0) - , m_deleted(false) {} + , m_deleted(false) + , m_updated(false) {} t_mselem::t_mselem(const std::vector& row) : m_row(row) , m_pkey(mknone()) , m_order(0) - , m_deleted(false) {} + , m_deleted(false) + , m_updated(false) {} t_mselem::t_mselem(const std::vector& row, t_uindex order) : m_row(row) , m_pkey(mknone()) , m_order(order) - , m_deleted(false) {} + , m_deleted(false) + , m_updated(false) {} t_mselem::t_mselem(const t_tscalar& pkey, const std::vector& row) : m_row(row) , m_pkey(pkey) , m_order(0) - , m_deleted(false) {} + , m_deleted(false) + , m_updated(false) {} t_mselem::t_mselem(const t_mselem& other) { m_pkey = other.m_pkey; m_row = other.m_row; m_deleted = other.m_deleted; + m_updated = other.m_updated; m_order = other.m_order; } @@ -50,6 +55,7 @@ t_mselem::t_mselem(t_mselem&& other) { m_pkey = other.m_pkey; m_row = std::move(other.m_row); m_deleted = other.m_deleted; + m_updated = other.m_updated; m_order = other.m_order; } @@ -59,6 +65,7 @@ t_mselem::operator=(const t_mselem& other) { m_row = other.m_row; m_deleted = other.m_deleted; m_order = other.m_order; + m_updated = other.m_updated; return *this; } @@ -67,6 +74,7 @@ t_mselem::operator=(t_mselem&& other) { m_pkey = other.m_pkey; m_row = std::move(other.m_row); m_deleted = other.m_deleted; + m_updated = other.m_updated; m_order = other.m_order; return *this; } diff --git a/cpp/perspective/src/cpp/storage.cpp b/cpp/perspective/src/cpp/storage.cpp index 917cfdd246..4e15ac3809 100644 --- a/cpp/perspective/src/cpp/storage.cpp +++ b/cpp/perspective/src/cpp/storage.cpp @@ -519,7 +519,9 @@ void t_lstore::clear() { PSP_TRACE_SENTINEL(); PSP_VERBOSE_ASSERT(m_init, "touching uninited object"); +#ifndef PSP_ENABLE_WASM memset(m_base, 0, size_t(capacity())); +#endif { t_unlock_store tmp(this); m_size = 0; diff --git a/cpp/perspective/src/include/perspective/multi_sort.h b/cpp/perspective/src/include/perspective/multi_sort.h index 6ee3d389cb..b9d002876d 100644 --- a/cpp/perspective/src/include/perspective/multi_sort.h +++ b/cpp/perspective/src/include/perspective/multi_sort.h @@ -31,6 +31,7 @@ struct PERSPECTIVE_EXPORT t_mselem { t_tscalar m_pkey; t_uindex m_order; bool m_deleted; + bool m_updated; }; } // end namespace perspective @@ -96,6 +97,8 @@ cmp_mselem(const t_mselem& a, const t_mselem& b, const std::vector& const t_tscalar& second = b.m_row[idx]; t_sorttype order = sort_order[idx]; + +#ifndef PSP_ENABLE_WASM t_nancmp nancmp = nan_compare(order, first, second); if (first.is_floating_point() && nancmp.m_active) { @@ -110,6 +113,7 @@ cmp_mselem(const t_mselem& a, const t_mselem& b, const std::vector& default: { continue; } break; } } +#endif if (first == second) continue;