1use crate::weight::{WeightScale, ZeroWeightScale};
2use std::collections::hash_map::RandomState;
3use std::hash::BuildHasher;
4use std::marker::PhantomData;
5use std::num::NonZeroUsize;
6
7/// A configuration structure used to create an LRU cache.
8pub struct CLruCacheConfig<K, V, S = RandomState, W = ZeroWeightScale> {
9 pub(crate) capacity: NonZeroUsize,
10 pub(crate) hash_builder: S,
11 pub(crate) reserve: Option<usize>,
12 pub(crate) scale: W,
13 _marker: PhantomData<(K, V)>,
14}
15
16impl<K, V> CLruCacheConfig<K, V> {
17 /// Creates a new configuration that will create an LRU cache
18 /// that will hold at most `capacity` elements and default parameters.
19 pub fn new(capacity: NonZeroUsize) -> Self {
20 Self {
21 capacity,
22 hash_builder: RandomState::default(),
23 reserve: None,
24 scale: ZeroWeightScale,
25 _marker: PhantomData,
26 }
27 }
28}
29
30impl<K, V, S: BuildHasher, W: WeightScale<K, V>> CLruCacheConfig<K, V, S, W> {
31 /// Configure the provided hash builder.
32 pub fn with_hasher<O: BuildHasher>(self, hash_builder: O) -> CLruCacheConfig<K, V, O, W> {
33 let Self {
34 capacity,
35 reserve,
36 scale,
37 _marker,
38 ..
39 } = self;
40 CLruCacheConfig {
41 capacity,
42 hash_builder,
43 reserve,
44 scale,
45 _marker,
46 }
47 }
48
49 /// Configure the amount of pre-allocated memory in order to hold at least `reserve` elements
50 /// without reallocating.
51 pub fn with_memory(mut self, reserve: usize) -> Self {
52 self.reserve = Some(reserve);
53 self
54 }
55
56 /// Configure the provided scale.
57 pub fn with_scale<O: WeightScale<K, V>>(self, scale: O) -> CLruCacheConfig<K, V, S, O> {
58 let Self {
59 capacity,
60 hash_builder,
61 reserve,
62 ..
63 } = self;
64 CLruCacheConfig {
65 capacity,
66 hash_builder,
67 reserve,
68 scale,
69 _marker: PhantomData,
70 }
71 }
72}
73