qiniu_upload_manager/data_partition_provider/
multiply.rs1use super::{DataPartitionProvider, DataPartitionProviderFeedback, PartSize};
2use std::num::NonZeroU64;
3
4#[derive(Debug, Clone, Copy)]
8pub struct MultiplyDataPartitionProvider<P: ?Sized> {
9 multiply: NonZeroU64,
10 base: P,
11}
12
13impl<P: DataPartitionProvider> MultiplyDataPartitionProvider<P> {
14 #[inline]
18 pub fn new(base: P, multiply: u64) -> Option<Self> {
19 NonZeroU64::new(multiply).map(|multiply| Self::new_with_non_zero_multiply(base, multiply))
20 }
21
22 #[inline]
26 pub fn new_with_non_zero_multiply(base: P, multiply: NonZeroU64) -> Self {
27 Self { base, multiply }
28 }
29}
30
31impl<P: DataPartitionProvider + Default> Default for MultiplyDataPartitionProvider<P> {
32 #[inline]
33 fn default() -> Self {
34 Self {
35 base: Default::default(),
36 multiply: NonZeroU64::new(1 << 20).unwrap(),
37 }
38 }
39}
40
41impl<P> MultiplyDataPartitionProvider<P> {
42 #[inline]
44 pub const fn multiply(&self) -> NonZeroU64 {
45 self.multiply
46 }
47}
48
49impl<P: DataPartitionProvider + Clone> DataPartitionProvider for MultiplyDataPartitionProvider<P> {
50 #[inline]
51 fn part_size(&self) -> PartSize {
52 let base_partition = self.base.part_size().as_non_zero_u64();
53 let multiply = self.multiply.get();
54 let partition = base_partition.max(self.multiply).get() / multiply * multiply;
55 NonZeroU64::new(partition).unwrap().into()
56 }
57
58 #[inline]
59 fn feedback(&self, feedback: DataPartitionProviderFeedback<'_>) {
60 self.base.feedback(feedback)
61 }
62}