diff options
| author | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2018-11-01 21:55:00 +0100 |
|---|---|---|
| committer | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2018-11-01 21:55:00 +0100 |
| commit | 7d2be237297c16628cb3d58774e808cac9c92fc1 (patch) | |
| tree | 55cb240828bac9968f94166e740b567b66928e3b /src/filenames.rs | |
| parent | 2932d67d87fa2ff41fcdf46ce269ba5b49294930 (diff) | |
| download | mail-7d2be237297c16628cb3d58774e808cac9c92fc1.tar.gz | |
improve lifetime management with supercow
Diffstat (limited to 'src/filenames.rs')
| -rw-r--r-- | src/filenames.rs | 53 |
1 files changed, 24 insertions, 29 deletions
diff --git a/src/filenames.rs b/src/filenames.rs index 5083742..ae90280 100644 --- a/src/filenames.rs +++ b/src/filenames.rs @@ -1,45 +1,43 @@ -use std::ops::Drop; +use std::ffi::CStr; use std::iter::Iterator; -use std::marker::PhantomData; +use std::ops::Drop; use std::path::PathBuf; -use std::ffi::CStr; -use utils::FromPtr; -use Database; +use supercow::Phantomcow; + use ffi; -pub trait FilenamesOwner{} +pub trait FilenamesOwner {} #[derive(Debug)] pub(crate) struct FilenamesPtr { - pub ptr: *mut ffi::notmuch_filenames_t + pub ptr: *mut ffi::notmuch_filenames_t, } impl Drop for FilenamesPtr { fn drop(self: &mut Self) { - let valid = unsafe { - ffi::notmuch_filenames_valid(self.ptr) - }; + let valid = unsafe { ffi::notmuch_filenames_valid(self.ptr) }; if valid != 0 { - unsafe { - ffi::notmuch_filenames_destroy(self.ptr) - }; + unsafe { ffi::notmuch_filenames_destroy(self.ptr) }; } } } - + #[derive(Debug)] -pub struct Filenames<'o, Owner: FilenamesOwner + 'o>{ +pub struct Filenames<'o, Owner: FilenamesOwner + 'o> { pub(crate) handle: FilenamesPtr, - pub(crate) phantom: PhantomData<&'o Owner> + pub(crate) marker: Phantomcow<'o, Owner>, } -impl<'o, Owner: FilenamesOwner + 'o> FromPtr<*mut ffi::notmuch_filenames_t> for Filenames<'o, Owner> { - fn from_ptr(ptr: *mut ffi::notmuch_filenames_t) -> Filenames<'o, Owner> { - Filenames{ - handle: FilenamesPtr{ptr}, - phantom: PhantomData +impl<'o, Owner: FilenamesOwner + 'o> Filenames<'o, Owner> { + pub fn from_ptr<O: Into<Phantomcow<'o, Owner>>>( + ptr: *mut ffi::notmuch_filenames_t, + owner: O, + ) -> Filenames<'o, Owner> { + Filenames { + handle: FilenamesPtr { ptr }, + marker: owner.into(), } } } @@ -48,13 +46,10 @@ impl<'o, Owner: FilenamesOwner + 'o> Iterator for Filenames<'o, Owner> { type Item = PathBuf; fn next(self: &mut Self) -> Option<Self::Item> { + let valid = unsafe { ffi::notmuch_filenames_valid(self.handle.ptr) }; - let valid = unsafe { - ffi::notmuch_filenames_valid(self.handle.ptr) - }; - - if valid == 0{ - return None + if valid == 0 { + return None; } let ctag = unsafe { @@ -67,5 +62,5 @@ impl<'o, Owner: FilenamesOwner + 'o> Iterator for Filenames<'o, Owner> { } } -unsafe impl<'o, Owner: FilenamesOwner + 'o> Send for Filenames<'o, Owner>{} -unsafe impl<'o, Owner: FilenamesOwner + 'o> Sync for Filenames<'o, Owner>{} +unsafe impl<'o, Owner: FilenamesOwner + 'o> Send for Filenames<'o, Owner> {} +unsafe impl<'o, Owner: FilenamesOwner + 'o> Sync for Filenames<'o, Owner> {} |
