Merge remote-tracking branch 'origin/master' into cleanup_warnings
diff --git a/kll/include/kll_quantile_calculator_impl.hpp b/kll/include/kll_quantile_calculator_impl.hpp
index 23efa4d..ff6e547 100644
--- a/kll/include/kll_quantile_calculator_impl.hpp
+++ b/kll/include/kll_quantile_calculator_impl.hpp
@@ -129,10 +129,11 @@
const uint8_t num_levels_2 = num_levels - num_levels_1;
const uint8_t starting_level_1 = starting_level;
const uint8_t starting_level_2 = starting_level + num_levels_1;
- const auto chunk_begin = temp.begin() + temp.size();
+ const auto initial_size = temp.size();
merge_sorted_blocks_reversed(orig, temp, levels, starting_level_1, num_levels_1);
merge_sorted_blocks_reversed(orig, temp, levels, starting_level_2, num_levels_2);
const uint32_t num_items_1 = levels[starting_level_1 + num_levels_1] - levels[starting_level_1];
+ const auto chunk_begin = temp.begin() + initial_size;
std::merge(
std::make_move_iterator(chunk_begin), std::make_move_iterator(chunk_begin + num_items_1),
std::make_move_iterator(chunk_begin + num_items_1), std::make_move_iterator(temp.end()),
diff --git a/kll/include/kll_sketch_impl.hpp b/kll/include/kll_sketch_impl.hpp
index 3492058..9caf14e 100644
--- a/kll/include/kll_sketch_impl.hpp
+++ b/kll/include/kll_sketch_impl.hpp
@@ -1059,14 +1059,14 @@
template <typename T, typename C, typename S, typename A>
typename kll_sketch<T, C, S, A>::const_iterator kll_sketch<T, C, S, A>::end() const {
- return kll_sketch<T, C, S, A>::const_iterator(nullptr, nullptr, num_levels_);
+ return kll_sketch<T, C, S, A>::const_iterator(nullptr, levels_.data(), num_levels_);
}
// kll_sketch::const_iterator implementation
template<typename T, typename C, typename S, typename A>
kll_sketch<T, C, S, A>::const_iterator::const_iterator(const T* items, const uint32_t* levels, const uint8_t num_levels):
-items(items), levels(levels), num_levels(num_levels), index(levels == nullptr ? 0 : levels[0]), level(levels == nullptr ? num_levels : 0), weight(1)
+items(items), levels(levels), num_levels(num_levels), index(items == nullptr ? levels[num_levels] : levels[0]), level(items == nullptr ? num_levels : 0), weight(1)
{}
template<typename T, typename C, typename S, typename A>
@@ -1090,8 +1090,6 @@
template<typename T, typename C, typename S, typename A>
bool kll_sketch<T, C, S, A>::const_iterator::operator==(const const_iterator& other) const {
- if (level != other.level) return false;
- if (level == num_levels) return true; // end
return index == other.index;
}
diff --git a/kll/test/kll_sketch_test.cpp b/kll/test/kll_sketch_test.cpp
index 891b83b..b51f98b 100644
--- a/kll/test/kll_sketch_test.cpp
+++ b/kll/test/kll_sketch_test.cpp
@@ -73,9 +73,8 @@
int count = 0;
for (auto it: sketch) {
(void) it; // to suppress "unused" warning
- ++count;
+ FAIL("should be no iterations over an empty sketch");
}
- REQUIRE(count == 0);
}
SECTION("get bad quantile") {
@@ -123,7 +122,7 @@
SECTION("many items, exact mode") {
kll_float_sketch sketch(200, 0);
- const uint32_t n(200);
+ const uint32_t n = 200;
for (uint32_t i = 0; i < n; i++) {
sketch.update(i);
REQUIRE(sketch.get_n() == i + 1);
@@ -224,6 +223,15 @@
}
//std::cout << sketch.to_string();
+
+ uint32_t count = 0;
+ uint64_t total_weight = 0;
+ for (auto it: sketch) {
+ ++count;
+ total_weight += it.second;
+ }
+ REQUIRE(count == sketch.get_num_retained());
+ REQUIRE(total_weight == sketch.get_n());
}
SECTION("consistency between get_rank adn get_PMF/CDF") {