#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 {
enum class TupleResizeFactor : std::uint8_t;
class CompactArrayOfDoublesSketchShim;
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);
}