dsrs 0.6.1

Rusty wrapper for Apache DataSketches
Documentation
#include <cstdint>
#include <iostream>
#include <vector>
#include <memory>

#include "rust/cxx.h"

#include "dsrs/src/bridge.rs.h"
#include "fi/include/frequent_items_sketch.hpp"
#include "hh.hpp"

std::unique_ptr<std::vector<ThinHeavyHitterRow>> convert_to_thin(OpaqueHhSketch::hhsketch::vector_row v) {
  std::vector<ThinHeavyHitterRow> result(v.size());
  for (std::size_t i = 0; i < v.size(); ++i) {
    auto& row = v[i];
    auto& target = result[i];
    target.addr = row.get_item();
    target.lb = row.get_lower_bound();
    target.ub = row.get_upper_bound();
  }
  auto ptr = new std::vector<ThinHeavyHitterRow>(std::move(result));
  return std::unique_ptr<std::vector<ThinHeavyHitterRow>>(ptr);
}

std::unique_ptr<std::vector<ThinHeavyHitterRow>> OpaqueHhSketch::estimate_no_fp() const {
  return convert_to_thin(this->inner_.get_frequent_items(datasketches::NO_FALSE_POSITIVES));
}

std::unique_ptr<std::vector<ThinHeavyHitterRow>> OpaqueHhSketch::estimate_no_fn() const {
  return convert_to_thin(this->inner_.get_frequent_items(datasketches::NO_FALSE_NEGATIVES));
}

void OpaqueHhSketch::update(size_t value, uint64_t weight) {
  this->inner_.update(value, weight);
}

OpaqueHhSketch::OpaqueHhSketch(hhsketch&& sketch):
  inner_{sketch} {
}

std::unique_ptr<std::vector<ThinHeavyHitterRow>> OpaqueHhSketch::state() const {
  return convert_to_thin(this->inner_.get_frequent_items(datasketches::NO_FALSE_NEGATIVES, 0));
}

void OpaqueHhSketch::set_weights(uint64_t total_weight, uint64_t offset) {
  this->inner_.set_weights(total_weight, offset);
}

uint64_t OpaqueHhSketch::get_total_weight() const {
  return this->inner_.get_total_weight();
}

uint64_t OpaqueHhSketch::get_offset() const {
  return this->inner_.get_offset();
}

std::unique_ptr<OpaqueHhSketch> new_opaque_hh_sketch(uint8_t lg2_k, size_t hashset_addr) {
  OpaqueHhSketch::hhsketch sketch(lg2_k, hashset_addr);
  auto ptr = new OpaqueHhSketch(std::move(sketch));
  return std::unique_ptr<OpaqueHhSketch>(ptr);
}