tag_search_all

master
Avril 4 years ago
parent a9906fc1a5
commit 8b07260feb
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -8,13 +8,15 @@ use std::collections::{
}; };
use smallvec::SmallVec; use smallvec::SmallVec;
const STACK_CACHE_SIZE: usize = 8;
/// An iterator over entries in a store matching *any* tags /// An iterator over entries in a store matching *any* tags
#[derive(Debug)] #[derive(Debug)]
pub struct StoreSearchAnyIter<'a, T: ?Sized>(&'a Store, Option<Range<'a, String, ArenaIndex>>, VecDeque<&'a sha256::Sha256Hash>, PhantomData<T>); pub struct StoreSearchAnyIter<'a, T: ?Sized>(&'a Store, Option<Range<'a, String, ArenaIndex>>, VecDeque<&'a sha256::Sha256Hash>, PhantomData<T>);
/// An iterator over entries in a store matching *all* tags /// An iterator over entries in a store matching *all* tags
#[derive(Debug)] #[derive(Debug)]
pub struct StoreSearchAllIter<'a, T: ?Sized>(&'a Store, Option<Range<'a, String, ArenaIndex>>, VecDeque<&'a Entry>, SmallVec<[&'a T; 8]>); pub struct StoreSearchAllIter<'a, T: ?Sized>(&'a Store, Option<Range<'a, String, ArenaIndex>>, VecDeque<&'a Entry>, SmallVec<[&'a T; STACK_CACHE_SIZE]>);
// Searching by tags // Searching by tags
impl Store impl Store
@ -29,7 +31,7 @@ impl Store
pub fn tag_search_all<'a, T: ?Sized + Ord + 'a>(&'a self, tags: impl IntoIterator<Item= &'a T>) -> StoreSearchAllIter<'_, T> pub fn tag_search_all<'a, T: ?Sized + Ord + 'a>(&'a self, tags: impl IntoIterator<Item= &'a T>) -> StoreSearchAllIter<'_, T>
where String: Borrow<T> where String: Borrow<T>
{ {
let mut sorted: SmallVec<[_; 8]> = tags.into_iter().collect(); let mut sorted: SmallVec<[_; STACK_CACHE_SIZE]> = tags.into_iter().collect();
sorted.sort(); sorted.sort();
StoreSearchAllIter(self, Some(match (sorted.first(), sorted.last()) { StoreSearchAllIter(self, Some(match (sorted.first(), sorted.last()) {
(Some(&low), Some(&high)) => self.tags.range::<T, _>((std::ops::Bound::Included(low), std::ops::Bound::Included(high))), (Some(&low), Some(&high)) => self.tags.range::<T, _>((std::ops::Bound::Included(low), std::ops::Bound::Included(high))),
@ -45,7 +47,7 @@ impl Store
pub fn tag_search_any<'a, T: ?Sized + Ord + 'a>(&self, tags: impl IntoIterator<Item= &'a T>) -> StoreSearchAnyIter<'_, T> pub fn tag_search_any<'a, T: ?Sized + Ord + 'a>(&self, tags: impl IntoIterator<Item= &'a T>) -> StoreSearchAnyIter<'_, T>
where String: Borrow<T> where String: Borrow<T>
{ {
let mut sorted: SmallVec<[_; 8]> = tags.into_iter().collect(); let mut sorted: SmallVec<[_; STACK_CACHE_SIZE]> = tags.into_iter().collect();
sorted.sort(); sorted.sort();
StoreSearchAnyIter(self, Some(match (sorted.first(), sorted.last()) { StoreSearchAnyIter(self, Some(match (sorted.first(), sorted.last()) {
(Some(&low), Some(&high)) => self.tags.range::<T, _>((std::ops::Bound::Included(low), std::ops::Bound::Included(high))), (Some(&low), Some(&high)) => self.tags.range::<T, _>((std::ops::Bound::Included(low), std::ops::Bound::Included(high))),

Loading…
Cancel
Save