Skip to content

Commit f55397f

Browse files
committed
Add Subtract-on-Evict (SoE)
1 parent 8013e37 commit f55397f

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

rust/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,6 @@ where
4343

4444
/// Recalculate-From-Scratch
4545
pub mod recalc;
46+
47+
/// Subtract-On-Evict
48+
pub mod soe;

rust/src/soe/mod.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use crate::FifoWindow;
2+
use alga::general::AbstractGroup;
3+
use alga::general::Operator;
4+
use std::collections::VecDeque;
5+
use std::marker::PhantomData;
6+
7+
#[derive(Debug)]
8+
pub struct SoE<Value, BinOp>
9+
where
10+
Value: AbstractGroup<BinOp> + Clone,
11+
BinOp: Operator,
12+
{
13+
stack: VecDeque<Value>,
14+
agg: Value,
15+
op: PhantomData<BinOp>,
16+
}
17+
18+
impl<Value, BinOp> FifoWindow<Value, BinOp> for SoE<Value, BinOp>
19+
where
20+
Value: AbstractGroup<BinOp> + Clone,
21+
BinOp: Operator,
22+
{
23+
fn new() -> SoE<Value, BinOp> {
24+
SoE {
25+
stack: VecDeque::new(),
26+
agg: Value::identity(),
27+
op: PhantomData,
28+
}
29+
}
30+
fn push(&mut self, v: Value) {
31+
self.agg = self.agg.operate(&v);
32+
self.stack.push_back(v);
33+
}
34+
fn pop(&mut self) {
35+
if let Some(top) = self.stack.pop_front() {
36+
self.agg = self.agg.operate(&top.two_sided_inverse());
37+
}
38+
}
39+
fn query(&self) -> Value {
40+
self.agg.clone()
41+
}
42+
}

rust/tests/fifo-window.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use alga::general::Operator;
99
use alga::general::TwoSidedInverse;
1010
use rand::Rng;
1111
use swag::recalc::*;
12+
use swag::soe::*;
1213
use swag::*;
1314

1415
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
@@ -100,3 +101,13 @@ fn test1_recalc() {
100101
fn test2_recalc() {
101102
test2::<ReCalc<Value, Sum>>();
102103
}
104+
105+
#[test]
106+
fn test1_soe() {
107+
test1::<SoE<Value, Sum>>();
108+
}
109+
110+
#[test]
111+
fn test2_soe() {
112+
test2::<SoE<Value, Sum>>();
113+
}

0 commit comments

Comments
 (0)