uv_resolver/resolver/
index.rs

1use std::hash::BuildHasherDefault;
2use std::sync::Arc;
3
4use rustc_hash::FxHasher;
5use uv_distribution_types::{IndexUrl, VersionId};
6use uv_normalize::PackageName;
7use uv_once_map::OnceMap;
8
9use crate::resolver::provider::{MetadataResponse, VersionsResponse};
10
11/// In-memory index of package metadata.
12#[derive(Default, Clone)]
13pub struct InMemoryIndex(Arc<SharedInMemoryIndex>);
14
15#[derive(Default)]
16struct SharedInMemoryIndex {
17    /// A map from package name to the metadata for that package and the index where the metadata
18    /// came from.
19    implicit: FxOnceMap<PackageName, Arc<VersionsResponse>>,
20
21    explicit: FxOnceMap<(PackageName, IndexUrl), Arc<VersionsResponse>>,
22
23    /// A map from package ID to metadata for that distribution.
24    distributions: FxOnceMap<VersionId, Arc<MetadataResponse>>,
25}
26
27pub(crate) type FxOnceMap<K, V> = OnceMap<K, V, BuildHasherDefault<FxHasher>>;
28
29impl InMemoryIndex {
30    /// Returns a reference to the package metadata map.
31    pub fn implicit(&self) -> &FxOnceMap<PackageName, Arc<VersionsResponse>> {
32        &self.0.implicit
33    }
34
35    /// Returns a reference to the package metadata map.
36    pub fn explicit(&self) -> &FxOnceMap<(PackageName, IndexUrl), Arc<VersionsResponse>> {
37        &self.0.explicit
38    }
39
40    /// Returns a reference to the distribution metadata map.
41    pub fn distributions(&self) -> &FxOnceMap<VersionId, Arc<MetadataResponse>> {
42        &self.0.distributions
43    }
44}