1use crate::io_buffers::{IoVector, IoVectorMut};
44use crate::storage::drivers::CommonStorageHelper;
45use crate::storage::PreallocateMode;
46use crate::{Storage, StorageCreateOptions, StorageOpenOptions};
47use std::fmt::{self, Debug, Display, Formatter};
48use std::io;
49use std::ops::{Deref, DerefMut};
50use std::path::{Path, PathBuf};
51
52#[derive(Debug)]
59pub struct Annotated<Tag: Debug + Default + Display + Send + Sync, S: Storage> {
60 inner: S,
62
63 tag: Tag,
65}
66
67impl<T: Debug + Default + Display + Send + Sync, S: Storage> Annotated<T, S> {
68 pub fn new(storage: S, tag: T) -> Self {
70 Annotated {
71 inner: storage,
72 tag,
73 }
74 }
75
76 pub fn tag(&self) -> &T {
78 &self.tag
79 }
80
81 pub fn tag_mut(&mut self) -> &mut T {
83 &mut self.tag
84 }
85}
86
87impl<T: Debug + Default + Display + Send + Sync, S: Storage> From<S> for Annotated<T, S> {
88 fn from(storage: S) -> Self {
89 Self::new(storage, T::default())
90 }
91}
92
93impl<T: Debug + Default + Display + Send + Sync, S: Storage> Storage for Annotated<T, S> {
94 async fn open(opts: StorageOpenOptions) -> io::Result<Self> {
95 Ok(S::open(opts).await?.into())
96 }
97
98 #[cfg(feature = "sync-wrappers")]
99 fn open_sync(opts: StorageOpenOptions) -> io::Result<Self> {
100 Ok(S::open_sync(opts)?.into())
101 }
102
103 async fn create_open(opts: StorageCreateOptions) -> io::Result<Self> {
104 Ok(S::create_open(opts).await?.into())
105 }
106
107 fn mem_align(&self) -> usize {
108 self.inner.mem_align()
109 }
110
111 fn req_align(&self) -> usize {
112 self.inner.req_align()
113 }
114
115 fn zero_align(&self) -> usize {
116 self.inner.zero_align()
117 }
118
119 fn discard_align(&self) -> usize {
120 self.inner.discard_align()
121 }
122
123 fn size(&self) -> io::Result<u64> {
124 self.inner.size()
125 }
126
127 fn resolve_relative_path<P: AsRef<Path>>(&self, relative: P) -> io::Result<PathBuf> {
128 self.inner.resolve_relative_path(relative)
129 }
130
131 fn get_filename(&self) -> Option<PathBuf> {
132 self.inner.get_filename()
133 }
134
135 async unsafe fn pure_readv(&self, bufv: IoVectorMut<'_>, offset: u64) -> io::Result<()> {
136 unsafe { self.inner.pure_readv(bufv, offset) }.await
138 }
139
140 async unsafe fn pure_writev(&self, bufv: IoVector<'_>, offset: u64) -> io::Result<()> {
141 unsafe { self.inner.pure_writev(bufv, offset) }.await
143 }
144
145 async unsafe fn pure_write_zeroes(&self, offset: u64, length: u64) -> io::Result<()> {
146 unsafe { self.inner.pure_write_zeroes(offset, length) }.await
148 }
149
150 async unsafe fn pure_write_allocated_zeroes(&self, offset: u64, length: u64) -> io::Result<()> {
151 unsafe { self.inner.pure_write_allocated_zeroes(offset, length) }.await
153 }
154
155 async unsafe fn pure_discard(&self, offset: u64, length: u64) -> io::Result<()> {
156 unsafe { self.inner.pure_discard(offset, length) }.await
158 }
159
160 async fn flush(&self) -> io::Result<()> {
161 self.inner.flush().await
162 }
163
164 async fn sync(&self) -> io::Result<()> {
165 self.inner.sync().await
166 }
167
168 async unsafe fn invalidate_cache(&self) -> io::Result<()> {
169 unsafe { self.inner.invalidate_cache() }.await
171 }
172
173 fn get_storage_helper(&self) -> &CommonStorageHelper {
174 self.inner.get_storage_helper()
176 }
177
178 async fn resize(&self, new_size: u64, prealloc_mode: PreallocateMode) -> io::Result<()> {
179 self.inner.resize(new_size, prealloc_mode).await
180 }
181}
182
183impl<T: Debug + Default + Display + Send + Sync, S: Storage> Deref for Annotated<T, S> {
184 type Target = S;
185
186 fn deref(&self) -> &S {
187 &self.inner
188 }
189}
190
191impl<T: Debug + Default + Display + Send + Sync, S: Storage> DerefMut for Annotated<T, S> {
192 fn deref_mut(&mut self) -> &mut S {
193 &mut self.inner
194 }
195}
196
197impl<T: Debug + Default + Display + Send + Sync, S: Storage> Display for Annotated<T, S> {
198 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
199 write!(f, "annotated({})[{}]", self.tag, self.inner)
200 }
201}