Files
Emily Boudreaux ec13264050 feat(reflect-cpp): Switched from glaze -> reflect cpp
A bug was discovered in glaze which prevented valid toml output. We have
switched to toml++ and reflect-cpp. The interface has remained the same
so this should not break any code
2025-12-06 10:55:46 -05:00

89 lines
2.1 KiB
C++

#ifndef RFL_PARSING_TABULAR_CHUNKEDARRAYITERATOR_HPP_
#define RFL_PARSING_TABULAR_CHUNKEDARRAYITERATOR_HPP_
#include <arrow/api.h>
#include "../../Ref.hpp"
#include "../../Result.hpp"
#include "../../internal/ptr_cast.hpp"
#include "../is_required.hpp"
#include "array_t.hpp"
namespace rfl::parsing::tabular {
template <class T, SerializationType _s>
class ChunkedArrayIterator {
public:
using difference_type = std::ptrdiff_t;
using value_type = Result<T>;
using ArrayType = array_t<T, _s>;
static ChunkedArrayIterator make(const Ref<arrow::ChunkedArray>& _arr) {
return ChunkedArrayIterator(_arr);
}
ChunkedArrayIterator(const Ref<arrow::ChunkedArray>& _arr)
: arr_(_arr), chunk_ix_(0), current_chunk_(get_chunk(arr_, 0)), ix_(0) {}
~ChunkedArrayIterator() = default;
Result<T> operator*() const noexcept {
const bool is_null =
current_chunk_
.transform([&](const auto& _c) { return _c->IsNull(ix_); })
.value_or(false);
if (is_null) {
if constexpr (is_required<T, false>()) {
return error("Value cannot be null.");
} else {
return T();
}
}
return current_chunk_.and_then(
[&](const auto& _c) { return ArrowTypes<T, _s>::get_value(_c, ix_); });
}
bool end() const noexcept { return chunk_ix_ >= arr_->num_chunks(); }
ChunkedArrayIterator& operator++() noexcept {
if (!current_chunk_) {
return *this;
}
++ix_;
if (ix_ >= (*current_chunk_)->length()) {
++chunk_ix_;
current_chunk_ = get_chunk(arr_, chunk_ix_);
ix_ = 0;
}
return *this;
}
void operator++(int) noexcept { ++*this; }
private:
static Result<Ref<ArrayType>> get_chunk(const Ref<arrow::ChunkedArray>& _arr,
const int _chunk_ix) noexcept {
if (_chunk_ix < _arr->num_chunks()) {
return ArrowTypes<T, _s>::get_array(_arr->chunk(_chunk_ix));
} else {
return error("chunk_ix out of bounds.");
}
}
private:
Ref<arrow::ChunkedArray> arr_;
int chunk_ix_;
Result<Ref<ArrayType>> current_chunk_;
int64_t ix_;
};
} // namespace rfl::parsing::tabular
#endif