RangeQueryResult: do not require Clone and do not provide default combine/add implementations

This commit is contained in:
Egor Suvorov
2022-11-24 00:11:52 +02:00
parent b01a93be60
commit 29b39301fe
2 changed files with 23 additions and 17 deletions
+7 -15
View File
@@ -11,22 +11,14 @@ pub trait RangeQueryResult<Key>: Sized {
// Contract: left_range.end == right_range.start
// left_range.start == left_range.end == right_range.start == right_range.end is still possible
fn combine(left: &Self, left_range: &Range<Key>, right: &Self, right_range: &Range<Key>) -> Self
where
Self: Clone,
{
let mut left = left.clone();
Self::add(&mut left, left_range, right, right_range);
left
}
fn combine(
left: &Self,
left_range: &Range<Key>,
right: &Self,
right_range: &Range<Key>,
) -> Self;
// TODO: does it work with non-Clone?
fn add(left: &mut Self, left_range: &Range<Key>, right: &Self, right_range: &Range<Key>)
where
Self: Clone,
{
*left = Self::combine(left, left_range, right, right_range);
}
fn add(left: &mut Self, left_range: &Range<Key>, right: &Self, right_range: &Range<Key>);
}
pub trait LazyRangeInitializer<Result: RangeQueryResult<Key>, Key> {
+16 -2
View File
@@ -3,7 +3,7 @@
use crate::ops::SameElementsInitializer;
use crate::{LazyRangeInitializer, RangeModification, RangeQueryResult};
use std::borrow::Borrow;
use std::ops::{AddAssign, Range};
use std::ops::{Add, AddAssign, Range};
// TODO: commutative Add
@@ -18,11 +18,25 @@ impl<T> SumResult<T> {
}
}
impl<T: for<'a> AddAssign<&'a T> + From<u8>, Key> RangeQueryResult<Key> for SumResult<T> {
impl<T: for<'a> AddAssign<&'a T> + From<u8>, Key> RangeQueryResult<Key> for SumResult<T>
where
for<'a> &'a T: Add<&'a T, Output = T>,
{
fn new_for_empty_range() -> Self {
SumResult { sum: 0.into() }
}
fn combine(
left: &Self,
_left_range: &Range<Key>,
right: &Self,
_right_range: &Range<Key>,
) -> Self {
SumResult {
sum: &left.sum + &right.sum,
}
}
fn add(left: &mut Self, _left_range: &Range<Key>, right: &Self, _right_range: &Range<Key>) {
left.sum += &right.sum
}