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/directory.rs | |
| parent | 2932d67d87fa2ff41fcdf46ce269ba5b49294930 (diff) | |
| download | mail-7d2be237297c16628cb3d58774e808cac9c92fc1.tar.gz | |
improve lifetime management with supercow
Diffstat (limited to 'src/directory.rs')
| -rw-r--r-- | src/directory.rs | 62 |
1 files changed, 23 insertions, 39 deletions
diff --git a/src/directory.rs b/src/directory.rs index ce219f5..9bdae2d 100644 --- a/src/directory.rs +++ b/src/directory.rs @@ -1,64 +1,48 @@ use std::ops::Drop; -use std::marker::PhantomData; - -use utils::FromPtr; +use supercow::Phantomcow; +use ffi; use Database; use Filenames; -use filenames::{FilenamesPtr, FilenamesOwner}; - -use ffi; +use FilenamesOwner; #[derive(Debug)] pub(crate) struct DirectoryPtr { - pub ptr: *mut ffi::notmuch_directory_t + pub ptr: *mut ffi::notmuch_directory_t, } impl Drop for DirectoryPtr { fn drop(&mut self) { - unsafe { - ffi::notmuch_directory_destroy(self.ptr) - }; - } -} - -impl DirectoryPtr { - pub fn child_directories(self: &Self) -> FilenamesPtr{ - FilenamesPtr{ - ptr: unsafe { - ffi::notmuch_directory_get_child_directories(self.ptr) - } - } + unsafe { ffi::notmuch_directory_destroy(self.ptr) }; } } - - #[derive(Debug)] -pub struct Directory<'d>{ +pub struct Directory<'d> { handle: DirectoryPtr, - phantom: PhantomData<&'d Database>, + marker: Phantomcow<'d, Database>, } -impl<'d> FilenamesOwner for Directory<'d>{} +impl<'d> FilenamesOwner for Directory<'d> {} -impl<'d> Directory<'d>{ - pub fn child_directories(self: &'d Self) -> Filenames<Self>{ - Filenames{ - handle: self.handle.child_directories(), - phantom: PhantomData +impl<'d> Directory<'d> { + pub fn from_ptr<O: Into<Phantomcow<'d, Database>>>( + ptr: *mut ffi::notmuch_directory_t, + owner: O, + ) -> Directory<'d> { + Directory { + handle: DirectoryPtr { ptr }, + marker: owner.into(), } } -} -impl<'d> FromPtr<*mut ffi::notmuch_directory_t> for Directory<'d> { - fn from_ptr(ptr: *mut ffi::notmuch_directory_t) -> Directory<'d> { - Directory{ - handle: DirectoryPtr{ptr}, - phantom: PhantomData - } + pub fn child_directories(&self) -> Filenames<Self> { + Filenames::from_ptr( + unsafe { ffi::notmuch_directory_get_child_directories(self.handle.ptr) }, + self, + ) } } -unsafe impl<'d> Send for Directory<'d>{} -unsafe impl<'d> Sync for Directory<'d>{} +unsafe impl<'d> Send for Directory<'d> {} +unsafe impl<'d> Sync for Directory<'d> {} |
