use std::any::Any;
use crate::boundary::BindingBoundary;
use crate::handle::{HandleId, NO_HANDLE};
pub(crate) trait OperatorScratch: Any + Send + Sync + std::fmt::Debug {
fn release_handles(&mut self, binding: &dyn BindingBoundary);
fn as_any_mut(&mut self) -> &mut dyn Any;
fn as_any_ref(&self) -> &dyn Any;
}
#[derive(Debug)]
pub(crate) struct ScanState {
pub(crate) acc: HandleId,
}
impl Default for ScanState {
fn default() -> Self {
Self { acc: NO_HANDLE }
}
}
impl OperatorScratch for ScanState {
fn release_handles(&mut self, binding: &dyn BindingBoundary) {
if self.acc != NO_HANDLE {
binding.release_handle(self.acc);
self.acc = NO_HANDLE;
}
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug)]
pub(crate) struct ReduceState {
pub(crate) acc: HandleId,
}
impl Default for ReduceState {
fn default() -> Self {
Self { acc: NO_HANDLE }
}
}
impl OperatorScratch for ReduceState {
fn release_handles(&mut self, binding: &dyn BindingBoundary) {
if self.acc != NO_HANDLE {
binding.release_handle(self.acc);
self.acc = NO_HANDLE;
}
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug)]
pub(crate) struct DistinctState {
pub(crate) prev: HandleId,
}
impl Default for DistinctState {
fn default() -> Self {
Self { prev: NO_HANDLE }
}
}
impl OperatorScratch for DistinctState {
fn release_handles(&mut self, binding: &dyn BindingBoundary) {
if self.prev != NO_HANDLE {
binding.release_handle(self.prev);
self.prev = NO_HANDLE;
}
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug)]
pub(crate) struct PairwiseState {
pub(crate) prev: HandleId,
}
impl Default for PairwiseState {
fn default() -> Self {
Self { prev: NO_HANDLE }
}
}
impl OperatorScratch for PairwiseState {
fn release_handles(&mut self, binding: &dyn BindingBoundary) {
if self.prev != NO_HANDLE {
binding.release_handle(self.prev);
self.prev = NO_HANDLE;
}
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug, Default)]
pub(crate) struct TakeState {
pub(crate) count_emitted: u32,
}
impl OperatorScratch for TakeState {
fn release_handles(&mut self, _binding: &dyn BindingBoundary) {
self.count_emitted = 0;
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug, Default)]
pub(crate) struct SkipState {
pub(crate) count_skipped: u32,
}
impl OperatorScratch for SkipState {
fn release_handles(&mut self, _binding: &dyn BindingBoundary) {
self.count_skipped = 0;
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug, Default)]
pub(crate) struct TakeWhileState;
impl OperatorScratch for TakeWhileState {
fn release_handles(&mut self, _binding: &dyn BindingBoundary) {
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug)]
pub(crate) struct LastState {
pub(crate) latest: HandleId,
pub(crate) default: HandleId,
}
impl Default for LastState {
fn default() -> Self {
Self {
latest: NO_HANDLE,
default: NO_HANDLE,
}
}
}
impl OperatorScratch for LastState {
fn release_handles(&mut self, binding: &dyn BindingBoundary) {
if self.latest != NO_HANDLE {
binding.release_handle(self.latest);
self.latest = NO_HANDLE;
}
if self.default != NO_HANDLE {
binding.release_handle(self.default);
self.default = NO_HANDLE;
}
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug, Default)]
pub(crate) struct TapFirstState {
pub(crate) fired: bool,
}
impl OperatorScratch for TapFirstState {
fn release_handles(&mut self, _binding: &dyn BindingBoundary) {
self.fired = false;
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
#[derive(Debug, Default)]
pub(crate) struct SettleState {
pub(crate) quiet_count: u32,
pub(crate) wave_count: u32,
pub(crate) has_value: bool,
}
impl OperatorScratch for SettleState {
fn release_handles(&mut self, _binding: &dyn BindingBoundary) {
self.quiet_count = 0;
self.wave_count = 0;
self.has_value = false;
}
fn as_any_mut(&mut self) -> &mut dyn Any {
self
}
fn as_any_ref(&self) -> &dyn Any {
self
}
}
const _: fn() = || {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<ScanState>();
assert_send_sync::<ReduceState>();
assert_send_sync::<DistinctState>();
assert_send_sync::<PairwiseState>();
assert_send_sync::<TakeState>();
assert_send_sync::<SkipState>();
assert_send_sync::<TakeWhileState>();
assert_send_sync::<LastState>();
assert_send_sync::<TapFirstState>();
assert_send_sync::<SettleState>();
assert_send_sync::<Box<dyn OperatorScratch>>();
};