apache-datasketches-sys 0.2.1

Raw cxx bridge to Apache DataSketches C++ (do not use directly; see apache-datasketches)
Documentation
#pragma once
#include <cstdint>
#include <memory>
#include <stdexcept>
#include <string>
#include <vector>
#include "rust/cxx.h"
#include "array_of_doubles_sketch.hpp"

namespace apache_datasketches_rs {

// Forward declaration matching the enum generated by cxx from
// src/array_of_doubles_sketch.rs. We deliberately do NOT
// `#include "array_of_doubles_sketch.rs.h"` here, for the same reason
// documented in theta_sketch_shim.h: the generated header's own `include!`
// directive re-enters this header while it is still being processed. The full
// enum definition is pulled in by array_of_doubles_sketch_shim.cc after this
// header.
//
// The enum is named TupleResizeFactor rather than ResizeFactor because cxx
// emits one C++ definition per shared type into this namespace, and the theta
// bridge already emits apache_datasketches_rs::ResizeFactor there.
enum class TupleResizeFactor : std::uint8_t;

// Forward declaration; defined in array_of_doubles_compact_shim.h.
class CompactArrayOfDoublesSketchShim;

// Defined once, in array_of_doubles_sketch_shim.cc; forward-declared in every
// other tuple shim header that needs it (currently the union shim). Both
// translation units land in the same static library, so a single definition
// satisfies the One Definition Rule. Same pattern as theta's
// to_cpp_resize_factor.
datasketches::resize_factor to_cpp_tuple_resize_factor(TupleResizeFactor rf);

class ArrayOfDoublesSketchShim {
public:
  explicit ArrayOfDoublesSketchShim(uint8_t lg_k, TupleResizeFactor rf, float p, uint8_t num_values);

  void update_u64(uint64_t key, rust::Slice<const double> values);
  void update_i64(int64_t key, rust::Slice<const double> values);
  void update_u32(uint32_t key, rust::Slice<const double> values);
  void update_i32(int32_t key, rust::Slice<const double> values);
  void update_u16(uint16_t key, rust::Slice<const double> values);
  void update_i16(int16_t key, rust::Slice<const double> values);
  void update_u8(uint8_t key, rust::Slice<const double> values);
  void update_i8(int8_t key, rust::Slice<const double> values);
  void update_f64(double key, rust::Slice<const double> values);
  void update_str(rust::Str key, rust::Slice<const double> values);
  void update_bytes(rust::Slice<const uint8_t> key, rust::Slice<const double> values);

  void trim();
  void reset();

  double get_estimate() const;
  double get_lower_bound(uint8_t num_std_dev) const;
  double get_upper_bound(uint8_t num_std_dev) const;
  bool is_empty() const;
  bool is_estimation_mode() const;
  bool is_ordered() const;
  double get_theta() const;
  uint32_t get_num_retained() const;
  uint8_t get_num_values() const;

  std::unique_ptr<CompactArrayOfDoublesSketchShim> compact(bool ordered) const;

  rust::Vec<uint64_t> entry_hashes() const;
  rust::Vec<double> entry_values() const;

  const datasketches::update_array_of_doubles_sketch& inner() const { return sketch_; }

private:
  datasketches::update_array_of_doubles_sketch sketch_;
};

std::unique_ptr<ArrayOfDoublesSketchShim> new_array_of_doubles_sketch(uint8_t lg_k, TupleResizeFactor rf, float p, uint8_t num_values);

} // namespace apache_datasketches_rs