This is an automated email from the ASF dual-hosted git repository. jmalkin pushed a commit to branch quantiles_patch in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git
commit 65a3002ea7b3228dcf74abe5dc83e6633a2135e2 Author: Jon Malkin <[email protected]> AuthorDate: Thu Jun 2 23:11:39 2022 -0700 fixes for type converting constructor, align documentation with kll --- quantiles/include/quantiles_sketch.hpp | 5 +++++ quantiles/include/quantiles_sketch_impl.hpp | 9 ++++---- quantiles/test/quantiles_sketch_test.cpp | 32 +++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/quantiles/include/quantiles_sketch.hpp b/quantiles/include/quantiles_sketch.hpp index acf430a..b09c552 100644 --- a/quantiles/include/quantiles_sketch.hpp +++ b/quantiles/include/quantiles_sketch.hpp @@ -162,6 +162,11 @@ public: quantiles_sketch& operator=(const quantiles_sketch& other); quantiles_sketch& operator=(quantiles_sketch&& other) noexcept; + /** + * @brief Type converting constructor + * @param other quantiles sketch of a different type + * @param allocator instance of an Allocator + */ template<typename From, typename FC, typename FA> explicit quantiles_sketch(const quantiles_sketch<From, FC, FA>& other, const Allocator& allocator = Allocator()); diff --git a/quantiles/include/quantiles_sketch_impl.hpp b/quantiles/include/quantiles_sketch_impl.hpp index e9fb4f7..f1df570 100644 --- a/quantiles/include/quantiles_sketch_impl.hpp +++ b/quantiles/include/quantiles_sketch_impl.hpp @@ -151,9 +151,8 @@ min_value_(nullptr), max_value_(nullptr), is_sorted_(false) { - static_assert(std::is_convertible<From, T>::value - || std::is_constructible<From, T>::value, - "Copy constructor across types requires std::is_convertible or std::is_constructible"); + static_assert(std::is_constructible<T, From>::value, + "Type converting constructor requires new type to be constructible from existing type"); base_buffer_.reserve(2 * std::min(quantiles_constants::MIN_K, k_)); @@ -174,7 +173,7 @@ is_sorted_(false) for (auto pair : other) { const uint64_t wt = pair.second; if (wt == 1) { - base_buffer_.push_back(pair.first); + base_buffer_.push_back(T(pair.first)); // resize where needed as if adding points via update() if (base_buffer_.size() + 1 > base_buffer_.capacity()) { const size_t new_size = std::max(std::min(static_cast<size_t>(2 * k_), 2 * base_buffer_.size()), static_cast<size_t>(1)); @@ -183,7 +182,7 @@ is_sorted_(false) } else { const uint8_t idx = count_trailing_zeros_in_u64(pair.second) - 1; - levels_[idx].push_back(pair.first); + levels_[idx].push_back(T(pair.first)); } } diff --git a/quantiles/test/quantiles_sketch_test.cpp b/quantiles/test/quantiles_sketch_test.cpp index 6e5de34..3effada 100644 --- a/quantiles/test/quantiles_sketch_test.cpp +++ b/quantiles/test/quantiles_sketch_test.cpp @@ -934,6 +934,38 @@ TEST_CASE("quantiles sketch", "[quantiles_sketch]") { } } + class A { + int val; + public: + A(int val): val(val) {} + int get_val() const { return val; } + }; + + struct less_A { + bool operator()(const A& a1, const A& a2) const { return a1.get_val() < a2.get_val(); } + }; + + class B { + int val; + public: + explicit B(const A& a): val(a.get_val()) {} + int get_val() const { return val; } + }; + + struct less_B { + bool operator()(const B& b1, const B& b2) const { return b1.get_val() < b2.get_val(); } + }; + + SECTION("type conversion: custom types") { + quantiles_sketch<A, less_A> sa; + sa.update(1); + sa.update(2); + sa.update(3); + + quantiles_sketch<B, less_B> sb(sa); + REQUIRE(sb.get_n() == 3); + } + // cleanup if (test_allocator_total_bytes != 0) { REQUIRE(test_allocator_total_bytes == 0); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
