diff --git a/src/directory/mod.rs b/src/directory/mod.rs index c4627b88b..e4e443760 100644 --- a/src/directory/mod.rs +++ b/src/directory/mod.rs @@ -12,6 +12,7 @@ mod managed_directory; mod ram_directory; mod read_only_source; mod shared_vec_slice; +mod static_dictionnary; /// Errors specific to the directory module. pub mod error; @@ -21,6 +22,7 @@ use std::io::{BufWriter, Seek, Write}; pub use self::directory::{Directory, DirectoryClone}; pub use self::ram_directory::RAMDirectory; pub use self::read_only_source::ReadOnlySource; +pub use self::static_dictionnary::StaticDirectory; #[cfg(feature = "mmap")] pub use self::mmap_directory::MmapDirectory; diff --git a/src/directory/read_only_source.rs b/src/directory/read_only_source.rs index 6ed2049e5..090b578ac 100644 --- a/src/directory/read_only_source.rs +++ b/src/directory/read_only_source.rs @@ -5,6 +5,9 @@ use fst::raw::MmapReadOnly; use stable_deref_trait::{CloneStableDeref, StableDeref}; use std::ops::Deref; + +const EMPTY_SLICE: [u8; 0] = []; + /// Read object that represents files in tantivy. /// /// These read objects are only in charge to deliver @@ -17,6 +20,8 @@ pub enum ReadOnlySource { Mmap(MmapReadOnly), /// Wrapping a `Vec` Anonymous(SharedVecSlice), + /// Wrapping a static slice + Static(&'static [u8]) } unsafe impl StableDeref for ReadOnlySource {} @@ -33,7 +38,7 @@ impl Deref for ReadOnlySource { impl ReadOnlySource { /// Creates an empty ReadOnlySource pub fn empty() -> ReadOnlySource { - ReadOnlySource::Anonymous(SharedVecSlice::empty()) + ReadOnlySource::Static(&EMPTY_SLICE) } /// Returns the data underlying the ReadOnlySource object. @@ -42,6 +47,7 @@ impl ReadOnlySource { #[cfg(feature = "mmap")] ReadOnlySource::Mmap(ref mmap_read_only) => mmap_read_only.as_slice(), ReadOnlySource::Anonymous(ref shared_vec) => shared_vec.as_slice(), + ReadOnlySource::Static(data) => data, } } @@ -79,6 +85,9 @@ impl ReadOnlySource { ReadOnlySource::Anonymous(ref shared_vec) => { ReadOnlySource::Anonymous(shared_vec.slice(from_offset, to_offset)) } + ReadOnlySource::Static(data) => { + ReadOnlySource::Static(&data[from_offset..to_offset]) + } } } @@ -118,3 +127,9 @@ impl From> for ReadOnlySource { ReadOnlySource::Anonymous(shared_data) } } + +impl From<&'static [u8]> for ReadOnlySource { + fn from(data: &'static [u8]) -> ReadOnlySource { + ReadOnlySource::Static(data) + } +} diff --git a/src/termdict/termdict.rs b/src/termdict/termdict.rs index 0f8a28231..34976411d 100644 --- a/src/termdict/termdict.rs +++ b/src/termdict/termdict.rs @@ -96,6 +96,9 @@ fn open_fst_index(source: ReadOnlySource) -> fst::Map { ReadOnlySource::Mmap(mmap_readonly) => { Fst::from_mmap(mmap_readonly).expect("FST data is corrupted") } + ReadOnlySource::Static(data) => { + Fst::from_static_slice(data).expect("FST data is corrupted") + } }; fst::Map::from(fst) }