|
|
|
@ -8,13 +8,15 @@ use std::collections::{
|
|
|
|
|
};
|
|
|
|
|
use smallvec::SmallVec;
|
|
|
|
|
|
|
|
|
|
const STACK_CACHE_SIZE: usize = 8;
|
|
|
|
|
|
|
|
|
|
/// An iterator over entries in a store matching *any* tags
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
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
|
|
|
|
|
#[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
|
|
|
|
|
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>
|
|
|
|
|
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();
|
|
|
|
|
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))),
|
|
|
|
@ -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>
|
|
|
|
|
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();
|
|
|
|
|
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))),
|
|
|
|
|