blob: ef04d2f0c385737febd64e846890a8b1de0b55d7 [file] [log] [blame]
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -07001#[cfg(feature = "with-serde")]
2use serde;
3
4use std::default::Default;
5use std::fmt;
6use std::hash::Hash;
7use std::hash::Hasher;
8use std::mem;
9use std::option;
10
Haibo Huangd32e6ee2020-08-12 13:52:04 -070011use crate::clear::Clear;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -070012
13/// Like `Option<T>`, but keeps the actual element on `clear`.
14pub struct SingularField<T> {
15 value: T,
16 set: bool,
17}
18
19/// Like `Option<Box<T>>`, but keeps the actual element on `clear`.
20pub struct SingularPtrField<T> {
21 value: Option<Box<T>>,
22 set: bool,
23}
24
25impl<T> SingularField<T> {
26 /// Construct this object from given value.
27 #[inline]
28 pub fn some(value: T) -> SingularField<T> {
29 SingularField {
30 value: value,
31 set: true,
32 }
33 }
34
35 /// True iff this object contains data.
36 #[inline]
37 pub fn is_some(&self) -> bool {
38 self.set
39 }
40
41 /// True iff this object contains no data.
42 #[inline]
43 pub fn is_none(&self) -> bool {
44 !self.is_some()
45 }
46
47 /// Convert this object into `Option`.
48 #[inline]
49 pub fn into_option(self) -> Option<T> {
50 if self.set {
51 Some(self.value)
52 } else {
53 None
54 }
55 }
56
57 /// View data as `Option`.
58 #[inline]
59 pub fn as_ref<'a>(&'a self) -> Option<&'a T> {
60 if self.set {
61 Some(&self.value)
62 } else {
63 None
64 }
65 }
66
67 /// View data as mutable `Option`.
68 #[inline]
69 pub fn as_mut<'a>(&'a mut self) -> Option<&'a mut T> {
70 if self.set {
71 Some(&mut self.value)
72 } else {
73 None
74 }
75 }
76
77 /// Unwrap data as reference.
78 #[inline]
79 pub fn unwrap_ref<'a>(&'a self) -> &'a T {
80 self.as_ref().unwrap()
81 }
82
83 /// Unwrap data as mutable reference.
84 #[inline]
85 pub fn unwrap_mut_ref<'a>(&'a mut self) -> &'a mut T {
86 self.as_mut().unwrap()
87 }
88
89 /// Unwrap data, panic if not set.
90 #[inline]
91 pub fn unwrap(self) -> T {
92 if self.set {
93 self.value
94 } else {
95 panic!();
96 }
97 }
98
99 /// Unwrap data or return given default value.
100 #[inline]
101 pub fn unwrap_or(self, def: T) -> T {
102 if self.set {
103 self.value
104 } else {
105 def
106 }
107 }
108
109 /// Unwrap data or return given default value.
110 #[inline]
111 pub fn unwrap_or_else<F>(self, f: F) -> T
112 where
113 F: FnOnce() -> T,
114 {
115 if self.set {
116 self.value
117 } else {
118 f()
119 }
120 }
121
122 /// Apply a function to contained element and store result in new `SingularPtrField`.
123 #[inline]
124 pub fn map<U, F>(self, f: F) -> SingularPtrField<U>
125 where
126 F: FnOnce(T) -> U,
127 {
128 SingularPtrField::from_option(self.into_option().map(f))
129 }
130
131 /// View as iterator over references.
132 #[inline]
133 pub fn iter<'a>(&'a self) -> option::IntoIter<&'a T> {
134 self.as_ref().into_iter()
135 }
136
137 /// View as iterator over mutable references.
138 #[inline]
139 pub fn mut_iter<'a>(&'a mut self) -> option::IntoIter<&'a mut T> {
140 self.as_mut().into_iter()
141 }
142
143 /// Clear this object.
144 /// Note, contained object destructor is not called, so allocated memory could be reused.
145 #[inline]
146 pub fn clear(&mut self) {
147 self.set = false;
148 }
149}
150
151impl<T: Default> SingularField<T> {
152 /// Construct a `SingularField` with no data.
153 #[inline]
154 pub fn none() -> SingularField<T> {
155 SingularField {
156 value: Default::default(),
157 set: false,
158 }
159 }
160
161 /// Construct `SingularField` from `Option`.
162 #[inline]
163 pub fn from_option(option: Option<T>) -> SingularField<T> {
164 match option {
165 Some(x) => SingularField::some(x),
166 None => SingularField::none(),
167 }
168 }
169
170 /// Return data as option, clear this object.
171 #[inline]
172 pub fn take(&mut self) -> Option<T> {
173 if self.set {
174 self.set = false;
175 Some(mem::replace(&mut self.value, Default::default()))
176 } else {
177 None
178 }
179 }
180}
181
182impl<T> SingularPtrField<T> {
183 /// Construct `SingularPtrField` from given object.
184 #[inline]
185 pub fn some(value: T) -> SingularPtrField<T> {
186 SingularPtrField {
187 value: Some(Box::new(value)),
188 set: true,
189 }
190 }
191
192 /// Construct an empty `SingularPtrField`.
193 #[inline]
194 pub fn none() -> SingularPtrField<T> {
195 SingularPtrField {
196 value: None,
197 set: false,
198 }
199 }
200
201 /// Construct `SingularPtrField` from optional.
202 #[inline]
203 pub fn from_option(option: Option<T>) -> SingularPtrField<T> {
204 match option {
205 Some(x) => SingularPtrField::some(x),
206 None => SingularPtrField::none(),
207 }
208 }
209
210 /// True iff this object contains data.
211 #[inline]
212 pub fn is_some(&self) -> bool {
213 self.set
214 }
215
216 /// True iff this object contains no data.
217 #[inline]
218 pub fn is_none(&self) -> bool {
219 !self.is_some()
220 }
221
222 /// Convert into `Option<T>`.
223 #[inline]
224 pub fn into_option(self) -> Option<T> {
225 if self.set {
226 Some(*self.value.unwrap())
227 } else {
228 None
229 }
230 }
231
232 /// View data as reference option.
233 #[inline]
234 pub fn as_ref<'a>(&'a self) -> Option<&'a T> {
235 if self.set {
236 Some(&**self.value.as_ref().unwrap())
237 } else {
238 None
239 }
240 }
241
242 /// View data as mutable reference option.
243 #[inline]
244 pub fn as_mut<'a>(&'a mut self) -> Option<&'a mut T> {
245 if self.set {
246 Some(&mut **self.value.as_mut().unwrap())
247 } else {
248 None
249 }
250 }
251
252 /// Get data as reference.
253 /// Panics if empty.
254 #[inline]
255 pub fn get_ref<'a>(&'a self) -> &'a T {
256 self.as_ref().unwrap()
257 }
258
259 /// Get data as mutable reference.
260 /// Panics if empty.
261 #[inline]
262 pub fn get_mut_ref<'a>(&'a mut self) -> &'a mut T {
263 self.as_mut().unwrap()
264 }
265
266 /// Take the data.
267 /// Panics if empty
268 #[inline]
269 pub fn unwrap(self) -> T {
270 if self.set {
271 *self.value.unwrap()
272 } else {
273 panic!();
274 }
275 }
276
277 /// Take the data or return supplied default element if empty.
278 #[inline]
279 pub fn unwrap_or(self, def: T) -> T {
280 if self.set {
281 *self.value.unwrap()
282 } else {
283 def
284 }
285 }
286
287 /// Take the data or return supplied default element if empty.
288 #[inline]
289 pub fn unwrap_or_else<F>(self, f: F) -> T
290 where
291 F: FnOnce() -> T,
292 {
293 if self.set {
294 *self.value.unwrap()
295 } else {
296 f()
297 }
298 }
299
300 /// Apply given function to contained data to construct another `SingularPtrField`.
301 /// Returns empty `SingularPtrField` if this object is empty.
302 #[inline]
303 pub fn map<U, F>(self, f: F) -> SingularPtrField<U>
304 where
305 F: FnOnce(T) -> U,
306 {
307 SingularPtrField::from_option(self.into_option().map(f))
308 }
309
310 /// View data as iterator.
311 #[inline]
312 pub fn iter<'a>(&'a self) -> option::IntoIter<&'a T> {
313 self.as_ref().into_iter()
314 }
315
316 /// View data as mutable iterator.
317 #[inline]
318 pub fn mut_iter<'a>(&'a mut self) -> option::IntoIter<&'a mut T> {
319 self.as_mut().into_iter()
320 }
321
322 /// Take data as option, leaving this object empty.
323 #[inline]
324 pub fn take(&mut self) -> Option<T> {
325 if self.set {
326 self.set = false;
327 Some(*self.value.take().unwrap())
328 } else {
329 None
330 }
331 }
332
333 /// Clear this object, but do not call destructor of underlying data.
334 #[inline]
335 pub fn clear(&mut self) {
336 self.set = false;
337 }
338}
339
340impl<T: Default + Clear> SingularField<T> {
341 /// Get contained data, consume self. Return default value for type if this is empty.
342 #[inline]
343 pub fn unwrap_or_default(mut self) -> T {
344 self.value.clear();
345 self.value
346 }
347
348 /// Initialize this object with default value.
349 /// This operation can be more efficient then construction of clear element,
350 /// because it may reuse previously contained object.
351 #[inline]
352 pub fn set_default<'a>(&'a mut self) -> &'a mut T {
353 self.set = true;
354 self.value.clear();
355 &mut self.value
356 }
357}
358
359impl<T: Default + Clear> SingularPtrField<T> {
360 /// Get contained data, consume self. Return default value for type if this is empty.
361 #[inline]
362 pub fn unwrap_or_default(mut self) -> T {
363 if self.set {
364 self.unwrap()
365 } else if self.value.is_some() {
366 self.value.clear();
367 *self.value.unwrap()
368 } else {
369 Default::default()
370 }
371 }
372
373 /// Initialize this object with default value.
374 /// This operation can be more efficient then construction of clear element,
375 /// because it may reuse previously contained object.
376 #[inline]
377 pub fn set_default<'a>(&'a mut self) -> &'a mut T {
378 self.set = true;
379 if self.value.is_some() {
380 self.value.as_mut().unwrap().clear();
381 } else {
382 self.value = Some(Default::default());
383 }
384 self.as_mut().unwrap()
385 }
386}
387
388impl<T: Default> Default for SingularField<T> {
389 #[inline]
390 fn default() -> SingularField<T> {
391 SingularField::none()
392 }
393}
394
395impl<T> Default for SingularPtrField<T> {
396 #[inline]
397 fn default() -> SingularPtrField<T> {
398 SingularPtrField::none()
399 }
400}
401
402impl<T: Default> From<Option<T>> for SingularField<T> {
403 fn from(o: Option<T>) -> Self {
404 SingularField::from_option(o)
405 }
406}
407
408impl<T> From<Option<T>> for SingularPtrField<T> {
409 fn from(o: Option<T>) -> Self {
410 SingularPtrField::from_option(o)
411 }
412}
413
414impl<T: Clone + Default> Clone for SingularField<T> {
415 #[inline]
416 fn clone(&self) -> SingularField<T> {
417 if self.set {
418 SingularField::some(self.value.clone())
419 } else {
420 SingularField::none()
421 }
422 }
423}
424
425impl<T: Clone> Clone for SingularPtrField<T> {
426 #[inline]
427 fn clone(&self) -> SingularPtrField<T> {
428 if self.set {
429 SingularPtrField::some(self.as_ref().unwrap().clone())
430 } else {
431 SingularPtrField::none()
432 }
433 }
434}
435
436impl<T: fmt::Debug> fmt::Debug for SingularField<T> {
437 #[inline]
438 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
439 if self.is_some() {
440 write!(f, "Some({:?})", *self.as_ref().unwrap())
441 } else {
442 write!(f, "None")
443 }
444 }
445}
446
447impl<T: fmt::Debug> fmt::Debug for SingularPtrField<T> {
448 #[inline]
449 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
450 if self.is_some() {
451 write!(f, "Some({:?})", *self.as_ref().unwrap())
452 } else {
453 write!(f, "None")
454 }
455 }
456}
457
458impl<T: PartialEq> PartialEq for SingularField<T> {
459 #[inline]
460 fn eq(&self, other: &SingularField<T>) -> bool {
461 self.as_ref() == other.as_ref()
462 }
463}
464
465impl<T: Eq> Eq for SingularField<T> {}
466
467impl<T: PartialEq> PartialEq for SingularPtrField<T> {
468 #[inline]
469 fn eq(&self, other: &SingularPtrField<T>) -> bool {
470 self.as_ref() == other.as_ref()
471 }
472}
473
474impl<T: Eq> Eq for SingularPtrField<T> {}
475
476impl<T: Hash> Hash for SingularField<T> {
477 fn hash<H: Hasher>(&self, state: &mut H) {
478 self.as_ref().hash(state);
479 }
480}
481
482impl<T: Hash> Hash for SingularPtrField<T> {
483 fn hash<H: Hasher>(&self, state: &mut H) {
484 self.as_ref().hash(state);
485 }
486}
487
488impl<'a, T> IntoIterator for &'a SingularField<T> {
489 type Item = &'a T;
490 type IntoIter = option::IntoIter<&'a T>;
491
492 fn into_iter(self) -> option::IntoIter<&'a T> {
493 self.iter()
494 }
495}
496
497impl<'a, T> IntoIterator for &'a SingularPtrField<T> {
498 type Item = &'a T;
499 type IntoIter = option::IntoIter<&'a T>;
500
501 fn into_iter(self) -> option::IntoIter<&'a T> {
502 self.iter()
503 }
504}
505
506#[cfg(feature = "with-serde")]
507impl<T: serde::Serialize> serde::Serialize for SingularPtrField<T> {
508 fn serialize<S>(
509 &self,
510 serializer: S,
511 ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error>
512 where
513 S: serde::Serializer,
514 {
515 self.as_ref().serialize(serializer)
516 }
517}
518
519#[cfg(feature = "with-serde")]
520impl<T: serde::Serialize> serde::Serialize for SingularField<T> {
521 fn serialize<S>(
522 &self,
523 serializer: S,
524 ) -> Result<<S as serde::Serializer>::Ok, <S as serde::Serializer>::Error>
525 where
526 S: serde::Serializer,
527 {
528 self.as_ref().serialize(serializer)
529 }
530}
531
532#[cfg(feature = "with-serde")]
533impl<'de, T: serde::Deserialize<'de>> serde::Deserialize<'de> for SingularPtrField<T> {
534 fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error>
535 where
536 D: serde::Deserializer<'de>,
537 {
538 Option::deserialize(deserializer).map(SingularPtrField::from_option)
539 }
540}
541
542#[cfg(feature = "with-serde")]
543impl<'de, T: serde::Deserialize<'de> + Default> serde::Deserialize<'de> for SingularField<T> {
544 fn deserialize<D>(deserializer: D) -> Result<Self, <D as serde::Deserializer<'de>>::Error>
545 where
546 D: serde::Deserializer<'de>,
547 {
548 Option::deserialize(deserializer).map(SingularField::from_option)
549 }
550}
551
552#[cfg(test)]
553mod test {
554 use super::SingularField;
Haibo Huangd32e6ee2020-08-12 13:52:04 -0700555 use crate::clear::Clear;
Chih-Hung Hsiehcfc3a232020-06-10 20:13:05 -0700556
557 #[test]
558 fn test_set_default_clears() {
559 #[derive(Default)]
560 struct Foo {
561 b: isize,
562 }
563
564 impl Clear for Foo {
565 fn clear(&mut self) {
566 self.b = 0;
567 }
568 }
569
570 let mut x = SingularField::some(Foo { b: 10 });
571 x.clear();
572 x.set_default();
573 assert_eq!(0, x.as_ref().unwrap().b);
574
575 x.as_mut().unwrap().b = 11;
576 // without clear
577 x.set_default();
578 assert_eq!(0, x.as_ref().unwrap().b);
579 }
580}