#pragma once
#include <cudf/null_mask.hpp>
#include <cudf/column/column.hpp>
#include <cudf/types.hpp>
#include <rmm/device_buffer.hpp>
#include <memory>
#include <vector>
#include "rust/cxx.h"
#include "column_shim.h"
namespace cudf_shims {
struct OwnedDeviceBuffer {
rmm::device_buffer inner;
explicit OwnedDeviceBuffer(rmm::device_buffer buf)
: inner(std::move(buf)) {}
int32_t size_bytes() const {
return static_cast<int32_t>(inner.size());
}
};
int32_t valid_count(const OwnedColumn& col);
std::unique_ptr<OwnedColumn> set_all_valid(const OwnedColumn& col);
std::unique_ptr<OwnedDeviceBuffer> create_null_mask(
int32_t size, int32_t state);
int32_t null_count_column(const OwnedColumn& col);
int32_t bitmask_allocation_size(int32_t number_of_bits);
void copy_null_mask_to_host(
const OwnedColumn& col,
rust::Slice<uint8_t> out);
std::unique_ptr<OwnedColumn> set_null_mask_from_host(
const OwnedColumn& col,
rust::Slice<const uint8_t> mask,
int32_t null_count);
std::unique_ptr<OwnedColumn> set_null_mask_range(
const OwnedColumn& col,
int32_t begin_bit,
int32_t end_bit,
bool valid);
rust::Vec<uint8_t> copy_bitmask_to_host(const OwnedColumn& col);
struct BitmaskBuilder {
std::vector<cudf::column_view> views;
void add_column(const OwnedColumn& col) {
views.push_back(col.view());
}
int32_t num_columns() const {
return static_cast<int32_t>(views.size());
}
};
struct BitmaskResult {
rust::Vec<uint8_t> mask;
int32_t null_count;
rust::Vec<uint8_t> get_mask() const { return mask; }
int32_t get_null_count() const { return null_count; }
};
std::unique_ptr<BitmaskBuilder> bitmask_builder_new();
std::unique_ptr<BitmaskResult> bitmask_and(const BitmaskBuilder& builder);
std::unique_ptr<BitmaskResult> bitmask_or(const BitmaskBuilder& builder);
int32_t state_null_count(int32_t state, int32_t size);
int32_t num_bitmask_words(int32_t number_of_bits);
}