From 29b39301fe73559c51bc61c79076ebe5a9699605 Mon Sep 17 00:00:00 2001 From: Egor Suvorov Date: Thu, 24 Nov 2022 00:11:52 +0200 Subject: [PATCH] RangeQueryResult: do not require Clone and do not provide default combine/add implementations --- libs/persistent_range_query/src/lib.rs | 22 +++++++--------------- libs/persistent_range_query/src/ops/rsq.rs | 18 ++++++++++++++++-- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/libs/persistent_range_query/src/lib.rs b/libs/persistent_range_query/src/lib.rs index e743608573..da139a5a29 100644 --- a/libs/persistent_range_query/src/lib.rs +++ b/libs/persistent_range_query/src/lib.rs @@ -11,22 +11,14 @@ pub trait RangeQueryResult: 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, right: &Self, right_range: &Range) -> 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, + right: &Self, + right_range: &Range, + ) -> Self; - // TODO: does it work with non-Clone? - fn add(left: &mut Self, left_range: &Range, right: &Self, right_range: &Range) - where - Self: Clone, - { - *left = Self::combine(left, left_range, right, right_range); - } + fn add(left: &mut Self, left_range: &Range, right: &Self, right_range: &Range); } pub trait LazyRangeInitializer, Key> { diff --git a/libs/persistent_range_query/src/ops/rsq.rs b/libs/persistent_range_query/src/ops/rsq.rs index 386bfa7979..5d8e2dfd86 100644 --- a/libs/persistent_range_query/src/ops/rsq.rs +++ b/libs/persistent_range_query/src/ops/rsq.rs @@ -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 SumResult { } } -impl AddAssign<&'a T> + From, Key> RangeQueryResult for SumResult { +impl AddAssign<&'a T> + From, Key> RangeQueryResult for SumResult +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, + right: &Self, + _right_range: &Range, + ) -> Self { + SumResult { + sum: &left.sum + &right.sum, + } + } + fn add(left: &mut Self, _left_range: &Range, right: &Self, _right_range: &Range) { left.sum += &right.sum }