This is an automated email from the ASF dual-hosted git repository. alsay pushed a commit to branch tuple_sketch in repository https://gitbox.apache.org/repos/asf/incubator-datasketches-cpp.git
The following commit(s) were added to refs/heads/tuple_sketch by this push: new b1124b7 removed duplication b1124b7 is described below commit b1124b7aa4165c8e855f3987df47ad9b7300ba41 Author: AlexanderSaydakov <alexandersayda...@users.noreply.github.com> AuthorDate: Fri Jul 10 12:40:59 2020 -0700 removed duplication --- tuple/include/theta_union_base.hpp | 5 ++--- tuple/include/theta_union_base_impl.hpp | 34 +++++++++++---------------------- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/tuple/include/theta_union_base.hpp b/tuple/include/theta_union_base.hpp index fbe4cf7..6e3823f 100644 --- a/tuple/include/theta_union_base.hpp +++ b/tuple/include/theta_union_base.hpp @@ -40,9 +40,8 @@ public: theta_union_base(uint8_t lg_cur_size, uint8_t lg_nom_size, resize_factor rf, float p, uint64_t seed, const Policy& policy); - // TODO: try to avoid duplication - void update(const Sketch& sketch); - void update(Sketch&& sketch); + template<typename FwdSketch> + void update(FwdSketch&& sketch); CompactSketch get_result(bool ordered = true) const; diff --git a/tuple/include/theta_union_base_impl.hpp b/tuple/include/theta_union_base_impl.hpp index 63c0f0f..4a62af2 100644 --- a/tuple/include/theta_union_base_impl.hpp +++ b/tuple/include/theta_union_base_impl.hpp @@ -28,30 +28,18 @@ table_(lg_cur_size, lg_nom_size, rf, p, seed), union_theta_(table_.theta_) {} -template<typename EN, typename EK, typename P, typename S, typename CS, typename A> -void theta_union_base<EN, EK, P, S, CS, A>::update(const S& sketch) { - if (sketch.is_empty()) return; - if (sketch.get_seed_hash() != compute_seed_hash(table_.seed_)) throw std::invalid_argument("seed hash mismatch"); - table_.is_empty_ = false; - if (sketch.get_theta64() < union_theta_) union_theta_ = sketch.get_theta64(); - for (const auto& entry: sketch) { - const uint64_t hash = EK()(entry); - if (hash < union_theta_) { - auto result = table_.find(hash); - if (!result.second) { - table_.insert(result.first, entry); - } else { - policy_(*result.first, entry); - } - } else { - if (sketch.is_ordered()) break; // early stop - } - } - if (table_.theta_ < union_theta_) union_theta_ = table_.theta_; +template<typename Container, typename Element> +using fwd_type = typename std::conditional<std::is_lvalue_reference<Container>::value, + Element, typename std::remove_reference<Element>::type&&>::type; + +template<typename Container, typename Element> +fwd_type<Container, Element> forward_element(Element&& element) { + return std::forward<fwd_type<Container, Element>>(std::forward<Element>(element)); } template<typename EN, typename EK, typename P, typename S, typename CS, typename A> -void theta_union_base<EN, EK, P, S, CS, A>::update(S&& sketch) { +template<typename SS> +void theta_union_base<EN, EK, P, S, CS, A>::update(SS&& sketch) { if (sketch.is_empty()) return; if (sketch.get_seed_hash() != compute_seed_hash(table_.seed_)) throw std::invalid_argument("seed hash mismatch"); table_.is_empty_ = false; @@ -61,9 +49,9 @@ void theta_union_base<EN, EK, P, S, CS, A>::update(S&& sketch) { if (hash < union_theta_) { auto result = table_.find(hash); if (!result.second) { - table_.insert(result.first, std::move(entry)); + table_.insert(result.first, forward_element<SS>(entry)); } else { - policy_(*result.first, std::move(entry)); + policy_(*result.first, forward_element<SS>(entry)); } } else { if (sketch.is_ordered()) break; // early stop --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@datasketches.apache.org For additional commands, e-mail: commits-h...@datasketches.apache.org